【谷歌翻译】Git 警告:不鼓励在不指定如何协调不同分支的情况下进行拉取

从 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)同时我们向本地分支添加提交(例如我们添加dg34mpdevelop)的情况。

develop    origin/develop

dg34mp     zyx911
cem32k     cem32k
b4d2o1     b4d2o1
abc123     abc123

现在,当我们运行git pullGit 时,会说:“哇,等一下!我无法将zyx911提交添加到我们的本地分支,因为我们的本地分支上有一个额外的提交,而远程分支上不存在!”(又名我不知道如何处理zyx911)。

注意:这与我在Git failed to push some refs中讨论的情况相同。

处理情况的三种方法

创建合并提交

这是历史默认行为。Git 创建一个新的提交(例如3649fc),它是 和 的 dg34mpzyx911合并提交是 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.

所有评论
加载评论 ...
发表评论