如何处理这个git警告?“不建议在不指定如何协调分歧分支的情况下进行拉动”


163

之后,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
提交错误报告,使警告令人困惑。应该“推荐”一个选项,并且警告应仅在请求时显示,而不仅仅是因为发生了版本更改。现在,许多自动脚本可能会因这种意外行为而中断。
Wolfgang Fahl

1
@WolfgangFahl,该警告不应影响任何脚本,因为它会继续保留默认行为,直到明确更改为止。它不应该导致请求返回非零的退出代码(因为这是警告,而不是错误)。我在各种服务器上部署的一些CI / CD脚本继续正常工作,而成功率却未受影响。
Qumber

@Qumber-感谢您的评论。如果显示的输出不存在或可以通过简单的grep过滤,则Crontab条目将例如开始发送电子邮件。意外的输出会产生各种副作用。
Wolfgang Fahl

@WolfgangFahl,通常每个拉动都有一些不同的输出。因此,任何仅依赖于此的脚本都可能写得不好。另外,未经广泛测试,不应升级生产环境。我宁愿完全不升级产品。相反,我创建了一个包含所有最新内容的新实例,在其中托管我的应用程序,测试了所有内容,然后将其投入生产。
6:03

Answers:


191

在默认模式下,git pull是git fetch的简写,其次是git merge FETCH_HEAD。

执行时git pull origin master
git pull执行合并,通常会创建合并提交。因此,默认情况下,从远程进行拉动并非无害操作:它可以创建以前不存在的新提交sha。这种行为可能会使用户感到困惑,因为看起来像是无害的下载操作实际上会以不可预测的方式更改提交历史记录。

为了避免这种情况,您需要

git pull --ff-only

(还是不行?请继续阅读,看哪一个适合您的需求)

使用git pull --ff-only,Git仅在可以“快速转发”而不创建新提交的情况下才更新您的分支。如果无法做到这一点,git pull --ff-only只需中止并显示一条错误消息。

您可以将您的Git客户端配置--ff-only为默认情况下始终使用,因此即使您忘记了命令行标志,也可以得到以下行为:

git config --global pull.ff only

注意:该--global标志将更改应用于计算机上的所有存储库。如果只希望您所在的存储库具有此行为,请省略该标志。

这里取



正如Joe在其回答中指出的那样,此警告已添加到Git 2.27中。

完整的警告如下所示:

不建议在不指定如何协调分歧分支的情况下进行拉动。您可以通过在下一次拉取之前运行以下命令之一来抑制此消息:

git config pull.rebase false#合并(默认策略)
git config pull.rebase true#
仅对git config pull.ff重新设置#仅快速转发

您可以将“ git config”替换为“ git config --global”,以为所有存储库设置默认首选项。您还可以在命令行上传递--rebase,-no-rebase或--ff-only以覆盖每次调用配置的默认值。

该警告显示三个命令作为选项,所有这些命令都会禁止显示该警告。但是它们有不同的用途:

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

这将保留默认行为并禁止显示警告。

git config pull.rebase true      # rebase

这实际上是在远程分支的顶部提交的,在本地和远程维护一个分支(不同于默认行为,其中涉及两个不同的分支-一个在本地,另一个在远程),并且要合并两者,执行合并)。

git config pull.ff only          # fast-forward only

仅当本地分支可以快速转发时,才执行拉取。如果没有,它只会中止并显示一条错误消息(并且不会创建任何提交)。


更新:

如果您具有Git 2.29或更高,则现在可以设置pull.fffalsetrueonly摆脱警告。

git config pull.ff true

true-这是默认行为。如果可能的话,Pull是快进的,否则将被合并。

git config pull.ff false

false -永远不会快速拉入,并且始终会创建合并。

git config pull.ff only

only -如果可能,将快速拉出,否则操作将中止并显示一条错误消息。


7
我感谢您付出的时间和精力,但是坦率地说,这仍然是我完全无法理解的。
Jared Nedzel '20

1
由于在这里评论,警告没有被分支是否被影响实际上分歧。最初的“您的分支可能正在分歧”。可能会产生误导。

3
我必须说,消息中的三个选项对我来说无效。然而这里的答案(git config --global pull.ff only那样
DiskJunky

1
啊哈!谢谢@Qumber。我已经尝试过了pull.rebase false,但是没有按照描述的那样工作。它总是在创建合并提交,从不进行快速转发。根本原因是我有merge.ff false设置。清除该设置后,它会在需要时快速前进。这里的文档(几乎与git pull文档相同)
stwr667 '20

1
您已经包括了我在下面提到的Git 2.29选项,很好。已投票。
VonC

63

这是一个新的警告增加Git的2.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.

要删除警报,设置的建议值之一为您喜欢的默认行为git pull,如果你没有在命令行中指定的行为(使用--ff--no-ff--ff-only--rebase)。在所有情况下,如有可能,git将尝试进行快进(什么是git fast-forwarding?)合并。这些设置控制分支中有更改但远程分支中存在更改时发生的情况。

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

这是现有的默认行为;将其设置为无警告,且行为不变;git会将远程分支合并到本地分支。

  git config pull.rebase true   # rebase

在这里,git将尝试将更改基于远程分支。请参阅何时应使用git pull --rebase?有关为什么您可能想要这样做的更多详细信息。

  git config pull.ff only       # fast-forward only

如果无法进行快速合并,git则将拒绝继续。作为git pull --rebase和git pull --ff-only引号之间的区别

拒绝合并并以非零状态退出,除非当前HEAD已经是最新的,或者可以将合并解析为快进


19
这实际上是最正确的答案,因为它解释了为什么人们(像我一样)在使用git近十年后突然看到此警告。但是,如果对所提供的选项给出一些指导,将很有用。例如,指出将pull.ff设置为“ only”并不能防止您执行“ pull --rebase”来覆盖它。
kdopen

pull.rebase = true和之间有什么区别branch.autoSetupRebase = always
tekumara


1
“当分支中有更改但远程分支中没有更改时。” 然后在我看来,git只会在这种情况下才发出此警告如果我要拉我的主线(并且主线使用正确),则无需担心。
基思·泰勒

4
@Joe我喜欢您的答案,并认为这是正确的答案,但是无论git是否实际执行任何操作,您都可以看到它。我觉得发出此警告正确的时间,如果Git有到的东西,那么应该会失败,此消息。不只是垃圾邮件用户会提前收到此消息。另一件事有助于我与git的爱恨关系。
乔恩(Jon V)

7

git config pull.ff only或等效地git pull --ff-only是最安全的一种。原因是,如果另一个开发人员强制将其推到同一分支,则重新建立基准可能会覆盖历史记录并可能导致提交丢失。

但是所有这些都是有效的。


3

注意:前面我们曾教过“ git pullman警告,当用户不说需要合并历史记录,重新设置历史记录或仅接受快速转发时,但是会警告那些设置了pull.ff配置变量的用户。

Git 2.29(2020年第四季度)不再是这种情况(意味着:不再发出警告)。

参见Alex Henrie(提交的54200ce(2020年9月24日(通过合并JUNIOÇ滨野- -提交299deea,2020年9月29日)alexhenrie
gitster

pull:如果pull.ff已设置,请勿发出警告

签名人:Alex Henrie

足够了解设置的用户pull.ff不需要其他说明。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.