在git拉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.

拉动似乎成功了,但我不确定。

我该怎么补救呢?


Git配置拉。仅Ff或等价于git pull, Ff -only是最安全的。原因是,如果另一个开发人员强制推送到同一个分支,那么rebase可能会覆盖历史记录,并可能导致提交丢失。

但它们都是有效的。


在默认模式下,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标志将更改应用于您机器上的所有存储库。如果您希望此行为仅用于您所在的存储库,请省略该标志。

从这里开始



此警告是在Git 2.27中添加的。

这是完整的警告:

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 false     # merge (the default strategy)

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

git config pull.rebase true      # rebase

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

git config pull.ff only          # fast-forward only

这只在本地分支可以快进的情况下执行拉取。如果不是,它将简单地终止并输出错误消息(并且不创建任何提交)。


更新:

如果你有Git 2.29或更高版本,你现在可以设置pull。Ff为假,为真或只消除警告。

git config pull.ff true

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

git config pull.ff false

false - Pull从不快进,并且总是创建merge。

git config pull.ff only

only -如果可能的话,Pull是快进的,否则操作将被终止并返回错误消息。


注意:您可能需要关注VonC在这里的回答,以了解在未来的更新中对该功能所做的更改的更新。


这是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.

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

  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已经是最新的,或者合并可以作为快进解决


注意:之前我们教过“git pull”(man),当用户没有说历史需要合并、重基或只接受快进时,它会发出警告,但对那些设置了pull的人会触发警告。Ff配置变量。

Git 2.29 (Q4 2020)不再是这种情况(意味着:不再有警告)。

参见Alex Henrie提交54200ce(2020年9月24日)。 (由Junio C Hamano—gitster—在commit 299dea中合并,2020年9月29日)

拉:如果拉,不要警告。Ff已经被设定 署名:Alex Henrie

一个足够理解设置拉的用户。Ff不需要额外的指令。


在Git 2.31 (Q1 2021)之前,当用户没有告诉“Git pull”(man)使用rebase或merge时,该命令会给出一个响亮的消息,告诉用户在rebase或merge之间进行选择,但还是会创建merge,迫使想要rebase的用户重做操作。

通过收紧条件来给出消息来修复这个问题的早期部分——如果历史快进,没有理由停止或强迫用户在rebase或merge之间进行选择。

参见Junio C Hamano (gitster) commit 7539fdc, commit b044db9(2020年12月14日)。 参见Felipe Contreras (felipec)的commit c525de3, commit 278f4be, commit 77a7ec6(2020年12月12日)。 (由Junio C Hamano—gitster—在commit d3fa84d中合并,2021年1月6日)

Pull:仅在非ff时显示默认警告 建议:滨野Junio C 署名:费利佩·孔特雷拉斯

没有必要在每次拉动时都显示恼人的警告…只有那些不是快进的。 当前的警告测试仍然通过,但不是因为参数或配置,而是因为它们都是快进的。 我们现在需要测试非快进的情况。


在2.34(2021年第四季度)中,警告发生了变化:“git pull”(man)有各种角落的情况,这些情况在其-rebase后端周围没有得到很好的考虑,例如。“git pull -ff-only”(男人)没有停下来,而是继续前进,当另一边的历史不是我们历史的后代时。

参见下面:Git 2.34还没有修复所有问题。

参见Elijah Newren (Newren)的commit 6f843a3, commit 359ff69, commit 031e2f7, commit adc27d6, commit e4dc25e(2021年7月22日)和commit 1d25e5b, commit be19c5c(2021年7月21日)。 参见Alex Henrie (alexhenrie)提交3d5fc24(2021年7月21日)。 (由Junio C Hamano—gitster—在commit 7d0daf3中合并,2021年8月30日)

Pull:当不支持快进时,默认为中止 Initial-patch-by: Alex Henrie 署名:以利亚·纽伦

当用户没有指定如何用git pull协调发散的分支时,我们已经给出了很长的警告。 现在让它成为一个错误。

Git pull现在包含在它的手册页中:

