Git commit 取り消し完全ガイド – 状況別の正しい戻し方

git

誰もが一度は経験する、Gitでのミス。

「パスワードをコミットしてしまった…」 「コミットメッセージを間違えた…」 「まだ完成してないのにコミットしちゃった…」 「違うブランチにコミットしてしまった…」

大丈夫です。Gitには、あらゆる「やり直し」の方法が用意されています。

この記事では、コミットの取り消し方法を状況別に分かりやすく解説します。「どのコマンドを使えばいいか」が一目で分かるフローチャートも用意しました。

重要な約束:この記事を読めば、データを失うことなく、安全にコミットを取り消せるようになります。


スポンサーリンク
  1. まず理解しよう:Gitの3つのエリア
    1. Gitの基本構造
  2. 状況別フローチャート:どのコマンドを使うべき?
  3. ケース1:直前のコミットメッセージを修正する
    1. 最も簡単なケース:メッセージの誤字を直す
    2. エディタでじっくり編集する
  4. ケース2:直前のコミットにファイルを追加・修正
    1. ファイルを追加し忘れた場合
    2. コミット内容を修正したい場合
  5. ケース3:コミットを取り消す(3つのreset)
    1. git reset の3つのオプション
    2. –soft:コミットだけ取り消す
    3. –mixed(デフォルト):コミットとaddを取り消す
    4. –hard:完全に取り消す(危険!)
  6. ケース4:複数のコミットを取り消す
    1. 特定のコミットまで戻る
    2. 対話的にコミットを整理する(rebase -i)
  7. ケース5:プッシュ済みのコミットを取り消す
    1. 方法1:git revert(推奨)
    2. 方法2:force push(危険!)
  8. ケース6:特定のファイルだけ元に戻す
    1. 作業中のファイルを前の状態に戻す
    2. 特定のコミットからファイルを復元
  9. よくある失敗と対処法
    1. 失敗1:間違えてreset –hardしてしまった
    2. 失敗2:違うブランチにコミットした
    3. 失敗3:マージコミットを取り消したい
  10. 安全に作業するためのベストプラクティス
    1. 1. 作業前の確認コマンド
    2. 2. バックアップブランチの作成
    3. 3. エイリアスの設定
    4. 4. コミット前のチェックリスト
  11. 状況別クイックリファレンス
    1. 💡 コミットメッセージを変更
    2. 💡 ファイルを追加し忘れた
    3. 💡 直前のコミットを取り消す(内容は残す)
    4. 💡 直前のコミットを取り消す(addも取り消す)
    5. 💡 直前のコミットを完全に削除
    6. 💡 プッシュ済みを安全に取り消す
    7. 💡 特定のファイルだけ戻す
  12. トラブルシューティング Q&A
    1. Q1: reset と revert の使い分けは?
    2. Q2: どこまで戻せますか?
    3. Q3: コンフリクトが発生したら?
    4. Q4: 間違えて force push してしまった
    5. Q5: stashとresetの違いは?
  13. チートシート:印刷して手元に置こう
  14. まとめ:恐れずにGitを使いこなそう

まず理解しよう:Gitの3つのエリア

Gitの基本構造

コミットの取り消しを理解するには、Gitの3つのエリアを知ることが大切です。

作業ディレクトリ → ステージングエリア → リポジトリ
(Working Directory) → (Staging Area) → (Repository)
      ↑                    ↑                ↑
   現在の作業場所      git addした場所   git commitした場所

各エリアの役割:

  1. 作業ディレクトリ(Working Directory)
    • 実際にファイルを編集する場所
    • あなたが今見ているファイル
  2. ステージングエリア(Staging Area / Index)
    • コミット予定のファイルを置く場所
    • git addしたファイルが入る
  3. リポジトリ(Repository)
    • コミット履歴が保存される場所
    • git commitしたデータが入る

状況別フローチャート:どのコマンドを使うべき?

