如何处理这个 git 警告?“不鼓励在不指定如何协调不同分支的情况下进行拉取”

Dav*_*ghi 446 git

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.
Run Code Online (Sandbox Code Playgroud)

那么pull就成功了。但是,我仍然对这条消息表示怀疑。
在这种情况下,最好的做法是什么?

Qum*_*ber 492

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

当您执行 a 时git pull origin master
git pull执行合并,这通常会创建合并提交。因此,默认情况下,从远程拉取并不是一个无害的操作:它可以创建一个以前不存在的新提交 sha。这种行为可能会使用户感到困惑,因为感觉应该是无害的下载操作实际上以不可预测的方式改变了提交历史。

为避免这种情况,您需要

git pull --ff-only
Run Code Online (Sandbox Code Playgroud)

(或不?继续阅读,看看哪一个符合您的要求)

使用git pull --ff-only,Git 只会更新您的分支,前提是它可以“快进”而无需创建新的提交。如果这不能完成,git pull --ff-only只需中止并显示错误消息。

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

git config --global pull.ff only
Run Code Online (Sandbox Code Playgroud)

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

取自这里



这个警告是在 Git 2.27 中添加的。

这是完整警告的样子:

不鼓励在未指定如何协调不同分支的情况下进行拉取。您可以通过在下一次拉取之前的某个时间运行以下命令之一来

消除此消息:git config pull.rebase false # merge (默认策略)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only

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

警告显示三个命令作为选项,所有这些都将抑制警告。但它们有不同的用途:

git config pull.rebase false     # merge (the default strategy)
Run Code Online (Sandbox Code Playgroud)

这将保留默认行为并抑制警告。

git config pull.rebase true      # rebase
Run Code Online (Sandbox Code Playgroud)

这实际上是在远程分支之上提交,在本地和远程维护一个分支(与涉及两个不同分支的默认行为不同 - 一个在本地,另一个在远程 - 并且,将两者结合起来,执行合并)。

git config pull.ff only          # fast-forward only
Run Code Online (Sandbox Code Playgroud)

如果本地分支可以快进,这只会执行拉取。如果没有,它会简单地中止并显示错误消息(并且不会创建任何提交)。


更新:

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

git config pull.ff true
Run Code Online (Sandbox Code Playgroud)

true- 这是默认行为。如果可能,拉动是快进的,否则它被合并。

git config pull.ff false
Run Code Online (Sandbox Code Playgroud)

false - 拉动永远不会快进,并且总是会创建合并。

