このgit警告に対処する方法は?「分岐したブランチを調整する方法を指定せずにプルすることはお勧めしません」


161

後にgit pull origin master次のメッセージが表示されます。

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.

remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 51.49 KiB | 850.00 KiB/s, done.

その後、プルは正常に実行されました。しかし、それでも、私はこのメッセージについて疑問を持っています。
この場合に最善のことは何ですか?


1
警告が紛らわしいというバグレポートを提出してください。1つのオプションを「推奨」し、バージョンの変更が発生したという理由だけでなく、要求があった場合にのみ警告を表示する必要があります。この予期しない動作により、多くの自動スクリプトが機能しなくなる可能性があります。
WolfgangFahl20年

1
@WolfgangFahl、明示的に変更されるまでデフォルトの動作を維持し続けるため、警告はスクリプトに影響を与えないはずです。プルがゼロ以外の終了コードを返すことはありません(エラーではなく警告である場合)。さまざまなサーバーに展開したいくつかのCI / CDスクリプトは、成功率に影響を与えずに引き続き機能します。
Qumber

@ Qumber-コメントありがとうございます。たとえば、出力が存在しないか、単純なgrepでフィルタリングできる場合、Crontabエントリは電子メールの送信を開始します。予期しない出力は、あらゆる種類の副作用を引き起こす可能性があります。
WolfgangFahl20年

@WolfgangFahl、通常、プルごとに出力が異なります。したがって、それにのみ依存するスクリプトは、おそらくひどく書かれています。また、広範なテストを行わずに実稼働環境をアップグレードしないでください。私はprodをまったくアップグレードしないことを好みます。代わりに、最新のすべてを含む新しいインスタンスを作成し、そこでアプリをホストし、すべてをテストしてから、本番環境にします。
Qumber

回答:


185

デフォルトモードでは、gitpullはgitfetchの省略形であり、その後にgit mergeFETCH_HEADが続きます。

あなたが行うとgit pull origin master
git pull多くの場合、マージコミットを作成マージし、実行します。したがって、デフォルトでは、リモートからのプルは無害な操作ではありません。以前は存在しなかった新しいコミットshaを作成できます。この動作はユーザーを混乱させる可能性があります。これは、無害なダウンロード操作であると思われるものが、実際には予測できない方法でコミット履歴を変更するためです。

これを回避するには、

git pull --ff-only

(またはそうではありませんか?どちらがあなたのニーズに合うかを見るために読んでください)

を使用するとgit pull --ff-only、Gitは、新しいコミットを作成せずにブランチを「早送り」できる場合にのみブランチを更新します。これができない場合git pull --ff-onlyは、エラーメッセージを表示して中止します。

--ff-onlyデフォルトで常に使用するようにGitクライアントを構成できるため、コマンドラインフラグを忘れた場合でもこの動作が得られます。

git config --global pull.ff only

注:--globalフラグは、マシン上のすべてのリポジトリーに変更を適用します。現在のリポジトリに対してのみこの動作が必要な場合は、フラグを省略してください。

ここから撮影



この警告は、Joeが回答で指摘したように、Git2.27で追加されました。

これは完全な警告がどのように見えるかです:

分岐したブランチを調整する方法を指定せずにプルすることはお勧めしません。次のプルの前に次のコマンドのいずれかを実行することで、このメッセージをスケルチできます

。gitconfig pull.rebase false#マージ(デフォルトの戦略)
git config pull.rebase true#rebase
git config pull.ff only#早送りのみ

「gitconfig」を「gitconfig--global」に置き換えて、すべてのリポジトリのデフォルト設定を設定できます。コマンドラインで--rebase、-no-rebase、または--ff-onlyを渡して、呼び出しごとに構成されたデフォルトをオーバーライドすることもできます。

警告はオプションとして3つのコマンドを提示し、これらすべてが警告を抑制します。しかし、それらは異なる目的を果たします。

git config pull.rebase false     # merge (the default strategy)

これにより、デフォルトの動作が維持され、警告が抑制されます。

git config pull.rebase true      # rebase

これは実際にはリモートブランチの上でコミットし、ローカルとリモートの両方で単一のブランチを維持します(2つの異なるブランチ(ローカルとリモートの2つのブランチが関係するデフォルトの動作とは異なります)と、2つを組み合わせるためにマージが実行されます)。

git config pull.ff only          # fast-forward only

これは、ローカルブランチを早送りできる場合にのみプルを実行します。そうでない場合は、エラーメッセージで中止されます(コミットは作成されません)。


更新:

あなたが持っている場合はGit 2.29上記または、あなたは今設定することができますpull.fffalsetrueあるいはonly警告を取り除くために。

git config pull.ff true

true-これがデフォルトの動作です。プルは、可能であれば早送りされ、それ以外の場合はマージされます。

