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 を使ってすべての変更をステージ済みのまま保持しつつコミットを取り消す場面で使用します。

Try It — Git Command Builder

フルツールを開く