git config pull.ff only
Run Code Online (Sandbox Code Playgroud)

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

  • 我很感谢您在回答中投入的时间和精力,但坦率地说,这对我来说仍然完全无法理解。 (120认同)
  • 我不得不说,消息中的三个选项“没有”让我压制该消息。然而这里的答案(`git config --global pull.ff only`)_did_。 (4认同)
  • 正如[此处评论](/sf/ask/4385718011/#comment111756400_62653694),该警告不受分支是否*实际上*分歧的影响。最初的“你的分支可能存在分歧。” 可能会产生误导。 (3认同)
  • 谢谢你的回答。帮了很多忙。我只使用功能分支。在我的开发中没有任何本地变化。因此,默认值对我来说效果很好。但是,如果我使用 pull.ff 并发生冲突,我会如何解决该问题?如果 ff 不可能,我该怎么办? (3认同)
  • 这是一个非常好的解释。实际上,我之前在拉动时遇到过这种意想不到的行为。对我来说,当我使用“git pull origin main”更新主分支时,当我仍在本地功能分支上时(我忘记先在本地签出到主分支),就会发生这种情况。它最终提取了远程主要更改并将它们合并到我的功能分支中。ff 似乎是一个更安全的策略。 (3认同)
  • 您已经包含了我在下面提到的 Git 2.29 选项,很好。已投赞成票。 (2认同)

Joe*_*Joe 111

这是一个新的警告增加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.
Run Code Online (Sandbox Code Playgroud)

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

  git config pull.rebase false  # merge (the default strategy)
Run Code Online (Sandbox Code Playgroud)

这是现有的默认行为;将此设置为没有警告,也没有行为改变;git将远程分支合并到您的本地分支。

  git config pull.rebase true   # rebase
Run Code Online (Sandbox Code Playgroud)

在这里,git将尝试在远程分支之上重新设置您的更改。请参阅何时应该使用 git pull --rebase?有关您可能想要的原因的更多详细信息。

  git config pull.ff only       # fast-forward only
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这实际上是最正确的答案,因为它解释了为什么人们(像我一样)在使用 git 近十年后突然看到这个警告。然而,如果对所提供的选项给予一些指导,将会很有用。例如,指出将 pull.ff 设置为“only”并不会阻止您执行“pull --rebase”来覆盖它。 (34认同)
  • @Joe我喜欢你的答案,并且认为这是正确的答案,但是无论 git 是否实际上完成了任何事情,你都会看到这一点。我觉得发出此警告的正确时机是,如果 git 必须执行某些操作,那么应该会失败并显示此消息。不仅仅是预先向用户发送此消息的垃圾邮件。还有一件事让我对 git 又爱又恨。 (6认同)
  • @tekumara参见/sf/answers/1115490911/ (2认同)
  • “当您的分支中有更改但远程分支中不存在时。” 那么在我看来,git 应该只抛出这个警告*如果是这种情况。*如果我拉动我的主线(并且主线使用正确),我不需要担心这一点。 (2认同)
  • 乔,谢谢你的回答,这很有帮助。我不确定我是否理解 ff-only 标志的含义。如果由于启用了 ff-only 而导致 `git pull` 失败,那么怎么办?此时,必须手动进行合并或变基才能取得进展。因此,如果目标是避免混乱的依赖关系图,这不会改变任何事情——无论以何种方式,自动或手动,你的依赖关系图最终都会变得一团糟。我想如果你必须用手来做,你就能更好地控制它。然而我猜想人们通常不会比 Git 本身更知道如何避免混乱。 (2认同)

Sud*_*n D 95

git pull origin main --rebase

为我工作!

  • 同样在这里。如果您刚刚在 origin 上进行了提交,但在本地提交其他内容之前忘记拉取,但没有发生冲突,那么这个(一个简单的变基)将为您解决这个问题。 (7认同)

chr*_*g91 55

如果将 Git 与 Visual Studio(2019 或 2022)一起使用并开始遇到此问题,则可以从 Git 选项卡 -> 设置定义此选项。

拉取时重新调整本地分支的基础

如果您希望分支“合并”更改,则设置为 false;如果您想“重新设置”更改,则设置为 True。

VS 2019 - Git

  • 这在 Visual Studio Enterprise 2022 上确实对我有用。 (3认同)

Sid*_*jee 50

这个对我有用

git config --global pull.ff true
Run Code Online (Sandbox Code Playgroud)


Sno*_*ash 38

运行这个:

git config pull.ff only
Run Code Online (Sandbox Code Playgroud)

并祝贺你自己可以继续你的工作。

  • `致命:无法快进,正在中止。` (136认同)
  • @y_159 也许对你来说太晚了,但对其他人可能有用。为了解决“致命:无法快进,中止”警告,我使用了“git pull origin <branch> --rebase”。我还注意到我没有设置上游,所以在第一次推送中我添加了(`-u`),例如`git push -u origin <branch>`。 (55认同)
  • 终于!...谢谢! (3认同)
  • 这并不能解释它的作用,只会导致更多的问题,当 ff 不可能时,没有经验的用户会不知所措——此外,非默认行为会更困难进行调试。 (3认同)
  • @ViníciusCerqueiraBonifácio 我通常会收到此错误,我最终会执行“git pull --no-ff”。我会尝试你的建议。 (2认同)

小智 36

上面已经提到了一些好的答案,但如果您发现它令人困惑,您可以尝试一下(警告:如果您有本地更改,以下命令将擦除更改):

git reset --hard origin/<remote_branch_name>
Run Code Online (Sandbox Code Playgroud)

示例:如果您的分支名称是master

git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

此命令将丢弃任何本地分支更改,并使本地分支与远程分支完全相同。换句话说,它使您的本地分支成为远程分支的副本。

  • 除非您知道自己在做什么,否则不要这样做。您最终可能会失去当地的工作! (4认同)

sen*_*rio 17

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

但所有这些都是有效的。

  • 对我不起作用。fatal:无法快进、中止。这是最简单的存储库,只有 1 个主分支和 2 个人。不幸的是,两个人(不是 git 专家)同时编辑不同的文件对于 git 来说是一个问题。 (4认同)

小智 13

git config pull.rebase false

合并(默认策略)


小智 12

就我而言,我只是简单地通过以下方式做到了这一点:

git pull --rebase
Run Code Online (Sandbox Code Playgroud)

我能够在本地分支上获取所有远程更改。

谢谢。


Has*_*mal 8

默认合并过程而不是使用变基

git config pull.rebase false
Run Code Online (Sandbox Code Playgroud)

然后

git pull origin <branch name>
Run Code Online (Sandbox Code Playgroud)


小智 7

举例来说,您从开发分支创建了一个分支 A,并在从开发分支拉取到 A 分支期间遇到了这个不同的问题。您无法将更新代码从开发转移到您的 A 分支。所以请按照以下步骤解决此问题

  1. git checkoutdevelop-branch(这将切换到developbrnach)
  2. git pull(它将拉动所有更改进行开发)
  3. git checkout A-feature-branch (这将切换到您的功能分支)
  4. git mergedevelop-branch(它将所有更改合并到您的功能分支)

现在,您已将代码从开发更新到本地分支。享受你的编码:)


