gitでまだマージしたくない変更を間違ってmasterにマージしてしまった時の対処

久々にgitですごい躓いたので。

説明すると、branch02の内容を謝ってmasterにマージしてしまった後、それに気づかずbranch01の内容もmasterにマージしてしまった。

あとから気づいたので、branch02の内容だけmasterから取り除いて、もろもろレビューが終わってからbranch02の内容はmasterにマージしたい。

言葉で説明すると意味不明なので図*1がこちら

https://cacoo.com/diagrams/0CU2tMOnYkDhU7ct-F5B95.png

commitを取り消すコマンドはgit resetが有名だけど、git resetはあるcommit時点まで戻り、それ以降のcommitをなかったことにするというものなので、branch01のcommit内容も消されてしまう。(まあ戻そうと思えば戻せる)

そこでまず使うのがgit revert

git revert {commit No}

Git チュートリアル: 変更を元に戻す | アトラシアン

これで、「ある特定のcommit内容を取り消す」というcommitを行うことが出来る(git resetと違って本当になかったことにされるわけじゃない)

f:id:Sato_4tree:20140630222625p:plain

ここまではOK。

 

そのあとbranch02のレビューが完了したので、ここで再びbranch02をマージしてみる。

これがbranch02→masterへの変更内容。running.txtの2行目に文章を追加してます。

f:id:Sato_4tree:20140630223142p:plain

で、branch02→masterへのマージが完了したところで、masterのrunning.txtを見てみると。。。

f:id:Sato_4tree:20140630223707p:plain

あれ!?変更が反映されていない!???

実は、先ほどgit revertでbranch02のcommit内容を取り消しする、というcommitをしてしまったため、

その後branch02をmasterにマージしても、そのcommit内容は取り消されてしまうのです!

ここでbranch02→masterへのマージができなくなり、だいぶつまづく。。。

四苦八苦した結果、1回masterのrevertしたって内容もbranch02にmergeしてくればいいのではないか?と思いつく

git checkout branch02
# master→branch02にマージ
git merge master

この状態だとbranch02の変更内容が消えてしまってるので、revertする前のcommit情報を持ってくる(あとに追記あり)

# 特定のファイルだけrevert前に戻す
git checkout {revert直前のcommit No} {戻したいfile name}
# ex : git checkout c6881bf28944f3d8c779e26a9a004b14a44d230c running.txt
git add running.txt
git commit -m "re-commit running"

最後に、masterにマージすると・・・

git checkout master
# branch02→masterにマージ
git merge branch02
git push origin master

f:id:Sato_4tree:20140630235408p:plain

できたー!!

マージ間違いには注意しましょうmm

 

2014.07.01 追記

FaceBookで「revertのrevertすればいい」という意見をもらい、うまく行ったので追記。

git checkout branch02
# master→branch02にマージ
git merge master

# さっきrevertしたcommitをさらにrevertする(取り消しの取り消し)
git revert {revertのcommit No}

git checkout master
# branch02→masterにマージ
git merge branch02
git push origin master

これでもうまくいきます。こっちのほうが簡単ですね。ありがとうございますmm

*1:図を書くのにCacooってサービスが使えると聞いて使ってみた。なるほど確かに便利