在执行 git pull origin master
后,我收到以下信息:
警告:在未指定如何解决分支分歧的情况下进行拉取是不建议的。您可以通过在下次拉取前运行以下命令之一来消除此消息(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 # 合并(默认策略)
git config pull.rebase true # 变基
git config pull.ff only # 仅快进
您可以将 "git config" 替换为 "git config --global" 以设置所有仓库的默认偏好。您还可以在命令行中传递 --rebase、--no-rebase 或 --ff-only 来覆盖每次调用时配置的默认值。
remote: 计算对象:4,完成。
remote: 统计对象:100% (4/4),完成。
remote: 压缩对象:100% (4/4),完成。
remote: 总共 4 (delta 0),重用 0 (delta 0),包重用 0
解包对象:100% (4/4),51.49 KiB | 850.00 KiB/s,完成。
该如何解决这个问题?
当你执行 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 中添加的。完整的警告信息如下:
不建议在未指定如何解决分歧分支的情况下进行拉取。你可以在下次拉取前运行以下命令之一来抑制此消息:
git config pull.rebase false # 合并(默认策略)
git config pull.rebase true # 变基
git config pull.ff only # 仅快进
你可以用 "git config --global" 替换 "git config" 来为所有仓库设置默认偏好。你也可以在命令行中传递 --rebase、--no-rebase 或 --ff-only 来覆盖每次调用的配置默认值。
警告提供了三个命令作为选项,它们都会抑制警告,但各自有不同的用途:
git config pull.rebase false # 合并(默认策略)
这保持了默认行为并抑制了警告。
git config pull.rebase true # 变基
这实际上会在远程分支之上进行提交,本地和远程都维护单个分支(与默认行为不同,后者涉及两个不同的分支——一个在本地,另一个在远程,并且为了合并这两个分支,会执行一次合并)。
git config pull.ff only # 仅快进
这只有在本地分支可以快进时才执行拉取。否则,它会报错并中止(并且不会创建任何提交)。
更新 1:
如果你使用的是 Git 2.29 或更高版本,现在可以将 pull.ff
设置为 false
、true
或 only
来消除警告。
git config pull.ff true
true
- 这是默认行为。如果可能,拉取会进行快进;否则,它会被合并。
git config pull.ff false
false
- 拉取永远不会进行快进,并且总是创建一个合并。
git config pull.ff only
only
- 如果可能,拉取会进行快进;否则,操作会报错并中止。
更新 2:
直到版本 2.35,这个新实现的功能存在一个 bug,即使用户在 git pull
命令中传递了三个标志中的一个,Git 也会显示此警告。这个问题现在已经修复,建议将 Git 更新到 2.36 或更高版本。