小墨の博客

梦想需要付诸行动,否则只能是梦

[Git] Pulling without specifying how to reconcile divergent branches is discouraged 解决方案

今天在升级了MacOS系统版本之后,使用git pull拉取代码仓库数据时,报了如下错误👇

hint: Pulling without specifying how to reconcile divergent branches is
hint: discouraged. You can squelch this message by running one of the following
hint: commands sometime before your next pull:
hint: 
hint:   git config pull.rebase false  # merge (the default strategy)
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint: 
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.

image.png

查询资料的时候找到了这篇文章:https://blog.csdn.net/wq6ylg08/article/details/114106272 ,下面的内容摘自这篇文章,同时稍微做了一些修改。


上面的英文警告翻译成中文如下

不建议在没有为偏离分支指定合并策略时执行pull操作。您可以在执行下一次pull操作之前执行下面一条命令来抑制本消息:

  git config pull.rebase false  # 合并(缺省策略)
  git config pull.rebase true   # 变基
  git config pull.ff only       # 仅快进

您可以将 "git config" 替换为 "git config --global" 以便为所有仓库设置缺省的配置项。您也可以在每次执行 pull 命令时添加 --rebase、--no-rebase,或者 --ff-only 参数覆盖缺省设置。

2 理解问题

2.1 理解问题的文案描述

我们在上述的警告文案描述中可以发现两个重要的Git配置信息pull.rebase和pull.ff。

先来了解一下pull.ff。

pull.ff

在《Git官方文档-参考-pull.ff》文章中可以查看到它的定义:

当把pull.ff设置为false时,这个变量告诉Git在这种情况下,如果执行不带选项的git pull命令时先尝试快进合并,如果不行再进行正常合并生成一个新的提交。

当把pull.ff设置为only时,只允许快进合并(相当于执行命令git pull --ff-only),如果执行不带选项的git pull命令时,如果不能进行快进合并则终止当前操作。

如果将pull.ff设置为only,而执行不带选项的git pull命令被终止,其实可以使用带参数的git pull --no-ff或者git pull --rebase命令来执行pull操作。


pull.base

接着在《Git官方文档-参考-pull.base》文章中可查看pull.rebase的定义,但是官网的定义过于复杂,因此此处只解释当选项pull.rebase的参数为true或者false时的定义:

当pull.rebase为true时,运行不带选项的命令git pull相当于执行git pull --rebase。

当pull.rebase为false时,运行不带选项的命令git pull不会被改变含义,即不会变基。如果想变基,需要在执行命令时显式地加上选项--rebase,即git pull --rebase。


2.2 理解git pull命令的原理及其各选项的含义

2.2.1 git pull命令的原理

git fetch会查询git remote中所有的远程仓库所包含分支的最新提交,并将其记录到.git/FETCH_HEAD文件中。

.git/FETCH_HEAD是一个版本链接,指向着目前已经从远程仓库取下来的所有分支的最新提交。

git pull命令等价于:先执行git fetch,再执行git merge FETCH_HEAD将远程仓库对应分支的最新提交合并到当前本地分支中。


2.2.2 git pull命令中各选项的含义

其中git pull有这几项常见的选项搭配:

不带任何选项的git pull命令:先尝试快进合并,如果不行再进行正常合并生成一个新的提交。

git pull --ff-only命令:只尝试快进合并,如果不行则终止当前合并操作。

git pull --no-ff命令:禁止快进合并,即不管能不能快进合并,最后都会进行正常合并生成一个新的提交。

git pull --rebase命令:先尝试快进合并,如果不行再进行变基合并。


2.3 理解git pull命令出现问题的原因

现在,看完上述的问题的文案描述、git pull命令的原理及其各选项的含义后,现在我们清楚为什么git pull命令出现该警告文案的原因了:

执行不带任何选项的git pull命令时,会产生三种歧义: git pull --ff-only、git pull --no-ff、git pull --rebase,而这三种pull方式的合并策略差异很大,即对整个分布式项目的版本管理有很大的影响作用。

而我们执行不带任何选项的git pull命令时,Git就不知道我们到底想用哪种合并策略来执行git pull,因此Git会给出上述的警告文案,建议我们通过git config命令指定不带选项的git pull命令应该按照这三种合并策略的哪种来执行。


3 解决问题

首先理解什么是偏离分支

当本地的分支落后于远程分支时,本地分支又自行修改项目文件生成了新的提交,这时本地分支再执行git pull命令就不能快进合并,并且还容易发生冲突。这时的本地分支便称为偏离分支,因为这时的本地分支的最新提交跟远程分支的最新提交不同,产生了偏离。


接着理解什么是合并策略

合并策略便是 git merge --ff-only、git merge --no-ff、git merge --rebase这三种常见的合并策略,分别代表着快进合并、非快进普通合并、变基合并。


而我们执行不带任何选项的git pull命令时,Git就不知道我们到底想用哪种合并策略来执行git pull,因此Git会给出上述的警告文案,建议我们通过git config命令应该按照这三种合并策略的哪种来执行。

通过上述的文章讲解,现在我们理解了为什么理解git pull命令出现问题的原因,因此只要我们在Git中配置选项pull.rebase或pull.ff的参数即可。配置后,即便我们再执行不带任何选项的git pull命令,也不会再出现上述的警告文案啦。


3.2 如何保持当前的默认合并策略并阻止弹出警告文案

如果你是一个Git小白,看完我上述的文章还是没看懂什么意思,又希望你自己在执行git pull命令时,既保持当前的默认合并策略,保证不再出现配置合并策略的警告文案,那么你只需要执行git config pull.ff false即可,因为pull.ff默认是没有指定的,而没有指定的pull.ff的默认值与显式指定为false的效果一致。因此当你显式指定pull.ff后,既保持当前的默认合并策略,又能保证不再出现配置合并策略的警告文案。


另外,上述提到的默认策略便是不带任何选项的git pull命令:先尝试快进合并,如果不行再进行正常合并生成一个新的提交。


————————————————

版权声明:本文为CSDN博主「快乐李同学(李俊德-大连理工大学)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wq6ylg08/article/details/114106272

张小弟之家

本文链接:
文章标题:

本站文章除注明转载/出处外,均为原创,若要转载请务必注明出处。转载后请将转载链接通过邮件告知我站,谢谢合作。本站邮箱:admin@only4.work

尊重他人劳动成果,共创和谐网络环境。点击版权声明查看本站相关条款。

    发表评论:

    搜索
    本文二维码
    标签列表
    站点信息
    • 文章总数:545
    • 页面总数:20
    • 分类总数:96
    • 标签总数:213
    • 评论总数:63
    • 浏览总数:285197

    | | |
    | |  Z-Blog PHP