「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
- 5. よくある質問(FAQ)
- まとめ
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 【結論】git commit 取り消しの対処フローチャート&早見表
- 1. 【Push前】ローカルのコミットを取り消す(git reset)
- 2. 【Push前】直前コミットの修正・追記なら「git commit --amend」
- 3. 【Push後】リモート共有済みのコミットを取り消す(git revert)
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 【結論】git commit 取り消しの対処フローチャート&早見表
- 1. 【Push前】ローカルのコミットを取り消す(git reset)
- 2. 【Push前】直前コミットの修正・追記なら「git commit --amend」
- 3. 【Push後】リモート共有済みのコミットを取り消す(git revert)
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 【結論】git commit 取り消しの対処フローチャート&早見表
- 1. 【Push前】ローカルのコミットを取り消す(git reset)
- 2. 【Push前】直前コミットの修正・追記なら「git commit --amend」
- 3. 【Push後】リモート共有済みのコミットを取り消す(git revert)
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 【結論】git commit 取り消しの対処フローチャート&早見表
- 1. 【Push前】ローカルのコミットを取り消す(git reset)
- 2. 【Push前】直前コミットの修正・追記なら「git commit --amend」
- 3. 【Push後】リモート共有済みのコミットを取り消す(git revert)
- 4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
- 5. よくある質問(FAQ)
- まとめ
- 関連記事
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
Push済みの場合は、過去の履歴を消すのではなく、取り消したい変更を相殺する新しいコミットを作成する git revert を使用します。
3-1. git revert の使い方
取り消したいコミットのハッシュ値を指定して実行します。
# ログでコミットハッシュを確認
git log --oneline
# 出力例: a1b2c3d 取り消したいコミット
# 指定したコミットを打ち消す新しいコミットを作成
git revert a1b2c3d
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
Gitで開発を進めていると、「間違えてコミットしてしまった」「メッセージをタイポした」「必要なファイルを入れ忘れてコミットした」「Push前のコミットを取り消したい」といった場面に必ず直面します。
本記事では、git commit を取り消す方法を状況別にわかりやすく解説します。結論として、コミットの取り消しは「すでにリモートリポジトリに Push したか」と「ファイル変更を手元に残したいか」で最適なコマンドが異なります。
フローチャートと早見表を用意しましたので、今の状況に合わせた対処法をすぐに見つけて解決しましょう。
【結論】git commit 取り消しの対処フローチャート&早見表
まず、どのコマンドを使うべきか、以下のフローチャートで判定してください。
+-------------------------------------------------------------------+
| [ git commit 取り消し 状況別フロー ] |
+-------------------------------------------------------------------+
|
v
【Q1. すでに Push した?】
/ \
(YES) (NO)
/ \
v v
[ git revert ] 【Q2. 直前の修正のみ?】
打ち消しコミット作成 / \
(YES) (NO)
/ \
v v
[ git commit --amend ] 【Q3. 変更の残し方は?】
メッセージ・追記修正 / | \
/ | \
(ステージ) (未ステージ) (完全消去)
/ | \
v v v
[--soft] [--mixed] [--hard]
状況別コマンド早見表
| 状況・やりたいこと | 実行するコマンド | 変更ファイルの扱い | Push前後の適用 |
|---|---|---|---|
| 直前のコミットメッセージのタイポ修正・ファイル追加忘れ | git commit --amend | 直前コミットに上書き統合 | Push前のみ推奨 |
| コミットだけ取り消し、すぐに修正して再コミットしたい | git reset --soft HEAD^ | ステージング(git add済み)に残る | Push前のみ |
コミットを取り消し、git add からやり直したい | git reset --mixed HEAD^(または git reset HEAD^) | ワーキングツリー(未ステージ)に残る | Push前のみ |
| コミットと編集内容を完全に消去して作業を捨てる | git reset --hard HEAD^ | 変更内容もすべて削除(注意) | Push前のみ |
| 【Push済み】リモートに共有したコミットを取り消したい | git revert <commit-hash> | 打ち消し用の新コミットを追加 | Push後対応 |
1. 【Push前】ローカルのコミットを取り消す(git reset)
まだリモートリポジトリ(GitHubなど)に git push していないローカル環境のコミットであれば、git reset コマンドを使用してコミット履歴を取り消すのが一般的です。
git reset には主に3つのオプション(--soft, --mixed, --hard)があり、それぞれ取り消し後のファイル変更の扱いが異なります。
1-1. git reset --soft(ステージング状態に残す)
--soft オプションは、最新のコミットを取り消しつつ、編集したファイル群をステージングエリア(git add された状態)に保持します。
# 直前のコミットを取り消し、変更をステージング状態のまま残す
git reset --soft HEAD^
こんな場面に最適:
- コミットした直後に「少しだけファイルを修正してすぐ再コミットしたい」とき
- ローカルで細かく刻んだ複数のコミットを1つにまとめて整理したいとき
1-2. git reset --mixed(未ステージ状態に戻す・デフォルト)
--mixed オプションは、コミットの取り消しに加えてステージングも解除(git add する前の状態に戻す)します。ただし、作業ディレクトリのコード編集内容は消えずに残ります。オプションを省略した場合は --mixed が適用されます。
# コミットとステージングを取り消す(--mixed は省略可能)
git reset HEAD^
# 明示的に指定する場合
git reset --mixed HEAD^
こんな場面に最適:
- コミットしたものの「どのファイルをコミットに含めるか
git addから選び直したい」とき - ファイル変更自体は失いたくない安全な状態でリセットしたいとき
1-3. git reset --hard(変更を含めて完全削除する・警告)
--hard オプションは、指定したコミット以降のコミット履歴・ステージング・作業ディレクトリの変更内容をすべて完全破棄します。
# 直前のコミットとその変更内容をすべて消去して戻す
git reset --hard HEAD^
注意点:
このコマンドを実行すると、該当コミットで変更したコード作業が手元から消去されます。作業中の未コミット変更も巻き添えで消えるため、実行前には必ず git status や git diff で確認してください。
1-4. 複数(N個前)のコミットを一括で取り消す方法
直前(1つ前)だけでなく、2つ以上前のコミットまで一気に戻したい場合は、チルダ表記(HEAD~N)またはコミットハッシュ(コミットID)を指定します。
# 3つ前のコミットまで戻し、変更はステージングに残す
git reset --soft HEAD~3
# 特定のコミットハッシュの時点まで戻す
git log --oneline
# 出力例: a1b2c3d (HEAD) 最新コミット / e4f5g6h 戻したい地点のコミット
git reset --soft e4f5g6h
2. 【Push前】直前コミットの修正・追記なら「git commit --amend」
「コミットメッセージの誤字を直したいだけ」「ファイルを1つ入れ忘れただけ」といった場合、わざわざ git reset を行わずにgit commit --amend を使う方がはるかに手軽で安全です。
2-1. コミットメッセージだけを修正する
直前のコミットメッセージを新しいメッセージで直接上書き変更します。
# メッセージを修正して直前コミットを上書き
git commit --amend -m "修正後の正しいコミットメッセージ"
2-2. 追加し忘れたファイルを含めて上書きする
コミット後にファイルの追加忘れに気づいた場合、該当ファイルを git add してから --amend --no-edit を実行することで、メッセージを変更せずに直前のコミットに統合できます。
# 入れ忘れたファイルをステージングに追加
git add forgotten_script.sh
# メッセージを変更せず直前コミットに統合
git commit --amend --no-edit
3. 【Push後】リモート共有済みのコミットを取り消す(git revert)
すでに git push してリモートリポジトリに公開されたコミットを取り消したい場合、git reset を使用してはいけません。ローカルの履歴を過去に巻き戻して再度 Push すると、チームメンバーのリポジトリ履歴と不整合が起き、深刻な競合トラブルを引き起こします。
Push済みの場合は、過去の履歴を消すのではなく、取り消したい変更を相殺する新しいコミットを作成する git revert を使用します。
3-1. git revert の使い方
取り消したいコミットのハッシュ値を指定して実行します。
# ログでコミットハッシュを確認
git log --oneline
# 出力例: a1b2c3d 取り消したいコミット
# 指定したコミットを打ち消す新しいコミットを作成
git revert a1b2c3d
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
Gitで開発を進めていると、「間違えてコミットしてしまった」「メッセージをタイポした」「必要なファイルを入れ忘れてコミットした」「Push前のコミットを取り消したい」といった場面に必ず直面します。
本記事では、git commit を取り消す方法を状況別にわかりやすく解説します。結論として、コミットの取り消しは「すでにリモートリポジトリに Push したか」と「ファイル変更を手元に残したいか」で最適なコマンドが異なります。
フローチャートと早見表を用意しましたので、今の状況に合わせた対処法をすぐに見つけて解決しましょう。
【結論】git commit 取り消しの対処フローチャート&早見表
まず、どのコマンドを使うべきか、以下のフローチャートで判定してください。
+-------------------------------------------------------------------+
| [ git commit 取り消し 状況別フロー ] |
+-------------------------------------------------------------------+
|
v
【Q1. すでに Push した?】
/ \
(YES) (NO)
/ \
v v
[ git revert ] 【Q2. 直前の修正のみ?】
打ち消しコミット作成 / \
(YES) (NO)
/ \
v v
[ git commit --amend ] 【Q3. 変更の残し方は?】
メッセージ・追記修正 / | \
/ | \
(ステージ) (未ステージ) (完全消去)
/ | \
v v v
[--soft] [--mixed] [--hard]
状況別コマンド早見表
| 状況・やりたいこと | 実行するコマンド | 変更ファイルの扱い | Push前後の適用 |
|---|---|---|---|
| 直前のコミットメッセージのタイポ修正・ファイル追加忘れ | git commit --amend | 直前コミットに上書き統合 | Push前のみ推奨 |
| コミットだけ取り消し、すぐに修正して再コミットしたい | git reset --soft HEAD^ | ステージング(git add済み)に残る | Push前のみ |
コミットを取り消し、git add からやり直したい | git reset --mixed HEAD^(または git reset HEAD^) | ワーキングツリー(未ステージ)に残る | Push前のみ |
| コミットと編集内容を完全に消去して作業を捨てる | git reset --hard HEAD^ | 変更内容もすべて削除(注意) | Push前のみ |
| 【Push済み】リモートに共有したコミットを取り消したい | git revert <commit-hash> | 打ち消し用の新コミットを追加 | Push後対応 |
1. 【Push前】ローカルのコミットを取り消す(git reset)
まだリモートリポジトリ(GitHubなど)に git push していないローカル環境のコミットであれば、git reset コマンドを使用してコミット履歴を取り消すのが一般的です。
git reset には主に3つのオプション(--soft, --mixed, --hard)があり、それぞれ取り消し後のファイル変更の扱いが異なります。
1-1. git reset --soft(ステージング状態に残す)
--soft オプションは、最新のコミットを取り消しつつ、編集したファイル群をステージングエリア(git add された状態)に保持します。
# 直前のコミットを取り消し、変更をステージング状態のまま残す
git reset --soft HEAD^
こんな場面に最適:
- コミットした直後に「少しだけファイルを修正してすぐ再コミットしたい」とき
- ローカルで細かく刻んだ複数のコミットを1つにまとめて整理したいとき
1-2. git reset --mixed(未ステージ状態に戻す・デフォルト)
--mixed オプションは、コミットの取り消しに加えてステージングも解除(git add する前の状態に戻す)します。ただし、作業ディレクトリのコード編集内容は消えずに残ります。オプションを省略した場合は --mixed が適用されます。
# コミットとステージングを取り消す(--mixed は省略可能)
git reset HEAD^
# 明示的に指定する場合
git reset --mixed HEAD^
こんな場面に最適:
- コミットしたものの「どのファイルをコミットに含めるか
git addから選び直したい」とき - ファイル変更自体は失いたくない安全な状態でリセットしたいとき
1-3. git reset --hard(変更を含めて完全削除する・警告)
--hard オプションは、指定したコミット以降のコミット履歴・ステージング・作業ディレクトリの変更内容をすべて完全破棄します。
# 直前のコミットとその変更内容をすべて消去して戻す
git reset --hard HEAD^
注意点:
このコマンドを実行すると、該当コミットで変更したコード作業が手元から消去されます。作業中の未コミット変更も巻き添えで消えるため、実行前には必ず git status や git diff で確認してください。
1-4. 複数(N個前)のコミットを一括で取り消す方法
直前(1つ前)だけでなく、2つ以上前のコミットまで一気に戻したい場合は、チルダ表記(HEAD~N)またはコミットハッシュ(コミットID)を指定します。
# 3つ前のコミットまで戻し、変更はステージングに残す
git reset --soft HEAD~3
# 特定のコミットハッシュの時点まで戻す
git log --oneline
# 出力例: a1b2c3d (HEAD) 最新コミット / e4f5g6h 戻したい地点のコミット
git reset --soft e4f5g6h
2. 【Push前】直前コミットの修正・追記なら「git commit --amend」
「コミットメッセージの誤字を直したいだけ」「ファイルを1つ入れ忘れただけ」といった場合、わざわざ git reset を行わずにgit commit --amend を使う方がはるかに手軽で安全です。
2-1. コミットメッセージだけを修正する
直前のコミットメッセージを新しいメッセージで直接上書き変更します。
# メッセージを修正して直前コミットを上書き
git commit --amend -m "修正後の正しいコミットメッセージ"
2-2. 追加し忘れたファイルを含めて上書きする
コミット後にファイルの追加忘れに気づいた場合、該当ファイルを git add してから --amend --no-edit を実行することで、メッセージを変更せずに直前のコミットに統合できます。
# 入れ忘れたファイルをステージングに追加
git add forgotten_script.sh
# メッセージを変更せず直前コミットに統合
git commit --amend --no-edit
3. 【Push後】リモート共有済みのコミットを取り消す(git revert)
すでに git push してリモートリポジトリに公開されたコミットを取り消したい場合、git reset を使用してはいけません。ローカルの履歴を過去に巻き戻して再度 Push すると、チームメンバーのリポジトリ履歴と不整合が起き、深刻な競合トラブルを引き起こします。
Push済みの場合は、過去の履歴を消すのではなく、取り消したい変更を相殺する新しいコミットを作成する git revert を使用します。
3-1. git revert の使い方
取り消したいコミットのハッシュ値を指定して実行します。
# ログでコミットハッシュを確認
git log --oneline
# 出力例: a1b2c3d 取り消したいコミット
# 指定したコミットを打ち消す新しいコミットを作成
git revert a1b2c3d
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
Push済みの場合は、過去の履歴を消すのではなく、取り消したい変更を相殺する新しいコミットを作成する git revert を使用します。
3-1. git revert の使い方
取り消したいコミットのハッシュ値を指定して実行します。
# ログでコミットハッシュを確認
git log --oneline
# 出力例: a1b2c3d 取り消したいコミット
# 指定したコミットを打ち消す新しいコミットを作成
git revert a1b2c3d
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
Gitで開発を進めていると、「間違えてコミットしてしまった」「メッセージをタイポした」「必要なファイルを入れ忘れてコミットした」「Push前のコミットを取り消したい」といった場面に必ず直面します。
本記事では、git commit を取り消す方法を状況別にわかりやすく解説します。結論として、コミットの取り消しは「すでにリモートリポジトリに Push したか」と「ファイル変更を手元に残したいか」で最適なコマンドが異なります。
フローチャートと早見表を用意しましたので、今の状況に合わせた対処法をすぐに見つけて解決しましょう。
【結論】git commit 取り消しの対処フローチャート&早見表
まず、どのコマンドを使うべきか、以下のフローチャートで判定してください。
+-------------------------------------------------------------------+
| [ git commit 取り消し 状況別フロー ] |
+-------------------------------------------------------------------+
|
v
【Q1. すでに Push した?】
/ \
(YES) (NO)
/ \
v v
[ git revert ] 【Q2. 直前の修正のみ?】
打ち消しコミット作成 / \
(YES) (NO)
/ \
v v
[ git commit --amend ] 【Q3. 変更の残し方は?】
メッセージ・追記修正 / | \
/ | \
(ステージ) (未ステージ) (完全消去)
/ | \
v v v
[--soft] [--mixed] [--hard]
状況別コマンド早見表
| 状況・やりたいこと | 実行するコマンド | 変更ファイルの扱い | Push前後の適用 |
|---|---|---|---|
| 直前のコミットメッセージのタイポ修正・ファイル追加忘れ | git commit --amend | 直前コミットに上書き統合 | Push前のみ推奨 |
| コミットだけ取り消し、すぐに修正して再コミットしたい | git reset --soft HEAD^ | ステージング(git add済み)に残る | Push前のみ |
コミットを取り消し、git add からやり直したい | git reset --mixed HEAD^(または git reset HEAD^) | ワーキングツリー(未ステージ)に残る | Push前のみ |
| コミットと編集内容を完全に消去して作業を捨てる | git reset --hard HEAD^ | 変更内容もすべて削除(注意) | Push前のみ |
| 【Push済み】リモートに共有したコミットを取り消したい | git revert <commit-hash> | 打ち消し用の新コミットを追加 | Push後対応 |
1. 【Push前】ローカルのコミットを取り消す(git reset)
まだリモートリポジトリ(GitHubなど)に git push していないローカル環境のコミットであれば、git reset コマンドを使用してコミット履歴を取り消すのが一般的です。
git reset には主に3つのオプション(--soft, --mixed, --hard)があり、それぞれ取り消し後のファイル変更の扱いが異なります。
1-1. git reset --soft(ステージング状態に残す)
--soft オプションは、最新のコミットを取り消しつつ、編集したファイル群をステージングエリア(git add された状態)に保持します。
# 直前のコミットを取り消し、変更をステージング状態のまま残す
git reset --soft HEAD^
こんな場面に最適:
- コミットした直後に「少しだけファイルを修正してすぐ再コミットしたい」とき
- ローカルで細かく刻んだ複数のコミットを1つにまとめて整理したいとき
1-2. git reset --mixed(未ステージ状態に戻す・デフォルト)
--mixed オプションは、コミットの取り消しに加えてステージングも解除(git add する前の状態に戻す)します。ただし、作業ディレクトリのコード編集内容は消えずに残ります。オプションを省略した場合は --mixed が適用されます。
# コミットとステージングを取り消す(--mixed は省略可能)
git reset HEAD^
# 明示的に指定する場合
git reset --mixed HEAD^
こんな場面に最適:
- コミットしたものの「どのファイルをコミットに含めるか
git addから選び直したい」とき - ファイル変更自体は失いたくない安全な状態でリセットしたいとき
1-3. git reset --hard(変更を含めて完全削除する・警告)
--hard オプションは、指定したコミット以降のコミット履歴・ステージング・作業ディレクトリの変更内容をすべて完全破棄します。
# 直前のコミットとその変更内容をすべて消去して戻す
git reset --hard HEAD^
注意点:
このコマンドを実行すると、該当コミットで変更したコード作業が手元から消去されます。作業中の未コミット変更も巻き添えで消えるため、実行前には必ず git status や git diff で確認してください。
1-4. 複数(N個前)のコミットを一括で取り消す方法
直前(1つ前)だけでなく、2つ以上前のコミットまで一気に戻したい場合は、チルダ表記(HEAD~N)またはコミットハッシュ(コミットID)を指定します。
# 3つ前のコミットまで戻し、変更はステージングに残す
git reset --soft HEAD~3
# 特定のコミットハッシュの時点まで戻す
git log --oneline
# 出力例: a1b2c3d (HEAD) 最新コミット / e4f5g6h 戻したい地点のコミット
git reset --soft e4f5g6h
2. 【Push前】直前コミットの修正・追記なら「git commit --amend」
「コミットメッセージの誤字を直したいだけ」「ファイルを1つ入れ忘れただけ」といった場合、わざわざ git reset を行わずにgit commit --amend を使う方がはるかに手軽で安全です。
2-1. コミットメッセージだけを修正する
直前のコミットメッセージを新しいメッセージで直接上書き変更します。
# メッセージを修正して直前コミットを上書き
git commit --amend -m "修正後の正しいコミットメッセージ"
2-2. 追加し忘れたファイルを含めて上書きする
コミット後にファイルの追加忘れに気づいた場合、該当ファイルを git add してから --amend --no-edit を実行することで、メッセージを変更せずに直前のコミットに統合できます。
# 入れ忘れたファイルをステージングに追加
git add forgotten_script.sh
# メッセージを変更せず直前コミットに統合
git commit --amend --no-edit
3. 【Push後】リモート共有済みのコミットを取り消す(git revert)
すでに git push してリモートリポジトリに公開されたコミットを取り消したい場合、git reset を使用してはいけません。ローカルの履歴を過去に巻き戻して再度 Push すると、チームメンバーのリポジトリ履歴と不整合が起き、深刻な競合トラブルを引き起こします。
Push済みの場合は、過去の履歴を消すのではなく、取り消したい変更を相殺する新しいコミットを作成する git revert を使用します。
3-1. git revert の使い方
取り消したいコミットのハッシュ値を指定して実行します。
# ログでコミットハッシュを確認
git log --oneline
# 出力例: a1b2c3d 取り消したいコミット
# 指定したコミットを打ち消す新しいコミットを作成
git revert a1b2c3d
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
Push済みの場合は、過去の履歴を消すのではなく、取り消したい変更を相殺する新しいコミットを作成する git revert を使用します。
3-1. git revert の使い方
取り消したいコミットのハッシュ値を指定して実行します。
# ログでコミットハッシュを確認
git log --oneline
# 出力例: a1b2c3d 取り消したいコミット
# 指定したコミットを打ち消す新しいコミットを作成
git revert a1b2c3d
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
Gitで開発を進めていると、「間違えてコミットしてしまった」「メッセージをタイポした」「必要なファイルを入れ忘れてコミットした」「Push前のコミットを取り消したい」といった場面に必ず直面します。
本記事では、git commit を取り消す方法を状況別にわかりやすく解説します。結論として、コミットの取り消しは「すでにリモートリポジトリに Push したか」と「ファイル変更を手元に残したいか」で最適なコマンドが異なります。
フローチャートと早見表を用意しましたので、今の状況に合わせた対処法をすぐに見つけて解決しましょう。
【結論】git commit 取り消しの対処フローチャート&早見表
まず、どのコマンドを使うべきか、以下のフローチャートで判定してください。
+-------------------------------------------------------------------+
| [ git commit 取り消し 状況別フロー ] |
+-------------------------------------------------------------------+
|
v
【Q1. すでに Push した?】
/ \
(YES) (NO)
/ \
v v
[ git revert ] 【Q2. 直前の修正のみ?】
打ち消しコミット作成 / \
(YES) (NO)
/ \
v v
[ git commit --amend ] 【Q3. 変更の残し方は?】
メッセージ・追記修正 / | \
/ | \
(ステージ) (未ステージ) (完全消去)
/ | \
v v v
[--soft] [--mixed] [--hard]
状況別コマンド早見表
| 状況・やりたいこと | 実行するコマンド | 変更ファイルの扱い | Push前後の適用 |
|---|---|---|---|
| 直前のコミットメッセージのタイポ修正・ファイル追加忘れ | git commit --amend | 直前コミットに上書き統合 | Push前のみ推奨 |
| コミットだけ取り消し、すぐに修正して再コミットしたい | git reset --soft HEAD^ | ステージング(git add済み)に残る | Push前のみ |
コミットを取り消し、git add からやり直したい | git reset --mixed HEAD^(または git reset HEAD^) | ワーキングツリー(未ステージ)に残る | Push前のみ |
| コミットと編集内容を完全に消去して作業を捨てる | git reset --hard HEAD^ | 変更内容もすべて削除(注意) | Push前のみ |
| 【Push済み】リモートに共有したコミットを取り消したい | git revert <commit-hash> | 打ち消し用の新コミットを追加 | Push後対応 |
1. 【Push前】ローカルのコミットを取り消す(git reset)
まだリモートリポジトリ(GitHubなど)に git push していないローカル環境のコミットであれば、git reset コマンドを使用してコミット履歴を取り消すのが一般的です。
git reset には主に3つのオプション(--soft, --mixed, --hard)があり、それぞれ取り消し後のファイル変更の扱いが異なります。
1-1. git reset --soft(ステージング状態に残す)
--soft オプションは、最新のコミットを取り消しつつ、編集したファイル群をステージングエリア(git add された状態)に保持します。
# 直前のコミットを取り消し、変更をステージング状態のまま残す
git reset --soft HEAD^
こんな場面に最適:
- コミットした直後に「少しだけファイルを修正してすぐ再コミットしたい」とき
- ローカルで細かく刻んだ複数のコミットを1つにまとめて整理したいとき
1-2. git reset --mixed(未ステージ状態に戻す・デフォルト)
--mixed オプションは、コミットの取り消しに加えてステージングも解除(git add する前の状態に戻す)します。ただし、作業ディレクトリのコード編集内容は消えずに残ります。オプションを省略した場合は --mixed が適用されます。
# コミットとステージングを取り消す(--mixed は省略可能)
git reset HEAD^
# 明示的に指定する場合
git reset --mixed HEAD^
こんな場面に最適:
- コミットしたものの「どのファイルをコミットに含めるか
git addから選び直したい」とき - ファイル変更自体は失いたくない安全な状態でリセットしたいとき
1-3. git reset --hard(変更を含めて完全削除する・警告)
--hard オプションは、指定したコミット以降のコミット履歴・ステージング・作業ディレクトリの変更内容をすべて完全破棄します。
# 直前のコミットとその変更内容をすべて消去して戻す
git reset --hard HEAD^
注意点:
このコマンドを実行すると、該当コミットで変更したコード作業が手元から消去されます。作業中の未コミット変更も巻き添えで消えるため、実行前には必ず git status や git diff で確認してください。
1-4. 複数(N個前)のコミットを一括で取り消す方法
直前(1つ前)だけでなく、2つ以上前のコミットまで一気に戻したい場合は、チルダ表記(HEAD~N)またはコミットハッシュ(コミットID)を指定します。
# 3つ前のコミットまで戻し、変更はステージングに残す
git reset --soft HEAD~3
# 特定のコミットハッシュの時点まで戻す
git log --oneline
# 出力例: a1b2c3d (HEAD) 最新コミット / e4f5g6h 戻したい地点のコミット
git reset --soft e4f5g6h
2. 【Push前】直前コミットの修正・追記なら「git commit --amend」
「コミットメッセージの誤字を直したいだけ」「ファイルを1つ入れ忘れただけ」といった場合、わざわざ git reset を行わずにgit commit --amend を使う方がはるかに手軽で安全です。
2-1. コミットメッセージだけを修正する
直前のコミットメッセージを新しいメッセージで直接上書き変更します。
# メッセージを修正して直前コミットを上書き
git commit --amend -m "修正後の正しいコミットメッセージ"
2-2. 追加し忘れたファイルを含めて上書きする
コミット後にファイルの追加忘れに気づいた場合、該当ファイルを git add してから --amend --no-edit を実行することで、メッセージを変更せずに直前のコミットに統合できます。
# 入れ忘れたファイルをステージングに追加
git add forgotten_script.sh
# メッセージを変更せず直前コミットに統合
git commit --amend --no-edit
3. 【Push後】リモート共有済みのコミットを取り消す(git revert)
すでに git push してリモートリポジトリに公開されたコミットを取り消したい場合、git reset を使用してはいけません。ローカルの履歴を過去に巻き戻して再度 Push すると、チームメンバーのリポジトリ履歴と不整合が起き、深刻な競合トラブルを引き起こします。
Push済みの場合は、過去の履歴を消すのではなく、取り消したい変更を相殺する新しいコミットを作成する git revert を使用します。
3-1. git revert の使い方
取り消したいコミットのハッシュ値を指定して実行します。
# ログでコミットハッシュを確認
git log --oneline
# 出力例: a1b2c3d 取り消したいコミット
# 指定したコミットを打ち消す新しいコミットを作成
git revert a1b2c3d
実行するとエディタが起動し、「Revert "取り消したいコミットメッセージ"」というメッセージが自動生成されます。そのまま保存して閉じれば、打ち消しコミットが追加されます。
3-2. git reset と git revert の履歴比較
[ git reset の場合 ] (履歴を消去して巻き戻す / Push後NG)
A --- B --- C (取り消し前)
A --- B (reset後: コミットCが履歴から消える)
[ git revert の場合 ] (打ち消しコミットを追加する / Push後推奨)
A --- B --- C (取り消し前)
A --- B --- C --- Revert"C" (revert後: Cを相殺する新しいコミットが追加される)
4. 【救済策】間違えて git reset --hard で消したコミットの復元(git reflog)
「間違えて git reset --hard を実行してしまい、必要なコミットが消えてしまった!」という事故が発生しても、パニックになる必要はありません。Gitは git reflog という仕組みでローカルのあらゆる操作履歴を記録しています。
4-1. reflog を使った復元3ステップ
ステップ 1: 操作履歴(reflog)を表示する
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD^ <-- 間違えてresetした操作
e4f5g6h HEAD@{1}: commit: 大切な機能実装 <-- 【復元したいコミット!】
7i8j9k0 HEAD@{2}: checkout: moving from main to feature
ステップ 2: 戻したい状態のインデックス(またはコミットハッシュ)を特定する
上記の例では、HEAD@{1}(コミットハッシュ: e4f5g6h)が誤操作直前の状態です。
ステップ 3: reset コマンドで復元を実行する
# 特定した HEAD@{1} の状態へリセットして復元
git reset --hard HEAD@{1}
これで、誤って消去したコミットが元通りに復活します。
※注意:一度も git commit や git add を行っていなかった完全な未保存ファイルは reflog にも記録されないため復元できません。
5. よくある質問(FAQ)
HEAD^ と HEAD~1 に違いはありますか?
「直前の1つのコミット」を指すという意味では HEAD^ と HEAD~1 は全く同じ動作になります。2つ以上遡る場合は、HEAD~2 や HEAD~5 のように数字で指定できるチルダ(~)表記が便利です。
コミットを取り消す前にどのコミットに戻るか確認する方法は?
git log --oneline を実行して、直近のコミット履歴とハッシュ一覧を確認できます。1行で簡潔に表示されるため、対象のコミットを素早く特定できます。
未コミットの作業を残したままコミットだけ取り消したい場合は?
git stash を使って現在作業中の変更一時退避させてから git reset を実行し、最後に git stash pop で作業を戻す方法が安全です。
まとめ
git commit の取り消し方法は、状況に応じて使い分けることが安全なチーム開発のポイントです。
- 直前のメッセージタイポ・ファイル追加忘れ →
git commit --amend - Push前・変更を残してコミットだけ取消 →
git reset --soft HEAD^ - Push前・add前の状態に戻す →
git reset --mixed HEAD^(デフォルト) - Push前・作業内容を含めて完全削除 →
git reset --hard HEAD^ - Push済み・リモート共有後の取り消し →
git revert <commit-hash> - 誤操作によるコミット削除の復旧 →
git reflogからgit reset --hard
状況に合わせた最適なコマンドを選び、落ち着いてGitの取り消し操作を行いましょう!