Incorporates changes from a remote repository into the current branch. If the current branch is behind the remote, then by default it will fast-forward the current branch to match the remote. If the current branch and the remote have diverged, the user needs to specify how to reconcile the divergent branches with --no-ff, --ff, or --rebase (or the corresponding configuration options in pull.ff or pull.rebase). More precisely, git pull runs git fetch with the given parameters and then depending on configuration options or command line flags, will call either git merge or git rebase to reconcile diverging branches.

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

不鼓励在没有说明如何协调不同分支的情况下进行拉。 你可以在下次拉之前通过运行以下命令之一来压制此消息: Git配置拉。Rebase false # merge(默认策略) Git配置拉。Rebase true # Rebase

你会看到:

您有不同的分支,需要指定如何协调它们。 你可以在下次拉之前运行以下命令: Git配置拉。Rebase false # merge(默认策略) Git配置拉。Rebase true # Rebase

这意味着,如果你不运行这些命令之一,你将得到一个致命的错误:

致命的:需要指定如何调和不同的分支。


Git 2.35更新(2022年第一季度)

Ark Kun报道:

Git 2.34仍然是坏的。它拒绝拉取作为当前分支头祖先的远程分支。 Git失败了,而不是什么都不做。 VSCode有同步功能,可以进行拉和推操作。 由于GIT改变了行为,该特性已经被破坏了几个月。 幸运的是,这个问题最终在GIT master中得到了解决

这个问题已经在Git邮件线程中报告/讨论过了,修复正在进行中(Git commit ea1954a)

在Git 2.35 (Q1 2022)之前,当对方在我们后面时,任何策略的“Git pull”(man)都应该成功,因为这是一个没有操作的操作,但没有。

参见Erwin Villejo (erwinv)的commit ea1954a(2021年11月17日)。 (由Junio C Hamano合并- gitster -在提交0f2140f, 2021年11月21日)

Pull:当已经是最新的时候应该是noop 签字人:Erwin Villejo

已经更新的pull错误被修复了——ff-only,但它不包括没有指定——ff或——ff-only的情况。 这将更新——ff-only修复,以包括在命令行标志或配置中未指定——ff或——ff-only的情况。


运行这个:

git config pull.ff only

祝贺自己能继续工作。


最安全的选择是只在全球范围内设置。运行:

git config --global pull.ff only

该选项将被添加到全局的.gitconfig中。

[pull]
    ff = only

如果快进后期失败,尝试git pull -no-ff。


确保您当前所在的分支存在于远程存储库中。如果你正在使用Atlassian (Bitbucket和Jira),可能是在一个pull请求后,你的分支被删除了,你忘记签出到其他分支(即master/develop)。


我不知道这是否与您的问题有关,但请注意Git v2.34.0版本有一个问题。git pull命令没有预期的行为。

发布说明中关于Git修复和2021-11-24新版本的消息:

当对方在我们身后的时候,任何策略都应该是“git pull” 成功,因为它是一个没有操作,但没有”。

Git v2.34.1版本说明


此问题在2.34.1中修复,更新Git版本。


如果你正在使用Visual Studio的Git(2019年或2022年),并且开始遇到这个问题,那么你可以从Git选项卡->设置中定义这个选项。

拉拔时重新调整局部分支

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


对我来说,一旦我设置了配置,我仍然无法合并。 这是致命的:不可能快进,中止

上述解决方案都不起作用,所以我使用了合并和develop。合并起源/开发


让我们举个例子,你从开发分支创建了一个分支A,在从开发分支拉到分支A的过程中,出现了这个发散的问题。你不能把更新代码从开发到你的A分支。因此,请按照以下步骤解决此问题

Git签出开发分支(这将切换到开发分支) Git拉(它将拉所有的更改来开发) git checkout A-feature-branch(这将切换到你的feature branch) Git合并开发分支(它将合并所有更改到您的功能分支)

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


这对我很有用

git config --global pull.ff true

在我的例子中,当我只想获得我想要的分支的最新更新时,我正在从一个不同的分支进行拉取。我把树枝换回去,它就恢复正常了。


Git配置拉。变基假

合并(默认策略)


这对我来说很管用:

git rebase /my_remote_branch_name


如果你从一个分叉回购,像我一样:P,试试这个

git push -f origin <branch_name>