質問:どんな状況ですか?
│
├─ 直前のコミットを修正したい
│  ├─ コミットメッセージだけ変更 → git commit --amend
│  └─ ファイルも修正 → git add → git commit --amend
│
├─ コミットを取り消したい(ローカルのみ)
│  ├─ 変更内容は残したい → git reset --soft または --mixed
│  └─ 変更内容も消したい → git reset --hard
│
├─ すでにプッシュしてしまった
│  ├─ 自分だけが使うブランチ → git push -f (force push)
│  └─ チームで共有 → git revert
│
└─ 特定のファイルだけ戻したい → git checkout または git restore

ケース1:直前のコミットメッセージを修正する

最も簡単なケース:メッセージの誤字を直す

状況:

git commit -m "feture: ログイン機能を追加"  # featureのスペルミス!

解決方法:

git commit --amend -m "feature: ログイン機能を追加"

結果:

  • コミットメッセージが修正される
  • コミットIDは変更される(新しいコミットになる)
  • ファイルの内容は変わらない

エディタでじっくり編集する

git commit --amend
# デフォルトエディタが開く(VimやVS Codeなど)
# メッセージを編集して保存

Vimエディタの場合の操作:

1. iキーで編集モード
2. メッセージを修正
3. Escキーで編集モード終了
4. :wq で保存して終了

ケース2:直前のコミットにファイルを追加・修正

ファイルを追加し忘れた場合

状況:

git add index.html
git commit -m "ホームページを作成"
# あっ!style.cssも一緒にコミットするはずだった...

解決方法:

git add style.css
git commit --amend --no-edit
# --no-editオプションでメッセージは変更しない

コミット内容を修正したい場合

状況: デバッグ用のconsole.logを消し忘れた

解決方法:

# 1. ファイルを修正
vim app.js  # console.logを削除

# 2. 修正をステージング
git add app.js

# 3. 直前のコミットを上書き
git commit --amend --no-edit

ケース3:コミットを取り消す(3つのreset)

git reset の3つのオプション

オプションによる違い:

オプションコミット履歴ステージング作業ディレクトリ使用場面
–soft取り消す残る残るコミットだけやり直したい
–mixed取り消す取り消す残るadd からやり直したい(デフォルト)
–hard取り消す取り消す取り消す完全になかったことにしたい

–soft:コミットだけ取り消す

使用場面: 「コミットしたけど、もう少し修正してからコミットし直したい」

# 直前のコミットを取り消す
git reset --soft HEAD~1

# 状態確認
git status
# Changes to be committed: (ステージングに残っている)

# 追加の修正後、再コミット
git commit -m "改善版:機能を追加"

図解:

実行前: A → B → C (HEAD)
実行後: A → B (HEAD)
        Cの変更はステージングエリアに残る

–mixed(デフォルト):コミットとaddを取り消す

使用場面: 「ファイルの選別からやり直したい」

# 直前のコミットを取り消す
git reset HEAD~1
# または
git reset --mixed HEAD~1

# 状態確認
git status
# Changes not staged for commit: (作業ディレクトリに残る)

# 必要なファイルだけ選んでコミット
git add 必要なファイル.txt
git commit -m "必要な変更のみコミット"

–hard:完全に取り消す(危険!)

⚠️ 警告:このコマンドは変更内容を完全に削除します

使用場面: 「このコミットは完全に間違い。なかったことにしたい」

# 実行前に必ず確認!
git log --oneline -5  # 最近の5コミットを表示

# 直前のコミットを完全に削除
git reset --hard HEAD~1

# 2つ前まで戻る場合
git reset --hard HEAD~2

復元方法(もし間違えて実行した場合):

# reflogで履歴を確認
git reflog

# 戻したいコミットのハッシュを指定
git reset --hard <コミットハッシュ>

ケース4:複数のコミットを取り消す

特定のコミットまで戻る

