問題点
Gitを最近(特にバージョン2.27.0以降に)アップデートした場合、git pullを実行するたびに10行ほどのテキストが表示されるようになったかもしれません。これは、ローカルブランチとリモートサーバーの両方が独立して進んでいることをGitが検知したために発生します。以前のGitはデフォルトでこれらの変更を単にマージしていましたが、現在は、コミット履歴が乱雑になるのを防ぐため、これらの状況をどのように処理するかを明示することが求められています。
警告の全文は以下の通りです:
hint: 分岐したブランチを調整する方法を指定せずにプルすることは推奨されません。
hint: 以下のいずれかのコマンドを実行することで、このヒントを非表示にできます:
hint:
hint: git config pull.rebase false # マージ(デフォルトの戦略)
hint: git config pull.rebase true # リベース
hint: git config pull.ff only # Fast-forward(早送り)のみ
クイックフィックス:戦略の選択
この警告を消すには、好みのワークフローを選択する必要があります。これらの設定は、マシン上のすべてのプロジェクトに対してグローバルに設定することも、特定のレポジトリに対してローカルに設定することもできます。
オプション1:標準的なマージ(初心者に最適)
これはGitの伝統的な挙動です。プルすると、Gitは新しい「マージコミット」を作成して、ローカルの作業とリモートの変更を結合します。これにより履歴が実際に発生した通りに保存されます。履歴グラフを確認すると、どこでブランチが結合されたかが明確にわかります。
# すべてのプロジェクトに対してグローバルに設定
git config --global pull.rebase false
# または、現在のプロジェクトのみに設定
git config pull.rebase false
オプション2:リベース(綺麗な履歴を保つのに最適)
リベースは「綺麗好き」のためのオプションです。マージコミットを作成する代わりに、Gitはローカルのコミットを一旦取り出し、その下にリモートの変更を差し込みます。その結果、git logは完全に一直線になります。多くのプロフェッショナルなチームでは、コードレビューが追いやすくなるため、この方法が好まれます。
# すべてのプロジェクトに対してグローバルに設定
git config --global pull.rebase true
# または、現在のプロジェクトのみに設定
git config pull.rebase true
オプション3:Fast-Forwardのみ(最も安全なアプローチ)
これは「安全第一」の設定です。マージを作成せずにブランチポインタを前方に移動できる場合にのみ、プルを完了します。サーバー側にないローカルコミットがある場合、Gitは処理を停止し、手動で解決するように促します。これにより、意図しない乱雑な自動マージを防ぐことができます。
# すべてのプロジェクトに対してグローバルに設定
git config --global pull.ff only
# または、現在のプロジェクトのみに設定
git config pull.ff only
どれを選ぶべきか?
多くの開発者は2つのパターンに分かれます。小規模なチームや個人プロジェクトで作業している場合は、**オプション1(マージ)**が最もスムーズな方法です。しかし、コミット履歴を常にクリーンに保つ必要がある企業で働いている場合は、**オプション2(リベース)**が標準として定められている可能性が高いでしょう。
特定の戦略を一度だけ使用したい場合は、設定全体を変更する必要はありません。コマンドにフラグを追加するだけです:
git pull --rebase
# または
git pull --no-rebase
確認方法
設定が正しく反映されたか、以下のコマンドを実行して現在の設定を確認してください:
git config --global -l | grep pull
pull.rebase=false または pull.rebase=true と表示されれば、あの煩わしい「ヒント」テキストがターミナルを汚すことはもうありません。次回のプルからは、Gitは選択したアクションを即座に実行します。
重要なポイント
- 明示的であることは良いこと: Gitは「隠れた」デフォルト設定を廃止する方向に進んでいます。チームのスタイルに合ったワークフローを明示的に選択することが推奨されています。
- スコープが重要:
--globalを使用すると、コンピュータ上のすべてのリポジトリの挙動が変わります。これを除外すると、現在のフォルダ内の.git/configファイルにのみ影響します。 - もう驚かない: この警告は、あなたとリモートの両方に独自の進捗がある場合にのみ発生します。サーバー側にのみ新しいコミットがある場合、Gitは何も言わずに単純なFast-forwardを実行します。

