🎃

git pull時のwarningの対応

2023/12/12に公開

git pull の際に以下のエラーが出てきた時の対応をまとめます。

warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:

  git config pull.rebase false  # merge (the default strategy)
  git config pull.rebase true   # rebase
  git config pull.ff only       # fast-forward only

You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.

正式な対応としてはメッセージの通り git config pull.rebase falsegit config pull.rebase truegit config pull.ff only を設定しておけば、以降この警告が表示されることはありません。

どれを設定するかはチームの方針によりますが、チーム内で統一しておいた方が良いです。

ただし、デフォルトの動作で問題ない場合は、git config --global pull.rebase falseをしておけば警告が出なくなります。

今回の記事は推奨の設定をしない場合の対応です。

どうしても設定したくない時の対応

チーム内で方針が統一されていない場合など上述のコマンドを実行できない場合には以下のように対応しています。

commitしてしまっている差分が原因の場合は commit歴を取り消します。これはcommitログが少ない場合の対応です。

# 直前のコミットのみ取り消す 
git reset --soft HEAD^

--softのオプションを指定することでインデックスワーキングツリーはそのまま保持できます。

# 変更差分を退避する
git stash
# ブランチの差分を pull する
git pull origin ブランチ
# 最新のstashを適用して、stashから削除
git stash pop

別の対応方法としては、ローカルのmainブランチを削除してしまう方法もあります。

なお、こちらもどうしても設定したくない場合の対応です。

# 別ブランチへチェックアウト
git checkout -b branch-name
# ローカルのmainブランチを削除
git branch -D main
# リモートのmainブランチを取得
git fetch origin main
# リモートのmainブランチを作成したブランチへマージ
git merge main

この対応により、リモートのmainブランチの差分を開発中のブランチへ取り込むことができます。

なお、特に設定しない理由もないはずなのと、設定しない限り何度もこの警告で止められるので、上記のように無理やり対応することはできますが、本来は当初のメッセージの通り対応する方が良いです。

複数ブランチがあるかぎり発生する可能性がある警告なので、これを機に是非設定してみてください。

私はデフォルトの挙動(git config --global pull.rebase false)に設定しました。

Discussion