Contents
git pull
を実行したときにNot possible to fast-forward, aborting.
と表示され、ローカルをリモートリポジトリと同期できなくなった場合の対応方法です。
原因
リモートリポジトリの更新後、git pull
(= git fetch; git merge
)の前にローカルリポジトリを編集してcommitした場合などに発生するようです。
- Continuous integration (CI) toolを使った自動コミットが含まれる場合は要注意!
- Pull requestをmergeした直後は要注意!
解決方法
落ち着いて、次の通りgit fetch
とgit rebase
を実行すれば副作用を抑えて解決できます1。
main branchの場合:
git pull origin main --rebase
Output:
From (remote repositoryのURL)
* branch main -> FETCH_HEAD
Successfully rebased and updated refs/heads/main.
コマンドのイメージ
リモートの変更内容をdiff-A, ローカルの変更内容をdiff-Bとしたとき2 3、
ローカル側:
- diff-Bをローカルから取り除く
- diff-Aをローカルに反映させる
- diff-Bをローカルに反映させる
リモート側:
- diff-Bをリモートに反映させる
ローカル側もリモート側もdiff-A, diff-Bの順にcommitが設定されます。
あとがき
「一時退避」などでがんばる方法もあると思いますが、履歴が複雑になります(経験談)。履歴を振り返りにくくなるのでrebaseすることをおすすめします。
またリモートとローカルで同じ場所を編集した場合はconflictが発生しますので、そちらも落ち着いて解決しましょう。
お疲れさまでした!