Bootstrap

Git之git pull【warning】Pulling without specifying how to reconcile divergent branches is

一、报错信息分析

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:

//不鼓励在没有说明如何解决分歧分支的情况下进行pull。你可以在下一次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 config" 替换为 "git config --global" 以便为所有仓库设置缺省的配置项。
//也可以在每次执行 pull 命令时添加 --rebase、--no-rebase,或者 --ff-only 参数覆盖缺省设置。

这个报警表示,你和你的同事在同一个分支上开发,当你的同事提交代码后,你再执行git pull,会先将你同事的代码与你本地仓库的代码合并

这样当你push之后,你的git上会出现一个很烦人的commit
例如下面这个:
在这里插入图片描述

二、命令介绍

(1) git config

使用该命令来配置git 的配置文件

  1. 仓库级别 local 【优先级最高】
  2. 用户级别 global【优先级次之】
  3. 系统级别 system【优先级最低】

系统级别,对应的配置文件是git 安装目录下的gitconfig文件
查看配置信息的命令

//查看仓库配置
//【必须要进入到具体的目录下,比如要查看TestGit仓库的配置信息】
git config --local -l 
//查看用户配置
git config --global -l 
//查看系统配置
git config --system -l 
//查看所有的配置信息,依次是系统级别、用户级别、仓库级别
git config -l

出现这种情况,多半是你本地的仓库落后于远程仓库很多个版本了

(2)git pull warning解析

在我上一篇博客里说明了git pull 为git fetch + git merge FETCH_HEAD

1. pull.ff

.ff === fast-forward
在我们开发代码时,都会将项目拆分为多个分支,在每个分支上处理不同的事物,当开发完不同的代码后,需要将分支进行合并,即 git merge,而merge 又分为两种:

  1. fast-forward
    一般情况下,git 默认使用ff来处理分支合并,当成功合并时,也不会产生任何提交记录,且当旧的分支被移除后,其分支信息也会被移除
    例子:
master---->ec5ba
develop---->76b12
//在master上合并dev
$ git merge develop
//结果就是master分支上新增一个记录为develop 所在的记录,且最后成为当前最新记录【head指向当前记录】
master ----> 76b12<----develop

在这里插入图片描述

  1. no-fast-forward
    即在合并分支命令中加入--no-ff后缀方式进行运行,便会产生一个新的提交记录
    例子:
master ----> ec5ba
develop ----> 76b12
//在master上合并develop
$ git merge develop --no-ff
//master上生成一个新的提交记录,且该记录和develop及master都有联系
//且develop上的原有记录保留
//【head】指向master上生成的最新的提交记录

在这里插入图片描述
3. 合并冲突时,在移除掉多余的代码后,也会产生一条新的提交记录,方式和–no-ff大体一致
在这里插入图片描述

2. pull.rebase

衍合指定分支,变基,是Git整合变更的一种方式

rebase 会把当前分支上的所有提交记录整合到指定分支上
例:

master ----> ec5ba
develop ---->3a2e2
//在develop分支上执行
$ git rebase master
//则将develop上的所有记录移到master记录的最顶端,变成一条线
//且head指向develop的最新纪录

在这里插入图片描述

(3)only、true、false

1. only

仅仅

git config pull.ff only
//only - 如果可能,拉动快进,否则操作将中止并显示错误消息。

2. true or false

  1. true 使用命令修改

  2. false 使用默认行为

三、报警分析

git 提供的三个命令提供了三种抑制警告的方法,但是用途不同:

1. git config pull.ff only

git config pull.ff only   //仅快进合并
//即设置为 git fetch + git merge -ff,如果不能完成则会终止并显示错误

2. git config pull.rebase false

git config pull.rebase false  //从远程上默认合并
//即 git fetch + git merge,保留默认行为且抑制警告

3. git config pull.rebase true

git config pull.rebase true  //变基合并
//即git fetch + git rebase

注意:
git config pull.rebase false
该命令所使用的合并跟随你的默认设置
如果,你设置了merge.ff false
不是默认的快速合并,而是创建一个记录进行合并
清除该设置后,默认为-ff快进合并。

四、 解决方法

1. git warning 提供的是全局设置

git config --global pull.rebase true
//这样当以后你执行 git pull 之后,都会按照变基处理。

2. 单独设置,仅在此次git操作中使用

git pull --rebase origin master

如果代码发生冲突后,此变基将会暂停,需要解决冲突后,再继续操作

// 取消变基,Git 将您恢复为分支状态如同调用 git rebase 之前一样
git rebase --abord  
// 冲突操作之后,继续完成变基
git rebase --continue 

3. 直接入

综上,如果你不太承受变基合并带来的风险,也不清楚你的默认merge操作是什么的话,则可以使用

git config pull.ff only
//or
git pull --ff-only

参考文献:
https://stackoverflow.com/questions/62653114/how-to-deal-with-this-git-warning-pulling-without-specifying-how-to-reconcile
https://www.zhihu.com/search?type=content&q=pull.rebase

;