対象者
- Gitでrevertした後、再度Mergeしようと思ってプルリクを出したら差分がないと言われて困っている人。
- 他の記事で「RevertのRevertをする」という言葉を見て、頭がこんがらがった人。
何が起きたのか
- developブランチ -> masterブランチ にプルリクを出してMerge
- やっぱりMergeを取り消したいのでRevert
- revertボタンを押してrevertブランチ -> master にrevertプルリクを出してMerge
- 再度 develop -> master にプルリクを出す
- すると、There isn't anything compare.
差分がないとなってしまう。。
どうすればよいのか
Revertと聞くと、「戻す」というイメージを持つかもしれないが、実際は新たな修正をMergeしているに過ぎない。つまり上記の例のようにrevertした直後は、「masterの状態が最新、developブランチは古い状態」となっている。なので、再度プルリクを出すには以下の手順を踏む必要がある。
- localのdevelopブランチにmasterの変更を取り込んで、origin/master(リモートのmasterブランチ)とlocalのdevelopの状態を同じにする。
- developブランチに修正を加える
- develop -> masterへのプルリクを出す。
実際の作業
masterの変更をdevelopに取り込む
まずはlocalのdevelopブランチにmasterの変更を取り込んで、origin/masterとlocalのdevelopの状態を同じにする。
$ git checkout develop
# 一応logを確認しておく
$ git log
$ git pull origin/master
developブランチに修正を加える
軽微な内容であれば手動で修正してもよいが、変更内容が大きい場合、先程のrevert前のソースを取り込みたい。
まずは現在のgit logを見てみる。
$ git log
# Revert内容のMerge
commit ew183be83aec39vngkd58884a5c5ee08e6irot
Merge: 362266b 029fe1b
Author: Esfahan
Date: Mon Jan 25 13:59:02 2021 +0900
Merge pull request #553 from EsfahanRepo/revert-552-develop
Revert "ソースコードの修正"
# Revert用のcommit
commit 009fe2b20b059a2da3b48air943f4a35a643296
Author: Esfahan
Date: Mon Jan 25 13:20:10 2021 +0900
Revert "ソースコードの修正"
# develop -> masterへのマージ。
commit 362226b7f594if45328b237bf5e738fc1887217b
Merge: 6cdf2e1 2de7734
Author: Esfahan
Date: Mon Jan 25 13:18:11 2021 +0900
Merge pull request #552 from EsfahanRepo/develop
ソースコードの修正
logの一番上の変更をRevertする。
[Revert内容のMerge] commit番号: ew183be83aec39vngkd58884a5c5ee08e6irot
このcommit番号の変更内容が先程Revertしたものなので、「RevertのRevertをする」という表現がなされるのだ。実際にやっていることは、「先ほどRevertする前の変更内容を、現在のlocalのdevelopブランチに取り込む」ということだ。ただし、実際にはrevertコマンドを使うので、「取り込む」という表現は適切でないのかもしれない。頭がこんがらがったのなら考えなくて良い。
develop -> masterのマージをする前の状態に戻す
Revertを実施する。-m 1
というオプションを付けているが、これを付けないとエラーとなる。
$ git revert ew183be83aec39vngkd58884a5c5ee08e6irot -m 1
このcommitの詳細を確認すると、Merge: 362233b 009ve1b
という行がある。
$ git show ew183be83aec39vngkd58884a5c5ee08e6irot
commit ew183be83aec39vngkd58884a5c5ee08e6irot
Merge: 362233b 009ve1b
Author: Esfahan
Date: Mon Jan 25 13:59:02 2021 +0900
Merge pull request #553 from EsfahanRepo/revert-552-develop
Revert "ソースコードの修正"
このcommitはMergeなので、どちらのブランチの状態に戻すのかまで指定しなければならないのだ。
-m
(mainlineという意味)で1か2を指定するのだが、それぞれ以下の意味となる。
- 1: マージ元のブランチ(この場合はdevelop)
- 2: マージを適用するブランチ(この場合はmaster)
今回は、先程のMerge、つまりRevertプルリクのdevelopの状態に戻したいので、1
を指定する。
実行。
$ git revert ew183be83aec39vngkd58884a5c5ee08e6irot -m 1
以下コマンドで、localのdevelopとリモートのmasterの差分を確認して想定どおりになっていれば、再度develop -> masterへのプルリクを出すことができる。
$ git diff develop origin/master
以上