git reset における --soft と --mixed と --hard の違いのまとめ

前提

git reset コマンドは、次の3つの要素をリセットするためにある。

  • HEAD の位置
  • インデックス(ステージ) の状態*1
  • ワーキングツリー の状態*2

また、書式は以下のとおりである。HEAD~1 の部分はコミットのハッシュでもよい。つまり git reset が取る引数の内容は「コミット」である。

$ git reset HEAD~1

結論

git reset における3つのオプション、--soft--mixed--hard の違いは、前述の3つの要素のうちのどれがリセットされるかの違いということになります。表にまとめると以下の通りになります。

HEADの位置 インデックスの状態 ワーキングツリーの状態
--soft リセットされる リセットされない リセットされない
--mixed リセットされる リセットされる リセットされない
--hard リセットされる リセットされる リセットされる

具体的にどのような場面で使い分けられるのか

以下の例は代表的な例なので、使い方によっては様々な用途が考えられます。

--soft オプション

  • 過去のコミットをなかったことにしたい場合(コミットを戻す)
    • 例: git reset --soft HEAD~3

--mixed オプション

  • 間違えてインデックス(ステージ)に上げたファイル群を取り消したい場合
    • 例: git reset --mixed HEAD

--hard オプション

  • 間違えて編集したファイル群を元の状態に戻したい場合
    • 例: git reset --mixed HEAD

git checkout HEAD~1 との違い

  • git checkout HEAD~1 コマンドは、HEAD のみが移動する*3
  • git reset HEAD~1 コマンドは、HEADブランチ が一緒に移動する

*1:git add が済んでいるファイル群の状態

*2:今まさに編集しているファイル群の状態

*3:ので、'detached HEAD' になる

Powered by はてなブログ