Edited at

【git】マージしたけどやっぱりやめたい時のやり方4種類

20190501追記


  • わかりにくい文章を修正しました

  • 「その3 パート1」の方法を追加しました

追記ここまで

gitでマージ作業を始めたけど、もろもろの理由からやっぱりやめたいときのやり方3種類です。


その1 「マージしたらコンフリクトした。やっぱりやめよう。」

マージしたらコンフリクトした、コンフリクトするとは思わなかった、いったんやめよう、などといういうときです。

コンフリクトの編集をしていないときに限ります。

$ git merge --abort

マージする前の状態に戻ります。


その2 「マージしたらコンフリクトした。コンフリクトを解消しようといろいろ編集した。でもやっぱりやめよう。」

コンフリクト解消のためにコードをいろいろ編集したけどやっぱりマージやめよう、というときです。

$ git reset --hard HEAD

編集した内容もマージもすべて取り消されます。


その3 「マージすべて完了した。でもやっぱりやめよう。」パート1

マージが完了(コミットまで)したけれども、やっぱりマージ前に戻したい、というとき、パート1です。

revertコマンドを使用して、マージコミットを取り消します。

$ git revert -m 1 <merge_commit>

マージコミットの場合、親が2つに分かれます。

revertコマンドを使う場合は、revertした結果どちらの親に戻すのかを-m 数字で指定します。数字が親を表します。

詳しくはこちらの記事を見てください。

https://qiita.com/chihiro/items/2fa827d0eac98109e7ee


その3 パート1 の注意!!!

この方法の場合、取り消したマージコミットに含まれていた変更を再度マージすることはできなくなります。

例)

ブランチA に対して ブランチB をマージ



マージコミットをrevertして、ブランチAの状態に戻す



ブランチA に対して ブランチB をマージ ← できない(変更が取り込まれない)

revertコマンドを使うと、コミット履歴としては「マージした」という歴史を残したままマージを取り消します。

2つのブランチがマージされたという事実は残るので、差分は(マージした時点のコードとしては)何もないということになります。


その3 「マージすべて完了した。でもやっぱりやめよう。」パート2

マージが完了(コミットまで)したけれども、やっぱりマージ前に戻したい、というとき、パート2です。

resetコマンドを使用して、コミットの履歴自体を取り消します。

$ git reset --hard ORIG_HEAD

マージする前のHEADに戻ります。


その3 パート2 の注意!!!

この方法は一度できたコミットを取り消すことになります。

revertコマンドとは違い、「コミットを取り消した」という履歴も残りません。

一度pushなどを行って、ほかの開発者に公開されているコミットを取り消すことは絶対にしてはいけません。

自分のローカルだけでマージしてみたけど(pushはしていない)やっぱりやめる、などのローカルの変更をもとに戻す場合にのみ使用しましょう。