从 Git 版本2.27.0开始,运行该命令git pull将显示以下消息,除非您的 Git 配置包含某些设置。
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.
简短说明
Git 希望我们选择它应该如何处理远程分支(例如origin/develop)与本地分支(develop)不同步的情况。很多人(包括我自己)都觉得 Git 过去处理这种情况的默认方式是次优的,但是改变默认行为是一件大事。相反,Git 使修改行为变得容易,并添加了此屏幕以提醒您可能想要更改默认值。
短修复
简短的回答是肯定的,我们确实想更改默认行为,我们可以通过从命令行运行以下命令来做到这一点。
git config --global pull.ff only
这将在您的全局 Git 配置文件中添加一行,以便在使用git pull.
我们正在解决的问题
使用 Git 时,您的计算机上有本地分支(例如develop)和远程分支(例如origin/develop)。您的远程分支通常位于GitHub 之类的地方。
您希望在本地分支和远程分支上有相同的提交,所以看起来像这样。
develop origin/develop
cem32k cem32k
b4d2o1 b4d2o1
abc123 abc123
(如果将您的 Git 分支视为这样的提交列表似乎不熟悉,我建议查看我关于如何改进 Git 日志的帖子)
其他人添加了提交
当其他人使用git push将他们的提交(例如zyx911)添加到 时origin/develop,我们会失去同步。
develop origin/develop
zyx911
cem32k cem32k
b4d2o1 b4d2o1
abc123 abc123
好消息是我们可以通过运行使事情恢复同步git pull。在这种情况下,Git 很明显,通过添加zyx911我们的提交,我们将保持同步。这称为快进合并。
develop origin/develop
zyx911 zyx911
cem32k cem32k
b4d2o1 b4d2o1
abc123 abc123
我们在上面添加的命令 ( git config --global pull.ff only) 将此设置为 Git 应该执行的唯一一种合并,除非我们明确告知它。
两者都添加提交
想象一下其他人向远程分支添加提交(例如zyx911被添加到origin/develop)同时我们向本地分支添加提交(例如我们添加dg34mp到develop)的情况。
develop origin/develop
dg34mp zyx911
cem32k cem32k
b4d2o1 b4d2o1
abc123 abc123
现在,当我们运行git pullGit 时,会说:“哇,等一下!我无法将zyx911提交添加到我们的本地分支,因为我们的本地分支上有一个额外的提交,而远程分支上不存在!”(又名我不知道如何处理zyx911)。
注意:这与我在Git failed to push some refs中讨论的情况相同。
处理情况的三种方法
创建合并提交
这是历史默认行为。Git 创建一个新的提交(例如3649fc),它是 和 的父 dg34mp级zyx911。合并提交是 Git 中一个非常有用的工具,但是它们也带来了复杂性,这就是为什么大多数人同意 Git 不应该在没有用户明确请求的情况下创建合并提交。
此外,因为我们正在将这些合并到不同的提交中,所以这是发生合并冲突的常见时间。
develop origin/develop
3649fc
dg34mp zyx911 zyx911
cem32k cem32k
b4d2o1 b4d2o1
abc123 abc123
重新定位我们的本地提交
变基是一个重要的 Git 想法,值得单独写一篇文章,但要概括地说:
变基需要我们的本地提交dg34mp(
develop origin/develop
zyx911 zyx911
cem32k cem32k
b4d2o1 b4d2o1
abc123 abc123
然后我们的提交(dg34mp)被添加回我们的本地分支
develop origin/develop
40r931 (dg34mp)
zyx911 zyx911
cem32k cem32k
b4d2o1 b4d2o1
abc123 abc123
然而,由于提交哈希 ( dg34mp) 不仅基于我们的更改,而且基于之前的所有更改,因此提交哈希更改(此处40r931为 这也是合并冲突很常见的时候。
默认情况下不要做任何事情
由于创建合并冲突和变基都有其自身的复杂性,我们不希望 Git 默认这样做。这就是为什么我们只用 设置快进git config --global pull.ff。只要我们只引入新的提交,就git pull可以正常工作,但是如果事情不同步,我们就会收到消息
fatal: Not possible to fast-forward, aborting.
然后我们可以明确地告诉 Git 重新调整我们的更改
git pull --rebase
或创建合并提交
git pull --ff
除了显式创建与 的合并提交git pull -c pull.ff=false pull,我们还可以执行 agit fetch后跟git merge origin/<branchname>.
全局 Git 配置
当我们运行git config --global pull.ff only它时,它会添加以下内容
[pull]
ff = only
到我们的全局Git 配置,通常位于~/.gitconfig.