画竜点睛を衝く@mapyo

日々やった事をつらつらと書くブログです

gitで間違ってmergeしてしまったものをrevertして再度mergeするとどうなるかを検証する。

シナリオ

  • 開発中のhogehogeブランチで作業中、間違ってmasterにマージしてpushしてしまった!!
  • masterにマージした内容をリバート&push
  • masterブランチでは開発を進める
  • hogehogeブランチでは開発を進める
  • hogehogeブランチで開発が終わったので、プルリクして、masterにマージする
  • 誤ってマージした分までの変更内容はどうなる!?

前準備

github上でリポジトリの作成、ファイルの追加など。

$ git clone git@github.com:mapyo/merge-revert-test.git
$ cd merge-revert-test
$ vim test.txt → ファイルを編集
$ cat test.txt
masterの最初の作業1
masterの最初の作業2
masterの最初の作業3
masterの最初の作業4
masterの最初の作業5
$ git add test.txt
$ git commit
$ git push origin master

hogehogeブランチで作業をする。

$ git checkout -b hogehoge
$ vim test.txt → ファイルを編集
$ cat test.txt
masterの最初の作業1
hogehogeブランチの作業1
hogehogeブランチの作業2
hogehogeブランチの作業3
hogehogeブランチの作業4
hogehogeブランチの作業5
masterの最初の作業2
masterの最初の作業3
masterの最初の作業4
masterの最初の作業5
$ git add test.txt
$ git commit
$ git push origin hogehoge

一方、masterでも作業は進む。

$ git checkout master
$ vim test.txt → ファイルを編集
$ cat test.txt
masterの最初の作業1
masterの最初の作業2
masterの最初の作業3
masterの最初の作業4
masterの最初の作業5
masterのhogehogeブランチ作成後の作業1
masterのhogehogeブランチ作成後の作業2
masterのhogehogeブランチ作成後の作業3
masterのhogehogeブランチ作成後の作業4
masterのhogehogeブランチ作成後の作業5
$ git add test.txt
$ git commit
$ git push origin hogehoge

実際の作業(シナリオを実行します)

間違ってhogehogeブランチの内容をmasterにマージしてpushしてしまった!!!!

$ git checkout master
$ git merge hogehoge
$ cat test.txt
masterの最初の作業1
hogehogeブランチの作業1
hogehogeブランチの作業2
hogehogeブランチの作業3
hogehogeブランチの作業4
hogehogeブランチの作業5
masterの最初の作業2
masterの最初の作業3
masterの最初の作業4
masterの最初の作業5
masterのhogehogeブランチ作成後の作業1
masterのhogehogeブランチ作成後の作業2
masterのhogehogeブランチ作成後の作業3
masterのhogehogeブランチ作成後の作業4
masterのhogehogeブランチ作成後の作業5
$ git push origin master

masterにマージしてしまった内容をrevertしてpush

$ git revert -m 1 7efc257a73afacb12754240063739ed5d0b4e000
↑は、mergeした時のコミットのハッシュ値を入力
$ cat test.txt
masterの最初の作業1
masterの最初の作業2
masterの最初の作業3
masterの最初の作業4
masterの最初の作業5
masterのhogehogeブランチ作成後の作業1
masterのhogehogeブランチ作成後の作業2
masterのhogehogeブランチ作成後の作業3
masterのhogehogeブランチ作成後の作業4
masterのhogehogeブランチ作成後の作業5
$ git push origin master

masterブランチでは開発を進める

$ git checkout master
$ vim test.txt
$ cat test.txt
masterの最初の作業1
masterの最初の作業2
masterの最初の作業3
masterの最初の作業4
masterの最初の作業5
masterのhogehogeブランチ作成後の作業1
masterのhogehogeブランチ作成後の作業2
masterのhogehogeブランチ作成後の作業3
masterのhogehogeブランチ作成後の作業4
masterのhogehogeブランチ作成後の作業5
masterのrevert後の作業1
masterのrevert後の作業2
masterのrevert後の作業3
masterのrevert後の作業4
masterのrevert後の作業5
$ git add test.txt
$ git commit
$ git push origin master

hogehogeブランチでも開発を進める

$ git checkout hogehoge
$ vim test.txt
$ cat test.txt
masterの最初の作業1
hogehogeブランチの作業1
hogehogeブランチの作業2
hogehogeブランチの作業3
hogehogeブランチの作業4
hogehogeブランチの作業5
masterの最初の作業2
hogehogeブランチのrevert後の作業1
hogehogeブランチのrevert後の作業2
hogehogeブランチのrevert後の作業3
hogehogeブランチのrevert後の作業4
hogehogeブランチのrevert後の作業5
masterの最初の作業3
masterの最初の作業4
masterの最初の作業5
$ git add test.txt
$ git commit
$ git push origin hogehoge

hogehogeブランチで開発が終わったので、プルリクして、masterにmerge。

github上で作業します!!! ちなみに、該当のpull requestは以下。 https://github.com/mapyo/merge-revert-test/pull/1

誤ってマージした分までの変更内容はどうなる!?プルリクした時点でわかっちゃいましたが、一応、確認。

$ git checkout master
$ git fetch
$ git pull origin master
$ cat test.txt
masterの最初の作業1
masterの最初の作業2
hogehogeブランチのrevert後の作業1
hogehogeブランチのrevert後の作業2
hogehogeブランチのrevert後の作業3
hogehogeブランチのrevert後の作業4
hogehogeブランチのrevert後の作業5
masterの最初の作業3
masterの最初の作業4
masterの最初の作業5
masterのhogehogeブランチ作成後の作業1
masterのhogehogeブランチ作成後の作業2
masterのhogehogeブランチ作成後の作業3
masterのhogehogeブランチ作成後の作業4
masterのhogehogeブランチ作成後の作業5
masterのrevert後の作業1
masterのrevert後の作業2
masterのrevert後の作業3
masterのrevert後の作業4
masterのrevert後の作業5

間違ってmergeしてrevertした分の作業内容がやっぱり反映されてないですね。 ※参考までに、誤ってhogehogeブランチから、masterにマージしてしまって、revertする前のtest.txtの内容を再度載せます。「hogehogeブランチの作業」分がごっそり抜けてますね。

$ cat test.txt
masterの最初の作業1
hogehogeブランチの作業1
hogehogeブランチの作業2
hogehogeブランチの作業3
hogehogeブランチの作業4
hogehogeブランチの作業5
masterの最初の作業2
masterの最初の作業3
masterの最初の作業4
masterの最初の作業5
masterのhogehogeブランチ作成後の作業1
masterのhogehogeブランチ作成後の作業2
masterのhogehogeブランチ作成後の作業3
masterのhogehogeブランチ作成後の作業4
masterのhogehogeブランチ作成後の作業5

結論

このパターン怖いですねー。
どうすればいい感じの対応になるのかご存知の方、教えてください!
そして、読み返すとかなりわかりづらくなってしまった。。。org

補足

今回、検証に使ったgithubリポジトリは以下になります。
https://github.com/mapyo/merge-revert-test

Qiitaにも投稿したよ!
http://qiita.com/mapyo/items/450b14c2a24c436ed57e