这个被推了。如果有任何冲突,您可以从git中处理


上面已经提到了一些很好的答案,但如果你觉得困惑,你可以试试这个(警告:如果你有本地更改,下面的命令将擦除更改):

git reset --hard origin/<remote_branch_name>

示例:如果分支名称为master

git reset --hard origin/master

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


已经有很多答案了,但是,我的处理方式是 如果你想从分支A拉到分支B

我首先从a中创建一个pull request到let,比如master。 确保所有冲突都得到解决,并将A合并为master。 然后简单地从主分支拉入分支B。


Git拉源主-rebase

为我工作!


哇,这里有很多好答案。 但我想从路线原因的角度来回答…

不容易确定OP路径,因为每个人都可能不同。 解决问题很好,但首先预防问题就更好了。 尽管我尊重上面的答案,因为他们的知识远比我多。

这是我的问题的原因,与上面的错误相同:

做一个提交和推拉从我的开发分支到我的远程开发分支(使用VS Code); 然后是我团队分公司的公关。 然后在github中,我将我的团队分支合并到我的开发分支中(更高),以使开发与其他团队保持一致,以确保我们所有人都一致。 第二天早上,我做了一个新的提交,但是当我在我的本地上使用Push/Pull in VS Oce时,我得到了错误。

我应该做的是我在远程合并后,我应该拉或获取远程到我的本地之前做进一步的改变,然后我就不会得到错误。

所以我的日常生活应该改变,当我合并团队到Dev在我的遥控器上,我也必须把它拉到本地直接

我还有另一个复合因素,我的新提交与合并到我的Dev分支的冲突,所以我收到了不同的错误,告诉我在Pull之前删除或隐藏我的更改。

所以,如果把这个问题解决了,按正确的顺序来做也许就能在一开始就避免这个错误。(可能)。


这意味着您的本地主服务器和远程主服务器已经出现了分歧,这意味着它们都有不能简单地快进的贡献。 为了保持你的本地提交,你可以遵循以下步骤:

1. git switch -C feature_branch (from master, create local branch with your local commits)
2. git switch master
3. git reset --hard origin/master (lose all local changes, and become same as origin/master)
4. git switch feature_branch
5. git merge master (add remote changes to your local)
6. git push
7. Make a pull request for master.

我一直在用——ff-only得到错误,所以我只是创建了一个与远程分支同步的新分支:

跳到另一根树枝上:

git checkout -b other-branch

更改它的名称,这样它就不会打扰你:

git branch -m myBranch broken-myBranch

签出你想要同步的远程分支:

git checkout origin/myBranch

为它创建一个本地分支:

git checkout -b myBranch

将远程分支连接到您的:

--set-upstream-to=origin/myBranch myBranch

这对我很有用。

git reset --hard origin/<remote_branch_name>

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

Git配置-全局拉。Ff true在项目目录终端执行此命令。

这是一个理想的解决方案,通过桌面,但同时。对于不熟悉CLI (Command Line Interface)的用户,可以参考本手册。

从GitHub桌面,您可以按Ctrl + '(也可从 “存储库”主菜单为“在[您设置的终端]中打开”)。这 应该打开一个CLI。 从SourceTree -> Actions ->打开终端。这个会打开 终端与您的项目目录。

在终端输入: Git配置-全局拉。Ff为真(或错误提示中指定的任何其他选项)。

现在,当你试图拉它将使用该配置,并允许你继续。

我建议拉。Ff为真,因为它试图在应用本地提交之前快进您的分支,使其与远程更新,如果没有,它将执行从远程到本地分支的合并。点击这里阅读文档。

通常情况下,当您拖动一个分支、添加提交和推送时。这是在顺序假设您的本地是最新的远程。当无法快速转发时,通过合并,您将看到一个合并提交通知您它是如何处理的。(其他的选择是rebase或总是合并,许多新用户发现rebase不太直观,但实际上完成了同样的事情)

我添加了——global标志,这样你的选择将适用于你所有的回购,你不会再看到这个错误消息。如果您希望每个存储库都有不同的行为,可以忽略这个选项。


在我的情况下,我只是简单地这样做:

git pull --rebase

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

谢谢。