git revertで特定リビジョンまで戻す

2023/12/24に公開

まとめ

まず結論から。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