在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.ff
为false
,true
或only
摆脱警告。
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
- 如果可能,拉动快进,否则操作将中止并显示错误消息。
Joe*_*Joe 111
* "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 已经是最新的或者合并可以解决为快进
Sud*_*n D 95
git pull origin main --rebase
为我工作!
chr*_*g91 55
如果将 Git 与 Visual Studio(2019 或 2022)一起使用并开始遇到此问题,则可以从 Git 选项卡 -> 设置定义此选项。
拉取时重新调整本地分支的基础
如果您希望分支“合并”更改,则设置为 false;如果您想“重新设置”更改,则设置为 True。
Sno*_*ash 38
运行这个:
git config pull.ff only
Run Code Online (Sandbox Code Playgroud)
并祝贺你自己可以继续你的工作。
小智 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)
此命令将丢弃任何本地分支更改,并使本地分支与远程分支完全相同。换句话说,它使您的本地分支成为远程分支的副本。
iOS*_*iOS 25
试试这个答案——
您可以使用“git config pull.rebase false”命令切换回默认合并策略,而不是使用变基
git config pull.rebase false
Run Code Online (Sandbox Code Playgroud)
然后使用你的 pull 命令
git pull origin <Your branch name>
Run Code Online (Sandbox Code Playgroud)
回答来自...
sen*_*rio 17
git config pull.ff only
或等效地git pull --ff-only
是最安全的。原因是 rebase 可能会覆盖历史记录,并且如果另一个开发人员强制推送到同一分支,则可能会导致提交丢失。
但所有这些都是有效的。
小智 12
就我而言,我只是简单地通过以下方式做到了这一点:
git pull --rebase
Run Code Online (Sandbox Code Playgroud)
我能够在本地分支上获取所有远程更改。
谢谢。
默认合并过程而不是使用变基
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 分支。所以请按照以下步骤解决此问题
现在,您已将代码从开发更新到本地分支。享受你的编码:)
这些是来自 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 快进你的分支;否则,如果拉取会导致合并或变基,它将拒绝拉取。
注意:之前我们教过 " 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 7539fdc和commit b044db9(2020 年 12 月 14 日)。
请参阅Felipe Contreras ( ) 的commit c525de3、commit 278f4be、commit 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 pull
” (man)在其--rebase
后端周围有各种没有经过深思熟虑的极端情况,例如“ git pull --ff-only
” (man)没有停止,而是继续前进并在另一边的历史记录时重新定位不是我们历史的后代。
见提交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.ff
或pull.rebase
)。更准确地说,使用给定的参数
git pull
运行git fetch
,然后根据配置选项或命令行标志,将调用git merge
或git rebase
以协调不同的分支。
所以:而不是看到(在 Git 2.34 之前):
不鼓励在未指定如何协调不同分支的情况下进行拉取。
您可以通过在下次拉取之前的某个时间运行以下命令之一来消除此消息: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)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.
该问题将通过以下命令解决
git config --global pull.ff true
在项目目录终端中运行此命令。
这是通过桌面实现此目的的理想解决方案,但同时也是如此。对于那些不熟悉使用命令行界面 (CLI) 的人。
在GitHub Desktop中,您可以按 Ctrl + `(也可以从“存储库”主菜单中选择“在 [您设置的终端] 中打开”)。这应该会打开一个 CLI。
在终端中只需键入:(
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)
每当您git pull
从远程主机执行操作时,git 都会将远程主机合并到本地分支中。
该错误表明您的本地分支已与上游远程分支分离。例如,每当您对远程分支进行变基(例如从 GitHub UI),并且同时您尝试从本地分支推送新更改而不首先从远程主机拉取更改时,都可能会发生这种情况。
以下命令应该可以帮助您解决该错误:
git pull origin <branch-name> --rebase
Run Code Online (Sandbox Code Playgroud)
现在您应该能够git push
从本地到远程
归档时间: |
|
查看次数: |
138240 次 |
最近记录: |