git pull の取り消し方法です。勢い余って pull してしまったが、やばい、コンフリクトしてしまった・・。一回やり直したい!そんなときの方法です。
目次
git pull の取り消し方法
それでは、git pull の取消方法に関して、2つのパターンについて、それぞれ解説していきます。
- git pull したブランチが、現在のローカルブランチにマージされた場合
- git pull したブランチが、現在のローカルのブランチとコンフリクトした場合
さっそく見ていきましょう。
Case 1マージが成功した時の取り消し
まず、基本のおさらいですが、 git pull は「git fetch」と「git merge FETCH_HEAD」のショートハンドなのでした。詳しくはこちら:
git pull の取り消しとは、要は pull したリモートブランチのマージを取り消しすればよいですので、マージする前の位置に参照 (HEAD) を戻してやりましょう。
HEADの移動履歴は、「git reflog」に記録されていますね。ref(参照) のログだから「reflog」です。
// HEAD の移動履歴を表示
$ git reflog
// 出力
321dd75 (origin/master, master) HEAD@{0}: merge: merging origin/master to master
321dd75 (origin/prod, prod) HEAD@{1}: checkout: moving from temp to prod
eceee42 (origin/tmp, tmp) HEAD@{2}: commit: fix the form bug.
321dd75 (origin/prod, prod) HEAD@{3}: reset: moving to prod.
321dd75 (origin/prod, prod) HEAD@{4}: checkout: moving from prod to temp
...
マージ前の参照が HEAD@{1} だとわかりました。
あとは git reset --hard を利用して、強制的にHEADを移動します。git reset --hard は、HEAD,作業ツリー、インデックスのすべてを指定したコミットに書き換えるコマンドでしたね。
git reset --hard について詳しくは、こちら:
// 参照、作業ツリー、インデクスを強制的に戻す
$ git reset --hard HEAD@{1}
はい、うまく、取り消しできましたね?
Case 2マージが失敗(コンフリクト)した時の取り消し(中止)
何気なく、git pull を実行したら、あれ、ローカルとコンフリクトしてエラーで止まってしまった・・・。どうしよ・・。というケースです。
// pull を実行
$ git pull origin masetr
// コンフリクトのエラー!
From bitbucket.org:my-project/www-creators
* branch master -> FETCH_HEAD
Auto-merging index.php
CONFLICT (content): Merge conflict in index.php
Automatic merge failed; fix conflicts and then commit the result.
上記のエラーは、git merge FETCH_HEAD (checkout しているローカルブランチへのマージ)が失敗しているのです。
試しに git status してみましょう。
// 様子をみる
$ git status
// 出力、マージ中っていってる!
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.php
no changes added to commit (use "git add" and/or "git commit -a")
マージが止まっていますね。マージが中断状態となっています。
コンフリクトを解決して、git merge --continue しても良いのですが、今回この記事では、取り消しをするテーマですので、サクッと取り消してしまいましょう。
merge の中止は、git merge --abort でOKです。
// マージを中止
$ git merge --abort
git merge --abort をすれば、マージする直前まできれいに戻してくるんだね。助かる〜。
git pull の取り消しに関する参考情報
今回2つのケースを紹介しましたが、いずれも場合も、裏で、git merge FETCH_HEAD に先立って実行されるgit fetch により「リモート追跡ブランチ」は更新されてしまいます。これは特に問題にならないことが多いので、今回はとくに触れませんでした。
git reset --hard は何かとよく使うコマンドですので、git reflog とあわせてうまく使いこなしましょう。
上記で触れた、git merge で発生したコンフリクトの解決方法は、こちらです:
以上です。
git reflog は取り消し操作に役立つね!