# コミット履歴を確認
git log --oneline
# abc123 最新のコミット
# def456 2つ前のコミット
# ghi789 3つ前のコミット ← ここまで戻りたい

# 指定のコミットまで戻る
git reset --soft ghi789

対話的にコミットを整理する(rebase -i)

複数のコミットをまとめる:

# 直近3つのコミットを編集
git rebase -i HEAD~3

# エディタが開く
pick abc123 コミット1
pick def456 コミット2  
pick ghi789 コミット3

# pickをsquashに変更してまとめる
pick abc123 コミット1
squash def456 コミット2  
squash ghi789 コミット3

ケース5:プッシュ済みのコミットを取り消す

方法1:git revert(推奨)

安全な方法:取り消しコミットを新規作成

# 直前のコミットを打ち消すコミットを作成
git revert HEAD

# 特定のコミットを打ち消す
git revert <コミットハッシュ>

# 複数のコミットを打ち消す(範囲指定)
git revert HEAD~3..HEAD

# コミットメッセージを編集せずに実行
git revert HEAD --no-edit

メリット:

  • 履歴が残る
  • チーム開発で安全
  • コンフリクトが起きにくい

デメリット:

  • 履歴が複雑になる
  • 「取り消しの取り消し」が分かりにくい

方法2:force push(危険!)

⚠️ チーム開発では原則禁止

# ローカルでコミットを取り消す
git reset --hard HEAD~1

# 強制的にプッシュ(-fまたは--force)
git push -f origin main

# より安全な force-with-lease を使う
git push --force-with-lease origin main

force-with-leaseの利点:

  • 他の人がプッシュしていたら失敗する
  • 誤って他人の作業を消すリスクが低い

ケース6:特定のファイルだけ元に戻す

作業中のファイルを前の状態に戻す

# 特定のファイルを直前のコミット時点に戻す
git checkout HEAD -- ファイル名

# または新しいコマンド(Git 2.23以降)
git restore ファイル名

# ステージングから作業ディレクトリに戻す
git restore --staged ファイル名

特定のコミットからファイルを復元

# 特定のコミットの状態に戻す
git checkout <コミットハッシュ> -- ファイル名

# 例:3つ前のコミットの状態に戻す
git checkout HEAD~3 -- index.html

よくある失敗と対処法

失敗1:間違えてreset –hardしてしまった

症状: 作業内容が消えてしまった!

解決方法:

# 1. reflogで履歴を確認
git reflog
# abc123 HEAD@{0}: reset: moving to HEAD~1
# def456 HEAD@{1}: commit: 重要な作業  ← これを復元したい

# 2. 復元
git reset --hard def456

失敗2:違うブランチにコミットした

症状: mainブランチに直接コミットしてしまった

解決方法:

# 1. 正しいブランチを作成(現在の状態で)
git branch feature-branch

# 2. mainブランチを1つ前に戻す
git reset --hard HEAD~1

# 3. 正しいブランチに切り替え
git checkout feature-branch

失敗3:マージコミットを取り消したい

通常のresetでは複雑になるため:

# マージを取り消す
git revert -m 1 <マージコミットのハッシュ>

# -m 1 は「1番目の親(通常はmainブランチ)を残す」という意味

安全に作業するためのベストプラクティス

1. 作業前の確認コマンド

# 現在の状態を確認
git status

# コミット履歴を確認
git log --oneline -10

# 変更内容を確認
git diff

# ブランチを確認
git branch

2. バックアップブランチの作成

# 念のためバックアップブランチを作成
git branch backup-$(date +%Y%m%d-%H%M%S)

# または、タグでマーク
git tag backup-before-reset

3. エイリアスの設定

# よく使うコマンドを短縮
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.undo 'reset --soft HEAD~1'

# 使用例
git unstage ファイル名
git undo  # 直前のコミットを取り消し

4. コミット前のチェックリスト