git config pull.ff false

false -プルが早送りされることはなく、マージは常に作成されます。

git config pull.ff only

only -プルは可能であれば早送りされます。それ以外の場合、操作はエラーメッセージで中止されます。


7
あなたの答えに時間と労力を費やしてくれたことに感謝しますが、率直に言って、これは私にはまだ完全に理解できません。
JaredNedzel20年

1
ここでコメントし、警告が分岐がされているかどうかに影響されない、実際に発散します。最初の「あなたのブランチはおそらく分岐しています。」誤解を招く可能性があります。
ジョー

3
私が言わなければならないのは、メッセージの3つのオプションは、私がメッセージを抑制するのに機能しなかったということです。しかし、ここでの答え(git config --global pull.ff onlyはしました
DiskJunky

1
あはは!@Qumberに感謝します。すでに試しましたがpull.rebase false、説明どおりに機能しませんでした。それは常にマージコミットを作成し、早送りすることはありませんでした。根本的な原因は、私がmerge.ff false設定を持っていたということでした。その設定をクリアした後、必要なときに早送りします。ここにあるドキュメント(git pullドキュメントとほぼ同じ)
stwr6 6720

1
下記のGit2.29オプションが含まれています。良い点です。賛成。
VonC

63

これはGit2.27で追加された新しい警告です:

 * "git pull" issues a warning message until the pull.rebase
   configuration variable is explicitly given, which some existing
   users may find annoying---those who prefer not to rebase need to
   set the variable to false to squelch the warning.

以下のための警告を削除するには、お好みのデフォルトの動作に推奨値の1を設定しgit pull、コマンドラインで動作を指定しない場合(使用して--ff--no-ff--ff-only--rebase)。すべての場合において、可能であれば早送りgitgit fast-forwardingとは何ですか?)マージを試みます。設定は、ブランチに変更があったがリモートブランチに存在しない場合に何が起こるかを制御します。

  git config pull.rebase false  # merge (the default strategy)

これは既存のデフォルトの動作です。これを警告なし、および動作の変更なしに設定します。gitリモートブランチをローカルブランチにマージします。

  git config pull.rebase true   # rebase

ここでgitは、リモートブランチの上に変更をリベースしようとします。いつgitpull --rebaseを使用する必要がありますか?を参照してくださいなぜそれが必要なのかについての詳細は。

  git config pull.ff only       # fast-forward only

早送りマージが不可能な場合、git続行を拒否します。git pull--rebaseとgitpull --ffのみの引用符の違いとして:

現在のHEADがすでに最新であるか、マージが早送りとして解決できる場合を除いて、マージを拒否し、ゼロ以外のステータスで終了します


19
これは実際には最も正しい答えです。なぜなら、gitを10年近く使用した後、人々(私のような)が突然この警告を目にする理由を説明しているからです。ただし、提供されているオプションについて何らかのガイダンスが提供されていると便利です。たとえば、pull.ffを「only」に設定しても、「pull--rebase」を実行してオーバーライドすることを妨げることはありません。
kdopen

違いは何だpull.rebase = trueとはbranch.autoSetupRebase = always
tekumara


1
「ブランチに変更があるが、リモートブランチには存在しない場合。」それなら、gitはその場合にのみこの警告をスローするべきだと私には思えます。メインラインを引っ張っている場合(そしてメインラインが適切に使用されている場合)、それについて心配する必要はありません。
キー

4
@Joe私はあなたの答えが好きで、それは正しい答えだと思いますが、gitが実際に何かをしたかどうかに関係なく、これが表示さます。この警告を発行する適切なタイミングは、gitが何かをしなければならない場合であり、このメッセージで失敗するはずだと思います。このメッセージを事前にスパムユーザーに送信するだけではありません。gitとの私の愛/憎しみの関係に貢献するさらに別のこと。
ジョン・V

7

git config pull.ff onlyまたは同等git pull --ff-onlyに最も安全なものです。その理由は、リベースによって履歴が上書きされ、別の開発者が同じブランチに強制的にプッシュした場合にコミットが失われる可能性があるためです。

しかし、それらはすべて有効です。


3

注:以前、「git pullman)で、履歴をマージ、リベース、または早送りのみを受け入れる必要があるとユーザーが言わなかった場合に警告するように教えましたが、pull.ff構成変数を設定したユーザーに対して警告がトリガーされました。

これは、Git 2.29(2020年第4四半期)ではもはや当てはまりません(つまり、警告がなくなります)。

Alex Henrie()によるcommit 54200ce(2020年9月24日)を参照してください。(合併によりJunio C浜野- -コミット299deea、2020年9月29日)alexhenrie
gitster

pullpull.ff設定されている場合は警告しない

サインオフ:Alex Henrie

設定するのに十分理解しているユーザーpull.ffは、追加の指示は必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.