gitでまだマージしたくない変更を間違ってmasterにマージしてしまった時の対処
久々にgitですごい躓いたので。
説明すると、branch02の内容を謝ってmasterにマージしてしまった後、それに気づかずbranch01の内容もmasterにマージしてしまった。
あとから気づいたので、branch02の内容だけmasterから取り除いて、もろもろレビューが終わってからbranch02の内容はmasterにマージしたい。
言葉で説明すると意味不明なので図*1がこちら
commitを取り消すコマンドはgit reset
が有名だけど、git reset
はあるcommit時点まで戻り、それ以降のcommitをなかったことにするというものなので、branch01のcommit内容も消されてしまう。(まあ戻そうと思えば戻せる)
そこでまず使うのがgit revert
git revert {commit No}
これで、「ある特定のcommit内容を取り消す」というcommitを行うことが出来る(git reset
と違って本当になかったことにされるわけじゃない)
ここまではOK。
そのあとbranch02のレビューが完了したので、ここで再びbranch02をマージしてみる。
これがbranch02→masterへの変更内容。running.txtの2行目に文章を追加してます。
で、branch02→masterへのマージが完了したところで、masterのrunning.txtを見てみると。。。
あれ!?変更が反映されていない!???
実は、先ほど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
できたー!!
マージ間違いには注意しましょう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