[git]git pullで「Need to specify how to reconcile divergent branches」エラーが出た時の原因と解決策

未分類

開発を進めている中で、リモートリポジトリの最新状態を取り込もうと 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を使った開発において日常茶飯事です。エラーが出ても慌てず、適切な合流ルールを指定して開発をスムーズに進めましょう。

コメント

タイトルとURLをコピーしました