⏪
git revertで特定リビジョンまで戻す
まとめ
まず結論から。git reset --hard 戻し先のリビジョン
したのと同じ状態に、git revert を使ってブランチ先端と作業ツリーの状態を戻すには
$ git revert --no-edit -m 1 `git rev-list --first-parent 戻し先のリビジョン..`
すればいい。
(前提:git log --first-parent
に戻し先のリビジョンが含まれていること)
具体例
図のようなコミットグラフになっていて、masterブランチのCOMMIT-3がチェックアウトされているとする。この時、作業ツリーとmasterブランチ先端をCOMMIT-1に戻したい。
コミットひとつずつ戻す
$ git revert -m 1 COMMIT-3
$ git revert -m 1 COMMIT-2
と新しい方から順にコミットを指定して git revert
を複数回実行すれば、COMMIT-1 の状態に戻せる。
複数コミットを一度に指定
$ git revert -m 1 COMMIT-3 COMMIT-2
のように、対象のコミットを全て列挙して、新しい方から順に与えれば、コマンド実行は一回で済み、 git revert
を複数回実行したのと同様の結果になる。
リバート対象のコミットを自動算出
リバート対象のコミットは、戻し先のリビジョン COMMIT-1 を使って
$ git rev-list --first-parent COMMIT-1..
COMMIT-3
COMMIT-2
とすれば列挙できる。これを使えば対象コミットを列挙する手間が省けて、
$ git revert -m 1 `git rev-list --first-parent COMMIT-1..`
で COMMIT-1 の状態まで戻せる。
コミットメッセージの編集を省略
コミットメッセージの編集が不要であれば --no-edit
をつければ良い。
$ git revert --no-edit -m 1 `git rev-list --first-parent COMMIT-1..`
でエディタの起動をスキップして、デフォルトのコミットメッセージが使われる。
Discussion