相关文章推荐
微醺的开水瓶  ·  git subtree pull 错误 ...·  1 月前    · 
个性的单杠  ·  git - git log ...·  3 周前    · 
光明磊落的路灯  ·  对于 Git ...·  2 周前    · 
瘦瘦的自行车  ·  sql server ...·  4 月前    · 
卖萌的松树  ·  自定义 ListView - ...·  1 年前    · 
刚毅的鼠标  ·  i admin - OSCHINA - ...·  1 年前    · 
重情义的椰子  ·  Java8Stream API ...·  1 年前    · 
Git问题解决方案:不建议在没有为偏离分支指定合并策略时执行pull操作(Pulling without specifying how to reconcile divergent branches) 2021-02-25 22:34:32 116点赞

1 问题背景

如果你也在使用2.27.0及以上版本的Git时,使用 git pull 命令出现以下的警告文案,可以通过阅读本篇文章来解决此问题。

博主最近在Android Studio上使用 git pull 命令时,每次Android Studio都会弹出下述的警告文案:

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.

该警告的中文版本文案描述如下:

warning: 不建议在没有为偏离分支指定合并策略时执行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 参数覆盖缺省设置。

当博主看到上述的警告信息后很懵,于是在百度和Google上都查询了相关的问题解释和解决方案,但都没有详细的论证证据和说服力,于是楼主自己前往了Git官方参考文档中查询了相关知识点,终于理清了这个问题,现在把问题产生的原因、解决方案分享给大家。

2 理解问题

2.1 理解问题的文案描述

我们在上述的警告文案描述中可以发现两个重要的Git配置信息pull.rebasepull.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操作。

接着在《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有这几项常见的选项搭配:

  1. 不带任何选项的git pull命令:先尝试快进合并,如果不行再进行正常合并生成一个新的提交。
  2. git pull --ff-only命令:只尝试快进合并,如果不行则终止当前合并操作。
  3. git pull --no-ff命令:禁止快进合并,即不管能不能快进合并,最后都会进行正常合并生成一个新的提交。
  4. git pull --rebase命令:先尝试快进合并,如果不行再进行变基合并。

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

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

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

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

3 解决问题

现在我们再次回顾一下上述执行不带选项的git pull命令提示的警告文案:

warning: 不建议在没有为偏离分支指定合并策略时执行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 参数覆盖缺省设置。

首先理解什么是偏离分支

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

接着理解什么是合并策略

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

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

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

3.1 如何配置选项pull.rebasepull.ff的参数

博主已经在本文的《2.1 理解问题的文案描述》章节中将选项pull.rebasepull.ff的参数的所有情况进行了一一介绍,因此具体怎么配置按照你使用Git的个人喜好即可。

例如博主喜欢在git pull时只接受快进合并和变基合并,那么博主可以执行git config pull.ff only,保证每次执行不带选项的git pull时要么快进合并成功,要么快进合并失败。如果快进合并失败,博主再显式执行git pull --rebase进行变基合并即可。

3.1.1 选项pull.rebasepull.ff各个参数的含义

Git官方文档-参考-pull.ff》文章中对选项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操作。

Git官方文档-参考-pull.base》文章中pull.rebase的各个参数的定义:

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

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

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

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

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

本文参考文献:
Git warning: Pulling without specifying how to reconcile divergent branches is discouraged
Git官方文档-参考-pull.ff
Git官方文档-参考-pull.base
Git官方文档-参考-git pull
CNBlogs文章《git fetch, git pull 以及 FETCH_HEAD》

从下载二进制文件。 或自行构建。 需要最新的 。 git clone --depth=1 https://github.com/ne-sachirou/git-cleanup-branch.git cd git-cleanup-branch make && make install cd git_project git cleanup-branch 分叉仓库。 签出新功能分支。 实施功能。 测试功能。 出现这个问题的原因如标题所述。 原因是,当前文件的branch和要pullbranch名字不一样,是两个分支。对于两个branchgit不能直接操作,需要你指定什么操作。 要操作的提示也直接给你提醒了: hint: Pulling without specifying how to reconcile divergent branches is hint: discouraged. You can squelch this message by running one of the followi 1.报错信息 今天往gitlab服务器上准备push代码的候,先pull了一下,更新一下分支,结果就报了下面的错,然后就一直提示输入密码 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 pu 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: 文章目录一、报错信息分析二、命令介绍(1) git config(2)`git pull` warning解析1. `pull.ff`2. pull.rebase(3)only、true、false1. only2. true or false三、报警分析三、 解决方法 一、报错信息分析 warning: Pulling without specifying how to reconcile divergent branches is discouraged. You can squelch this me git-trim git-trim自动修剪您的跟踪分支,其上游分支合并偏离git-trim是git f缺少的伴侣git-trim git-trim自动修剪您的跟踪分支,其上游分支合并偏离git-trim是git fetch --prune所缺少的伴侣,它是替代您的git的正确,安全,快速的替代方法 FAQ指令截屏安装从发行版下载二进制文件,并将其放在PATH目录下。 如果您有货物,也可以使用cargo install git-trim进行安装。 它在依赖condi的情况下使用git2 并且比本地的更新,还有其他更多乱七八糟的问题, 那么下面就简单说明一下其中案例的解决方案。 对于git的配置请看这篇:Gitee码云从新建仓库到免密钥推送完整教程,教你如何走上git开发之路 1、本地存在未推送,远程存在更新 1.1、模拟过程 准备条件: 最近遇到这样一个问题git提交(push)前,进行拉取代码(pull)的操作,出现以下问题Git:hint:Pulling without specifying how to reconclie divergent branches is... 解决(依次执行以下两行代码): // 执行不带选项的git pull命令先尝试快进合并,不行再创建一个合并后新的提交 1. git config pull.ff false // 运行不带选项的命令git pull不会被改变含义,即不会变基