ℛɑƒ*_*ƒæĿ 7

就我而言,我只是使用以下方法解决了它:

git pull --no-ff
Run Code Online (Sandbox Code Playgroud)


Aaf*_*mad 7

这些是来自 Git 的提示。建议您为 git pull 命令配置您的首选行为。配置方法如下:

合并(默认行为): 如果你想在拉取变更时执行合并,你可以像这样配置 Git:

git config pull.rebase false
Run Code Online (Sandbox Code Playgroud)

这将使 git pull 默认执行合并。

变基: 如果您希望在传入更改的基础上对更改进行变基,您可以像这样配置 Git:

git config pull.rebase true
Run Code Online (Sandbox Code Playgroud)

Rebase 将本地提交移动到来自远程分支的传入提交之上,从而创建线性历史记录。

仅快进: 如果您想确保您的分支仅快进(即更新而不创建合并或变基提交),您可以像这样配置 Git:

git config pull.ff only
Run Code Online (Sandbox Code Playgroud)

如果可能的话,这将允许 git pull 快进你的分支;否则,如果拉取会导致合并或变基,它将拒绝拉取。


Von*_*onC 5

注意:之前我们教过 " git pull" ( man )当用户没有说历史需要合并、重新定位或只接受快进时发出警告,但警告为那些设置了pull.ff配置变量的人触发。

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

