Git

【Git基礎】間違ってマージしてしまった!そんな時に役立つマージを取り消す2つの方法を解説

Github

 

今回はGitの操作を誤り、間違ってマージしてしまった時の対処法を2つ解説したいと思います。マージした結果、予期しないコンフリクトが起きてしまい、やっぱりマージコミットを取り消したい!というような場面にも使えますね。

下準備

まずはアプリケーションを立ち上げ、「initial commit」まで実行しておきます。今回の場合は「CommitApp」というアプリケーション名で立ち上げました。

続いてブランチを新たに切ります。今回は「merge-test」というブランチを作成します。作成後はその「merge-test」ブランチに移動します。

↓ ブランチ作成からの移動

$ git branch merge-test
$ git checkout merge-test

 

その後以下のようにREADMEを編集し、コミット&プッシュを行いました。

↓ READMEに「マージを取り消したい!」と追記

Image from Gyazo

 

↓ コミット&プッシュ

$ git add .
$ git commit -m 'merge cancel test'
$ git push origin merge-test

 

次にGithubのページにアクセスし、プルリクエストを作成&マージまで行いましょう。

↓ プルリクエスト作成&マージ

Image from Gyazo

 

最後にmasterブランチに切り替え、pullでリモートの変更をローカルに取り込んで完了です。

$ git checkout master
$ git pull origin master

 

これで下準備は終わりました。次の項目からマージを取り消す方法を見ていきましょう。

マージを取り消す方法

git reset –hard <コミット番号>

マージを取り消す方法の1つ目は、全ての歴史を書き換えることで有名な「reset –hard」コマンドです。マージのコミット番号を指定するだけで、マージを取り消すことができる便利なコマンドですが、保存していない履歴やステージングエリアにある情報も全て消し飛ぶので注意して実行しましょう。

では実際に先ほどのマージを「reset –hard」コマンドで取り消してみます。

$ git checkout master
$ git log //戻りたい地点のコミットの番号を確認
$ git reset --hard d1f7cc360d8b58d3fd436646542bc95c231e1305

 

これでローカルはマージする前の状態に戻りました。

しかしここで1つ問題があります。それはローカルではマージする前の状態に戻りましたが、リモートではその変更が変わっていないということです。

↓ reset –hardでコミットを消してもリモートは残ったまま

リモートに残ってしまう

 

ではこの場合、どうすれば良いのでしょうか。答えは、強制的にローカルの情報をリモートにプッシュするということです。

以下のコマンドを打ち込みましょう。

$ git push -f origin master

 

するとリモートのコミット履歴も綺麗に消え去るはずです。

git revert -m 1 <コミット番号>

もう一つの解決方法はrevertコマンドです。マージコミットを打ち消すコミットを新たに生成することでマージを取り消します。

では同様に先ほどのマージをrevertコマンドを使って取り消してみましょう。

$ git revert -m 1 0173043ce3e66c173d96d297184c9318585e8ecc

-m <親番号>を指定することで、特定の履歴を打ち消すことができます。例えば、masterブランチにmerge-testブランチをマージさせたのであれば、masterが1、merge-testが2となります。

 

↓ マージコミットの打ち消しコミットが生成されている

revertコマンド

 

あとは、この変更をリモートにも反映させるためプッシュするだけです。

$ git push origin master

 

↓ リモートにもrevertした変更が反映されている

revertコミットをリモートに反映

 

これでマージする前の状態に戻ったはずです。しかし注意すべき点としてはマージした事実は消えないということです。 そのため、そのブランチを再度マージしたとしても、取り込みが発生しません。

その場合は新しくブランチを作成してマージするようにしましょう。

まとめ

  • git reset –hard <コミット番号>でマージコミットを取り消す
  • git revert -m 1 <コミット番号>でマージコミットを取り消す

参考図書

 

 

今回は誤ってマージしてしまった時に役立つ、マージを取り消すコマンドを2つ解説しました。「reset –hard」と「revert」コマンドは同じマージコミットを取り消すコマンドでも、それぞれで役割が違うのでしっかりと理解した上で使っていきましょう。