Git Reset: Soft・Hard・Mixed モードの違いを解説
git reset の --soft、--mixed、--hard の違いを理解し、それぞれのモードを使って安全にコミットを取り消す方法を解説します。状況に応じた使い分けがわかります。
git reset --soft HEAD~1詳細な説明
git reset は何をするのか?
git reset は現在のブランチポインタを別のコミットに移動します。3つのモード — --soft、--mixed、--hard — は、ステージングエリア(インデックス)と作業ディレクトリに何が起こるかを制御します。
3つのモード
| モード | HEAD | ステージングエリア | 作業ディレクトリ |
|---|---|---|---|
--soft |
移動する | 変更なし | 変更なし |
--mixed(デフォルト) |
移動する | リセット | 変更なし |
--hard |
移動する | リセット | リセット |
--soft: コミットを取り消し、ステージ済みのまま保持
git reset --soft HEAD~1
コミットをやり直したいときに最適です。変更はステージ済みのまま残り、別のメッセージで再コミットしたり、他の変更と組み合わせたりできます。
--mixed: コミットを取り消し、変更をアンステージ
git reset HEAD~1
# または明示的に:
git reset --mixed HEAD~1
変更は作業ディレクトリに保持されますが、ステージからは外されます。どのファイルをどのコミットに入れるか整理し直したいときに使います。
--hard: すべてを取り消す
git reset --hard HEAD~1
これは変更を永久に破棄します。 コミット、ステージングエリア、作業ディレクトリがすべて元に戻されます。作業を本当に捨てたいときにのみ使用してください。
安全のためのヒント
- パニックになる前に必ず
git reflogを確認しましょう。--hardリセットでも、ガベージコレクション前であれば元に戻せます。 - コミットしていない変更を本当に破棄したい場合を除き、
--softや--mixedを使うのが安全です。 - 共有ブランチに push 済みのコミットには
git resetを使わないでください。代わりにgit revertを使えば、変更を取り消す新しいコミットが作成されます。
ユースケース
開発者が間違ったメッセージでコミットしてしまい、コミットをやり直したい場合に、git reset --soft HEAD~1 を使ってすべての変更をステージ済みのまま保持しつつコミットを取り消す場面で使用します。