请参阅Alex Henrie ( ) 的commit 54200ce(2020 年 9 月 24 日(由Junio C Hamano合并-- --commit 299deea,2020 年 9 月 29 日)alexhenrie
gitster

pull: 如果pull.ff已设置,则不发出警告

签字人:Alex Henrie

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


在 Git 2.31(2021 年第一季度)之前,当用户没有告诉 " git pull" ( man )使用 rebase 或 merge 时,该命令会发出一个响亮的消息,告诉用户在 rebase 或 merge 之间进行选择,但无论如何都会创建合并,从而迫使那些愿意的用户想要rebase重做操作。

通过收紧条件以提供消息来修复此问题的早期部分——如果历史快进,则没有理由停止或强制用户在变基或合并之间进行选择。

请参阅Junio C Hamano () 的commit 7539fdccommit b044db9(2020 年 12 月 14 日。 请参阅Felipe Contreras ( ) 的commit c525de3commit 278f4becommit 77a7ec6(2020 年 12 月 12 日(由Junio C Hamano合并-- --d3fa84d 提交中,2021 年 1 月 6 日)gitster
felipec
gitster

pull: 仅在非 ff 时显示默认警告

建议人:Junio C Hamano
签字人:Felipe Contreras

没有必要在每次拉动时显示烦人的警告……只有那些不是快进的。

当前的警告测试仍然通过,但不是因为参数或配置,而是因为它们都是快进的。

我们现在需要测试非快进的情况。


随着 2.34(2021 年第 4 季度)的警告发生变化:“ git pullman在其--rebase后端周围有各种没有经过深思熟虑的极端情况,例如“ git pull --ff-onlyman没有停止,而是继续前进并在另一边的历史记录时重新定位不是我们历史的后代。

提交6f843a3提交359ff69提交031e2f7提交adc27d6提交e4dc25e(2021年7月22日),以及提交1d25e5b提交be19c5c(2021年7月21日)由利亚Newren( )newren
请参阅Alex Henrie ( )提交的 3d5fc24 (2021 年 7 月 21 日)(由Junio C Hamano合并-- --7d0daf3 提交中,2021 年 8 月 30 日)alexhenrie
gitster

pull: 无法进行快进时默认中止

初始补丁:Alex Henrie
签名:Elijah Newren

一段时间以来,当用户没有指定如何使用git pull.
现在让它成为一个错误。

git pull现在包括在其手册页中

将远程存储库中的更改合并到当前分支中。

  • 如果当前分支在遥控器后面,那么默认情况下它将快进当前分支以匹配遥控器。
  • 如果当前分支和远程有分歧,用户需要指定如何与调和发散分支--no-ff--ff或者--rebase(或在相应的配置选项pull.ffpull.rebase)。

更准确地说,使用给定的参数git pull运行git fetch,然后根据配置选项或命令行标志,将调用git mergegit rebase以协调不同的分支。

所以:而不是看到(在 Git 2.34 之前):

不鼓励在未指定如何协调不同分支的情况下进行拉取。
您可以通过在下次拉取之前的某个时间运行以下命令之一来消除此消息:

git config pull.rebase false  # merge (the default strategy)
git config pull.rebase true   # rebase
Run Code Online (Sandbox Code Playgroud)

你会看见:

您有不同的分支,需要指定如何协调它们。
您可以通过在下次拉取之前的某个时间运行以下命令之一来执行此操作:

git config pull.rebase false  # merge (the default strategy)
git config pull.rebase true   # rebase
Run Code Online (Sandbox Code Playgroud)

意思是,如果您运行这些命令之一,您将收到一个致命错误:

fatal: Need to specify how to reconcile divergent branches.
Run Code Online (Sandbox Code Playgroud)


Ars*_*aik 5

该问题将通过以下命令解决

git config --global pull.ff true在项目目录终端中运行此命令。

这是通过桌面实现此目的的理想解决方案,但同时也是如此。对于那些不熟悉使用命令行界面 (CLI) 的人。

GitHub Desktop中,您可以按 Ctrl + `(也可以从“存储库”主菜单中选择“在 [您设置的终端] 中打开”)。这应该会打开一个 CLI。

SourceTree -> 操作 -> 在终端中打开。这将打开带有您的项目目录的终端。 使用 SourceTree 打开终端

在终端中只需键入:( git config --global pull.ff true或错误提示中指定的任何其他选项)。

现在,当您尝试拉取时,它将使用该配置并允许您继续。

我建议的pull.ff true原因很简单,因为它会在应用本地提交之前尝试将您的分支快速转发到远程,否则它将执行从远程到本地分支的合并。阅读此处的文档

通常,当您拉取分支、添加提交并推送时。假设您的本地与远程都是最新的,则按顺序排列。通过在无法快进时进行合并,您将看到一个合并提交,通知您如何处理它。(其他选项是变基或始终合并,许多新用户发现变基不太直观,但确实完成了同样的事情)

我添加了该--global标志,以便您的选择将应用于您的所有存储库,并且您不会再次看到此错误消息。如果您希望每个存储库有不同的行为,只需忽略此选项即可。


小智 5

这个命令成功了

git pull --rebase
Successfully rebased and updated refs/heads/<branch>
Run Code Online (Sandbox Code Playgroud)


Gio*_*ous 5

每当您git pull从远程主机执行操作时,git 都会将远程主机合并到本地分支中。

该错误表明您的本地分支已与上游远程分支分离。例如,每当您对远程分支进行变基(例如从 GitHub UI),并且同时您尝试从本地分支推送新更改而不首先从远程主机拉取更改时,都可能会发生这种情况。


以下命令应该可以帮助您解决该错误:

git pull origin <branch-name> --rebase
Run Code Online (Sandbox Code Playgroud)

现在您应该能够git push从本地到远程


归档时间:

查看次数:

138240 次

最近记录:

4 年 前