前提
git reset
コマンドは、次の3つの要素をリセットするためにある。
また、書式は以下のとおりである。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
のみが移動する*3git reset HEAD~1
コマンドは、HEAD
とブランチ
が一緒に移動する