事の経緯
個人開発にて
- mainからdevelopを切って作業、コミットAを作成
- developからmainへマージ
- やっぱりmainへのマージを取り消したいな… → revertのプルリクを作成してmainにマージ
- 再度developからmainへのプルリクを作成しようとする
- 差分が全く表示されず、プルリクを作成できない!!
💬 「mainブランチで、コミットAをなかったの事にしたのだから、コミットA分の差分が表示されるのでは?!?!」と思っていた。
何故差分が表示されないのか
mainの状況
- develop( コミットA )がマージされる
- マージコミットをrevertしたことで、マージが無かった事になる = コミットA が無かった事になる
developの状況
- コミットA
💡したがって、Gitは「コミットAは、mainではすでに打ち消された状態になっているから、新しい差分はない」と判断する
コミットA分の差分を再度出す方法
develop側で、revertのマージコミットをrevertすれば良いらしい。
手順
-
git checkout develop
(developにcheckout) -
git fetch origin main
(リモートのmainをローカルに) -
git merge origin/main
(revertされたmainをdevelopにマージ) -
git revert revertのマージコミットのハッシュ値 -m 1
(revertのマージコミットをrevert) -
git push origin develop
(リポジトリにpush) - developからmainへのプルリクを作成でき、コミットAの差分も表示される
以下のログになる
* commit ddddd (develop, origin/develop)
|
| Revert "Merge pull request #2 from xxx/revert-1-develop" (※revertのマージコミットの打ち消し)
|
| This reverts commit ccccc, reversing
| changes made to aaaaa.
|
* commit ccccc (origin/main, main)
|\ Merge: aaaaa bbbbb
| |
| | Merge pull request #2 from xxx/revert-1-develop (※revertのマージコミット)
| |
| | Revert "コミットA作業分"
| |
| * commit bbbbb
|/
| Revert "コミットA作業分" (※revertコミット)
|
* commit aaaaa
|
| コミットA
mainの状況
- develop( コミットA )がマージされる
- マージコミットをrevertしたことで、マージが無かった事になる = コミットA が無かった事になる
developの状況
- コミットAを作成
- mainを取り込むことで、revertコミットが取り込まれる
- リバートのマージコミットをリバートする = コミットAの打ち消しがなかったことになる
💡Gitは「mainの打ち消された状態と、developの打ち消しがない状態と差分がある」と判断する
(補足)git revert -m 1
について
マージコミット(今回の場合は ccccc
のコミットのこと。= revertコミットのマージコミット)には、親コミットが2つある。
今回だとaaaaa(コミットA)
とbbbbb(revertコミット)
。
そのため、revertでマージコミットを打ち消すとどちらのコミットに戻すのかを聞かれる。
1にすると、aaaaa(マージされた側のブランチ)
2にすると、bbbbb(マージした側のブランチ)
に戻される。
今回は、developをコミットAの状態に戻したかったので、git revert -m 1
とした。
参考
https://blog.toshimaru.net/git-revert-mainline/
感想
(developのコミットログも汚くなるので、個人開発であればシンプルにmainをresetしちゃうのが良い気がする)
めちゃくちゃに参考