git で状態を戻す時のメモ

git には、状態を戻すためコマンドがいくつかあって、その使い所について簡単にまとめた。
git には戻す対象は主に3つある。
- ワークツリー(作業ディレクトリ)
- インデックス(ステージング)
- コミット履歴
git を活用して作業を進めていく流れはこんな感じ。
[ワークツリー] → git add → [インデックス] → git commit → [コミット履歴]
この流れの中で状態を戻したい時は、restore、revert、reset の3つのコマンドがある。
git restore
ファイルの変更を取り消す。
- 対象:ワークツリー/ステージング
- 目的:編集したファイルを戻したい、add を取り消したい。
- 特徴:コミット履歴は書き換えない。
# ワークツリーの変更を取り消す(ワークツリーをインデックスに合わせる)
git restore <ファイル名>
# インデックスを取り消す(git add を戻す)
git restore --staged <ファイル名>
# ワークツリーもインデックスも、コミットの状態に戻す
git restore -s HEAD -SW <ファイル名>git revert
コミットを「打ち消すコミット」で戻す。(過去のコミットを消すわけではない)
指定したコミットの逆操作を新しいコミットとして追加する。
- 対象:コミット履歴
- 目的:コミットをした後の間違いを戻したい時。
- 特徴:履歴を残したまま戻す。複数人数開発、リモートプッシュ済みに向いている。
- 注意点:後のコミットと重なると「コンフリクト」が発生する。
git revert <コミットオブジェクト名(ハッシュ)>git reset
今のブランチの「現在地」そのものを強制的に移動させる。
- 対象:コミット履歴
- 目的:直前のコミットをやり直したい、マージに失敗して完全にやり直したい。
- 特徴:履歴を書き換える。
- 注意点:–hard は強力で、未保存の作業がすべて消えるので注意。
リモートプッシュ済みのブランチには原則使わない。(履歴の不整合が出る)
# 変更をステージングに残す(コミットだけ取り消し)/コミットメッセージを書き換えたい時などに使う
# HEAD-1 の -1 はいくつ戻るかの指定、HEAD-2 なら2つ前に戻る
git reset --soft <HEAD-1 or コミットオブジェクト名>
# 変更をワークツリーに残す(デフォルト)/add し直してコミットをまとめたい時
git reset --mixed <HEAD-1 or コミットオブジェクト名>
# 変更ごと全部消す/マージ失敗時や、完全に過去へ戻る時
git reset --hard <HEAD-1 or コミットオブジェクト名>まとめ
- コミットしてない編集を取り消したい。
git restore - add を取り消したい。
git restore –staged - プッシュ済みのコミットを戻したい(共同作業)
git revert - ローカルのコミットをなかったことにしたい
git reset