最後のGitコミットを取り消す方法
git reset --soft、--mixed、--hardを使って最後のGitコミットを取り消す方法を学びます。各オプションの違いと、コミットを安全に元に戻すタイミングを理解します。
詳細な説明
最後のGitコミットを取り消す
最も一般的なGitタスクの一つが、最後のコミットを取り消すことです。Gitはステージングエリアと作業ディレクトリに対する影響が異なる3つのリセットモードを提供しています。
git reset --soft HEAD~1
HEADを1つ前のコミットに戻しますが、すべての変更をステージされた状態(インデックス内)に保持します。作業ディレクトリは影響を受けません。
git reset --soft HEAD~1
このコマンドの後、取り消されたコミットのすべての変更はまだステージングエリアにあり、再コミットの準備ができています。コミットメッセージを変更したい場合や、コミットにファイルを追加したい場合に最適です。
git reset --mixed HEAD~1
これはデフォルトのリセットモードです。HEADを戻し、変更をアンステージしますが、作業ディレクトリには保持します。
git reset HEAD~1
# 以下と同等:
git reset --mixed HEAD~1
コミットに含めるファイルを再選択したい場合に使用します。変更は保存されますが、git addで再ステージする必要があります。
git reset --hard HEAD~1
これは破壊的なオプションです。HEADを戻し、ステージングエリアと作業ディレクトリの両方のすべての変更を破棄します。
git reset --hard HEAD~1
警告: これはコミットされていない変更を永久に削除します。最後のコミットとその変更を完全に破棄したい場合にのみ使用してください。誤ってこれを実行した場合、git reflogが失われたコミットの回復に役立ちます。
比較表
| モード | HEAD | ステージング | 作業ディレクトリ |
|---|---|---|---|
--soft |
戻る | 変更なし | 変更なし |
--mixed |
戻る | リセット | 変更なし |
--hard |
戻る | リセット | リセット |
重要:共有ブランチ
コミットを共有ブランチにプッシュ済みの場合、git resetは避けてください。代わりにgit revertを使用して、履歴を書き換えずに変更を元に戻す新しいコミットを作成します。
ユースケース
最後のコミットの取り消しは、最も頻繁に検索されるGit操作の一つです。一般的なシナリオには、コミットメッセージのタイプミスの修正、ファイルのステージ忘れ、間違ったブランチへの誤コミット、コミットしたコードにバグがあることの発見が含まれます。--softはステージ状態を保持して素早い再コミットに、--mixedはファイルを再選択する機会を与えます。