開発ブログ
Git、CSS、HTML、正規表現など、入門者がつまづきそうなポイントを中心に、役立ち情報発信します。。

git pull の取り消し方法

最終更新:2018-07-17 by Joe

git pull の取り消し方法です。勢い余って pull してしまったが、やばい、コンフリクトしてしまった・・。一回やり直したい!そんなときの方法です。

git pull の取り消し方法

マージが成功した時の取り消し

まずおさらいですが、 git pull は「git fetch」と「git merge FETCH_HEAD」のショートハンドなのでした。詳しくはこちら:

マージが成功すれば、必然的に参照が進みます。

git pull の取り消しとは、要はpull したリモートブランチのマージを取り消しすればよいですので、いったんマージする前に参照を戻してやりましょう。

// 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です。

// 参照、作業ツリー、インデクスを強制的に戻す
$ git reset --hard HEAD@{1}

マージが失敗(コンフリクト)した時の取り消し(中止)

何気なく、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.

上記のエラーは、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 pull の取り消しに関する参考情報

今回2つのケースを紹介しましたが、いずれも場合も、裏で、git merge FETCH_HEADに先立って実行されるgit fetch により「リモート追跡ブランチ」は更新されてしまいます。これは特に問題にならないことが多いので、今回はとくに触れませんでした。

git reset --hard は何かとよく使うコマンドですので、git reflog とあわせてうまく使いこなしましょう。

上記で触れた、git merge で発生したコンフリクトの解決方法は、こちらです:

以上です。

 

閉じる