開発を進めている中で、リモートリポジトリの最新状態を取り込もうと git pull を実行した際、以下のような長いエラーメッセージに遭遇したことはないでしょうか?
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
...
fatal: Need to specify how to reconcile divergent branches.
今回は、このエラーの意味と、開発スタイルに合わせた3つの解決策をご紹介します。
そもそもどんなエラーなのか?
一言でいうと、「ローカルの履歴とリモートの履歴が枝分かれ(分岐)しており、どう合流させるかGitが迷っている状態」です。
通常、自分以外の開発者がプッシュした場合や、GitHub上で直接ファイルを編集した場合、あるいはCI/CDツールが自動コミットを追加した場合などに発生します。手元のPCでも別のコミットを行っていた場合、Gitは「リモートの変更」と「ローカルの変更」のどちらをどういう順序で繋げばいいのか分からず、処理をストップしてしまいます。
Git 2.27.0以降、この「分岐した履歴の合流ルール(デフォルトの振る舞い)」が明示的に設定されていないと、警告とエラーを出してユーザーに選択を促す仕様になりました。
解決策:合流のルールを指定する
エラーメッセージのヒントにもある通り、解決手段は主に3つ用意されています。ターミナルでいずれかのコマンドを実行してルールを指定してから、再度 git pull を行います。
1. 履歴を綺麗に一本化したい場合(Rebase)
おすすめ度:高
コミット履歴を一直線に保ちたい場合は、リベースを選択します。リモートの最新状態を土台にして、自分の手元のコミットをその後ろに付け直すような動きをします。
git config pull.rebase true
git pull
個人開発や、履歴をスッキリさせたいプロジェクトで好まれる設定です。
2. マージコミットを残したい場合(Merge)
おすすめ度:中
昔ながらのGitの標準的な動作です。「リモートの変更」と「ローカルの変更」を合流させたという記録(マージコミット)が履歴に残ります。
git config pull.rebase false
git pull
チーム開発で「いつ誰のコードが合流したか」という事実を正確に残したい場合に適しています。
3. 分岐している場合はPullを中止したい場合(Fast-forward only)
おすすめ度:状況次第
履歴が枝分かれしている場合は git pull を失敗させ、手動で状況を確認してから対処したい慎重派向けの設定です。
git config pull.ff only
git pull
意図しないマージコミットが作られるのを防ぐことができます。
今後のためにデフォルト設定をしておこう
リポジトリごとに毎回設定するのは手間なので、自分の開発スタイルが決まったらグローバル(PC全体)設定をしておくのが便利です。コマンドに --global を追加するだけで完了します。
グローバル設定の例(rebaseをデフォルトにする場合)
git config --global pull.rebase true
履歴の分岐はGitを使った開発において日常茶飯事です。エラーが出ても慌てず、適切な合流ルールを指定して開発をスムーズに進めましょう。

コメント