はじめに
Git で pull
を使ってリモートの変更を取り込もうとした際、「divergent branches」というエラーが発生することがあります。
このエラーは、ローカルとリモートのブランチの履歴が食い違っている場合に起きるもので、原因を理解して正しく対処しないと意図しない履歴の破壊などにつながる可能性もあります。
この記事では、このエラーの発生原因と対処方法について、わかりやすくまとめます。
書こうと思ったきっかけ
チーム開発中に Git の pull
操作を行ったところ、「Need to specify how to reconcile divergent branches」というエラーに遭遇しました。
最初は何が起こっているのか分からず戸惑いましたが、調べてみるとこのエラーはリモート側で強制プッシュ (git push --force
) が行われた場合などに発生しやすいことが分かりました。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
同じように困っている人の助けになればと思い、この記事を書くことにしました。
Git Pull 時に発生した "divergent branches" エラーの対処法
背景
以下のような git pull
実行時にエラーが発生しました:
~/Desktop/next-app (git)-[main]- git pull origin main
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
...
fatal: Need to specify how to reconcile divergent branches.
原因
ローカルとリモートの main
ブランチが分岐しており、Git がそれらをどのように統合すべきか明示的な指示が必要だったためです。
ログに記載されていた以下の行:
+ f0d04b6...0dd3570 main -> origin/main (forced update)
これは リモートブランチが強制的に上書きされた(git push --force
された) ことを意味しています。
解決方法①:マージで統合したい場合
git pull --no-rebase
今後も毎回マージで統合したいなら:
git config pull.rebase false
解決方法②:リベースで統合したい場合
git pull --rebase
今後もリベース方式で統合したいなら:
git config pull.rebase true
解決方法③:fast-forward のみ許可したい場合
git pull --ff-only
ローカルをリモートに合わせて強制的に上書きしたい場合(⚠️注意)
git fetch origin
git reset --hard origin/main
⚠️ この操作をすると、ローカルの未コミット変更や独自のコミットはすべて消えます。
まとめ
-
git pull
の挙動は明示的に指定する必要があることがある -
--rebase
を使えば履歴がきれいになりやすい - リモートが強制更新されていた場合は特に注意が必要
- 安全に進めるならまず
git pull --rebase
を試すのがおすすめ
Git のエラーは最初こそ戸惑いますが、仕組みを理解していれば冷静に対処できます。履歴の扱いに慣れておくことで、より安心してチーム開発を進めることができると思いました!