文章目录
一、报错信息分析
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 的配置文件
- 仓库级别 local 【优先级最高】
- 用户级别 global【优先级次之】
- 系统级别 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 又分为两种:
- fast-forward
一般情况下,git 默认使用ff来处理分支合并,当成功合并时,也不会产生任何提交记录,且当旧的分支被移除后,其分支信息也会被移除
例子:
master---->ec5ba
develop---->76b12
//在master上合并dev
$ git merge develop
//结果就是master分支上新增一个记录为develop 所在的记录,且最后成为当前最新记录【head指向当前记录】
master ----> 76b12<----develop
- 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
-
true 使用命令修改
-
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