注意:早些时候,我们教授了 "git pull
"(man) 的用法,以便在用户没有指定需要合并、变基或仅接受快进操作的历史记录时发出警告,但该警告会触发已设置 pull.ff
配置变量的用户。
但这种情况已不再存在(即:不再有警告),从 Git 2.29(2020年第4季度)开始实施。
参见提交 54200ce(2020年9月24日),由Alex Henrie (alexhenrie
)进行了修改。
(由Junio C Hamano -- gitster
--在提交 299deea中合并,2020年9月29日)
pull
:如果已设置pull.ff
,则不发出警告
签署作者:Alex Henrie
一个理解如何设置 pull.ff
的用户不需要额外的说明。
在 Git 2.31(2021 年第一季度)之前,当用户没有告诉 "git pull
"(man) 使用 rebase 或 merge 时,该命令会发出一个大声的消息,告诉用户选择 rebase 或 merge,但仍然创建了一个合并,强制那些想要 rebase 的用户重新执行操作。
通过加强条件来解决此问题的早期部分,以便在历史记录快进时不必停止或强制用户选择 rebase 或 merge。
查看 提交 7539fdc,提交 b044db9(2020年12月14日)由Junio C Hamano (gitster
).
查看 提交 c525de3,提交 278f4be,提交 77a7ec6(2020年12月12日)由Felipe Contreras (felipec
).
(合并自Junio C Hamano -- gitster
--于提交 d3fa84d,2021年01月06日)
拉取
:仅在非快进时显示默认警告
建议者:Junio C Hamano
签署者:Felipe Contreras
没有必要在每次拉取时显示烦人的警告... 只有那些不是快进的警告。
当前的警告测试仍然通过,但这并不是因为参数或配置,而是因为它们都是快进操作。
我们现在需要测试非快进的情况。
警告随着2.34(2021年第4季度)的更新发生了变化: "git pull
"(man) 存在各种边缘情况,其 --rebase
后端未经周密考虑 ,例如 "git pull --ff-only
"(man) 没有停止而是继续进行了 rebase,当另一侧的历史记录不是我们历史记录的一个后代时。
另请参阅: Git 2.34 尚未解决所有问题。
请查看提交 6f843a3,提交 359ff69,提交 031e2f7,提交 adc27d6,提交 e4dc25e(2021年7月22日),以及提交 1d25e5b,提交 be19c5c(2021年7月21日)由Elijah Newren (newren
)提交。
请查看提交 3d5fc24(2021年7月21日)由Alex Henrie (alexhenrie
)提交。
(由Junio C Hamano -- gitster
--合并于提交 7d0daf3,2021年8月30日)
pull
:默认情况下在无法快进时中止
初始补丁由:Alex Henrie
签署者:Elijah Newren
我们已经有一段时间没有指定如何通过 git pull
协调不同分支时向用户显示了一个长的警告。
现在将其变为错误。
git pull
现在包含在其手册页面中:
将远程仓库的更改合并到当前分支中。
- 如果当前分支落后于远程,则默认情况下它会将当前分支快进以匹配远程。
- 如果当前分支和远程分支发生了分歧,则用户需要使用
--no-ff
、--ff
或--rebase
(或相应的配置选项pull.ff
或pull.rebase
)来指定如何协调分歧的分支。
更准确地说,git pull
使用给定的参数运行git fetch
,然后根据配置选项或命令行标志,将调用git merge
或git rebase
来协调分歧的分支。
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
你会看到:
You have divergent branches and need to specify how to reconcile them.
You can do so 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
意思是,如果你不运行这些命令之一,你将会得到一个致命错误:
fatal: Need to specify how to reconcile divergent branches.
Git 2.35更新(2022年第一季度)
Ark Kun 报告:
Git 2.34仍然存在问题。它拒绝拉取一个当前分支头的祖先远程分支。
git失败而不是什么都不做。
VSCode有同步功能,可以进行拉取和推送。
由于GIT更改了行为,该功能已经破损了几个月。
幸运的是,这个问题在GIT主分支中终于得到了解决。
这个问题在Git邮件线程中被报告/讨论,并且正在进行修复(git commit ea1954a)
在 Git 2.35(2022年第一季度)之前,无论使用哪种策略,当对方落后于我们时, "git pull
"(man) 应该会成功执行,因为它是一个无操作,但实际上并没有。
请查看提交 ea1954a(2021年11月17日)由Erwin Villejo (erwinv
)提交。
(由Junio C Hamano -- gitster
--合并于提交 0f2140f,2021年11月21日)
pull
:当已经是最新版本时应该是无操作的
签署者:Erwin Villejo
已经更新的拉取错误已经针对--ff-only
进行了修复,但是它没有包括未指定--ff
或--ff-only
的情况。
此次更新将--ff-only
修复程序扩展到命令行标志或配置中未指定--ff
或--ff-only
的情况。
在 Git 2.41 (Q2 2023) 中,当 "git pull
"(man) 配置为 pull.rebase=false merge.ff=only
后,由于我们自己的开发,导致失败,给出建议信息以摆脱 "Not possible to fast-forward
" 状态。
请查看提交 765071a(2023年3月7日)由Felipe Contreras (felipec
)提交。
(由Junio C Hamano -- gitster
--合并于提交 9de14c7,2023年3月19日)
建议
:为新手添加不同的建议
签名者:Felipe Contreras
认可者:Taylor Blau
用户可能并不知道为什么只配置了 ff,也许是管理员这样做的,或者安装程序(Git for Windows)这样做的,或者他们只是遵循一些在线建议。
这不仅会发生在 pull.ff=only
上,还会发生在 merge.ff=only
上。
如果用户配置了 pull.rebase=false
和 merge.ff=only
,情况会更糟,因为在这些情况下,分叉合并将不断失败。
除了 git merge --no-ff
(man),没有简单的方法可以解决这个问题。
让我们不要假设我们的用户是 Git 专家,完全理解他们所有的配置。
git config
现在在其手册页面中包含以下内容:
diverging
当无法进行快进时显示的建议。
因此,您不仅可以看到:
Not possible to fast-forward, aborting.
你会看到:
Diverging branches can't be fast-forwarded, you need to either:
git merge --no-ff
or:
git rebase
Not possible to fast-forward, aborting.
git push
时,我的代码被顺利推送了。 - MikhailRatnergit push
没有任何问题。如果有人在 VS Code 中遇到这个问题,我建议尝试这个解决方案。 - Paweł Mioduszewski