要約
HEADの位置を変えるコマンド。
色々コード修正してコミットしたらうまく動かなくなってしまったので使ってみました。
調べてみたらひとくちにresetといっても3種類のオプション(--soft, --mixed, --hard)があり、オプションによってWorking treeやIndexへの影響が変わるみたいです。
以下の状態からgit resetを使うとどうなるのか、説明してみます。
今Dまでコミットされており、HEADとIndexとWorking treeは全てDの状態です。
A <--- B <--- C <--- D
-------------------(HEAD)
-------------------(Index)
-------------------(Working tree)
git reset --soft
Working treeとIndexはそのままにHEADのみを指定のコミットに戻すコマンド。
構文
$ git reset --soft [コミットを指定]
例 (2世代前のコミットに戻す)
$ git reset --soft HEAD~2
実行後
コミット取り消されがHEADのみが2つ前のBに戻りました。
A <--- B <--- C <--- D
-----(HEAD)
-------------------(Index)
-------------------(Working tree)
具体的な使用シーン
コミットした内容を修正したいが、修正量は少ないケース
git reset --mixed
Working treeはそのままにIndexとHEADを指定のコミットに戻すコマンド。
構文
$ git reset --mixed [コミットを指定]
例 (2世代前のコミットに戻す)
$ git reset --mixed HEAD~2
実行後
コミット取り消されHEADとIndexが2つ前のBに戻りました。
A <--- B <--- C <--- D
-----(HEAD)
-----(Index)
-------------------(Working tree)
具体的な使用シーン
複数ファイルに渡る変更をコミットしたが、addする対象、内容を見直したいケース。
git reset --hard
Working tree、Index、HEADを指定のコミットに戻すコマンド。
構文
$ git reset --hard [コミットを指定]
例 (2世代前のコミットに戻る)
$ git reset --hard HEAD~2
実行後
コミット取り消されHEADとIndexとWorking treeが2つ前のBに戻りました。
A <--- B <--- C <--- D
-----(HEAD)
-----(Index)
-----(Working tree)
具体的な使用シーン
変更点が多い場合や、何故か動かなくなったので動いていた時の状態に戻したいケース。
参考にさせて頂いた記事
いまさらだけどGitを基本から分かりやすくまとめてみた
git resetでどのオプション(hard, mixed, soft)を指定すべきか、シチュエーション別に分けてみる