Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

シナリオ

  • 開発中の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

mapyo
プログラマー修行中の身です。
http://d.hatena.ne.jp/mapyo/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした