はじめに
ローカルで機能開発中に、最新のリモートブランチの動作確認をしようと、git pull
をしました。
しかし、develop ブランチに切り替えるのを忘れており、作業中のブランチにpullしてしまったため、pullを取り消す方法についての備忘録です。
前提
- branchAで作業中
- まだコミットしていないファイルがある状態でpullしてしまった
対応方法
git pull
はgit fetch
でリモートの最新状態のブランチを持ってきて、ローカルの現在いるブランチにマージするコマンドなので、pull してきたリモートブランチのマージを取り消しすればよいだけです。
つまりマージする前の位置にHEADを移動させればいいことになります。
1. HEADの移動履歴を確認
まずは、現在のHEADの位置を確認しましょう。
% git reflog
# 現在のHEADの位置
e6ec135b (HEAD -> feature/branchA) HEAD@{0}: pull origin HEAD: Merge made by the 'recursive' strategy.
# ここに戻したい
eea24d80 HEAD@{1}: commit: branchA での作業内容
d4352211 (develop) HEAD@{2}: checkout: moving from develop to branchA
これでマージ前のHEADの位置がHEAD@{1}
で有ることがわかりました。
後はgit reset --hard
を利用して、強制的にHEADを移動するだけです。
git reset --hard
は、HEAD,作業ツリー、インデックスのすべてを指定したコミットに書き換えるコマンドになります。
注意点
ここで1つ注意しておくことは、現在のブランチで作業中の場合は、変更をコミットするか退避させておかないと、現在の作業内容が消えてしまうことです。
今回はgit stash
を使って退避させる方法を取ります。
2. 作業中ブランチの変更を退避
現在branchAで作業中の内容を退避させます。
※今回はまだ修正中でコミットしたくないため、この方法を適用
git stash save "コメント" -u
3. git pullの取り消し
git reset --hard HEAD@{1}
これで上手くHEADの位置が元に戻っていれば完了です。
さいごに
間違えてしまっても焦らずに対処できるように、これからもどんどん気づいたことをかいていきます。