# コミット前に必ず実行
git diff --staged  # ステージングの内容確認
git status        # 含まれるファイル確認

# 機密情報のチェック
git diff --staged | grep -i "password\|secret\|key\|token"

状況別クイックリファレンス

💡 コミットメッセージを変更

git commit --amend -m "新しいメッセージ"

💡 ファイルを追加し忘れた

git add 忘れたファイル
git commit --amend --no-edit

💡 直前のコミットを取り消す(内容は残す)

git reset --soft HEAD~1

💡 直前のコミットを取り消す(addも取り消す)

git reset HEAD~1

💡 直前のコミットを完全に削除

git reset --hard HEAD~1

💡 プッシュ済みを安全に取り消す

git revert HEAD
git push

💡 特定のファイルだけ戻す

git restore ファイル名

トラブルシューティング Q&A

Q1: reset と revert の使い分けは?

A:

  • reset: ローカルの履歴を書き換える(プッシュ前)
  • revert: 打ち消しコミットを作る(プッシュ後)

チーム開発では基本的にrevertを使いましょう。

Q2: どこまで戻せますか?

A: git reflogが残っている限り(通常90日間)、ほぼすべての操作を取り消せます。ただし、git reset --hardで消した未コミットの変更は復元できません。

Q3: コンフリクトが発生したら?

A:

# revert時のコンフリクト解決
git status  # コンフリクトファイルを確認
# ファイルを手動で修正
git add 修正したファイル
git revert --continue

Q4: 間違えて force push してしまった

A: 他のチームメンバーに即座に連絡し、以下を実行してもらう:

git fetch origin
git reset --hard origin/main

Q5: stashとresetの違いは?

A:

  • stash: 一時的に変更を退避(後で復元可能)
  • reset: コミットを取り消す

作業中の変更を一時的に隠したいだけならgit stashが安全です。


チートシート:印刷して手元に置こう

# ========== コミットの修正 ==========
git commit --amend                  # 直前のコミットを修正
git commit --amend -m "新MSG"       # メッセージ変更
git commit --amend --no-edit        # メッセージそのまま

# ========== リセット(取り消し) ==========
git reset --soft HEAD~1             # コミットのみ取り消し
git reset HEAD~1                    # コミット+add取り消し  
git reset --hard HEAD~1             # 完全に取り消し

# ========== 安全な取り消し ==========
git revert HEAD                     # 打ち消しコミット作成
git revert <hash>                   # 特定コミットを打消し

# ========== ファイル操作 ==========
git restore <file>                  # ファイルを戻す
git restore --staged <file>         # ステージングから除外

# ========== 履歴確認 ==========
git log --oneline -10               # 最近10コミット
git reflog                          # 操作履歴
git diff --staged                   # ステージング内容

# ========== 緊急時 ==========
git reflog                          # 履歴から復元ポイント探す
git reset --hard <hash>             # 特定時点に復元

まとめ:恐れずにGitを使いこなそう

Gitでのコミット取り消しは、最初は怖く感じるかもしれません。でも、この記事で学んだ知識があれば、ほとんどのミスは修正可能です。

覚えておくべき重要ポイント:

用途に応じてコマンドを使い分ける

  • 修正なら--amend
  • 取り消しならreset
  • プッシュ済みならrevert

resetの3つのオプションを理解する

  • --soft: コミットだけ
  • --mixed: コミット+ステージング
  • --hard: すべて

安全対策を忘れない

  • 重要な作業前はバックアップ
  • reflogがあれば復元可能
  • チーム開発ではrevertを優先

練習あるのみ

  • テストリポジトリで試す
  • 失敗を恐れない
  • 経験が最高の教師

Gitは強力なツールです。失敗を恐れず、どんどん使って慣れていきましょう。この記事をブックマークして、困ったときの参考にしてください。

Happy Git Life! 🎯


さらに学びたい方へ:

コメント

タイトルとURLをコピーしました