git reset
別名: git reset --hard / git reset --soft / git reset --mixed / リセット
git reset は、現在のブランチが指すコミットを別のコミットへ移動させるコマンド。
オプションによって、インデックスとワーキングツリーをどこまで巻き戻すかが変わる。
公開:
定義
git reset は、現在のブランチが指すコミットを指定したコミットへ移動させる Git のコマンドである。
移動に伴ってインデックス(ステージング領域)とワーキングツリーをどこまで揃えるかをオプションで選ぶ。--soft は HEAD だけを動かし、--mixed(既定)はインデックスも合わせ、--hard はワーキングツリーまで上書きする。
詳細
Git は HEAD・インデックス・ワーキングツリーという 3 つの状態を持ち、reset はこれを上から順に何段階まで揃えるかを決めるコマンドだと捉えると理解しやすい。git reset --soft HEAD~ なら直前のコミットが取り消されて変更はステージ済みのまま残るので、コミットのやり直しに使える。--mixed ならステージだけ外れ、--hard なら変更そのものが消える。git reset <ファイル> のようにパスを渡した形はブランチを動かさず、そのファイルのステージだけを解除する。
よくある誤解
--hard で消したコミットは復元不可能だと思われがちだが、コミット済みの内容ならgit reflogに HEAD の移動履歴が残っており、そこからハッシュを拾って戻せる。
復元できないのはコミットしていない変更のほうである。
また --hard は追跡していないファイルを消さないため、reset だけで作業ツリーが完全にきれいになるとは限らない。
関連
公開済みの履歴を書き換えずに打ち消す場合は git revert を使う。
取り消し操作の具体例は Git reset --hard で消したコミットを復元できない、退避には git stash を参照。