背景

最近在使用git的过程中遇到了如下问题:

Your branch and 'origin/xxx' have diverged, and have 8 and 4 different commits each ....

这个问题跟前面说的另外一篇文章: Git - Your branch and ‘origin/xxx’ have diverged有点类似,但又有些不同。

先描述一下这个问题产生的背景:

先说说git仓库模型,如下所示:

upstream|
origin|
local

根上游代码upstream准备新开发一个功能,我的直接上游origin master代码始终跟upstream保持一致,这时候为了开发新的功能,在我的本地新建了一个feature分支,做了一些修改,并提交到我的直接上游origin上:

# 当前分支为master,根据master创建新分支my-feature
git branch my-feature
# 进行开发...若干提交
# git commit -m "init commit message"
# ...
git push origin my-feature:my-feature

现在这个功能还没到可以提交PR给root master的阶段,过了一段时间,团队里的其他人请求合并自己开发的功能到根上游的master并通过了。这时候为了保证我直接上游和本地master跟根上游上的master代码始终一致,我需要做以下操作:

git checkout master
git pull # 这一步只是为了确保本地master跟origin master保持一致
git fetch upstream
git merge --ff upstream/master
git push origin master # 让origin master 跟 upstream master保持同步

接下来,我应该把master合并到我的开发分支my-feature,以便保证我的开发分支是基于master最新代码之上做修改的,为了保证分支线性,避免merge操作带来额外的commit,我采用了如下命令进行合并:

git checkout my-feature
git rebase master

这时候一切正常,使用git status命令查看状态发现:

git status
On branch my-feature
Your branch and 'origin/my-feature' have diverged,
and have 8 and 4 different commits each, respectively.(use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean

到了这一步,便出现了前面提到的问题。

分析

实际上,rebase命令之所以能够保证分支线性,是因为它会改写(涉及到parent commit的修改)commit。

通常以树的形状来描述git分支和git提交历史,我们可以通过下面这张图,更形象地理解到rebase:

图片来自stackoverflow: http://stackoverflow.com/questions/19016698/git-branch-diverged-after-rebase

实际上在my-feature分支上进行的git rebase master操作,是将我们在my-feature上的commit,给接到master最后一个commit之后,这些commit跟之前在my-feature上的commit是完全不同的(hash值和指向的parent都不一样了)。因为我本地的my-feature分支跟直接上游origin的my-feature分支之间是建立了track关联的,而在我的origin直接上游上的my-feature分支,由于在rebase之前已经push上去,先前的commit跟rebase后的commit不一致,在track关联中被检测到。所以当前使用git status命令查看,就会发现产生了分叉(diverge)。

解决方法

实际上,在团队开发中应该或多或少会遇到这种情况,那么,出现这种情况该如何解决?翻了一下stackoverflow上的一个问题http://stackoverflow.com/questions/19016698/git-branch-diverged-after-rebase,总结如下:

假设只有你一个人在操作这个分支,那么你可以使用git push -f origin my-feature:my-feature,强制push该分支到origin上;但是,如果该分支有其他人跟你一起协作开发,那么,绝对不要使用-f强行push,事实上一开始你就不应该用rebase操作来合并master上的变更,而应该选择merge操作:git merge master

参考

  • 团队开发里频繁使用 git rebase 来保持树的整洁好吗?

  • stackoverflow: git-branch-diverged-after-rebase

  • git-scm:Git-Branching-Rebasing

Git branch has diverged after rebase相关推荐

  1. Git学习--分支(branch、merge、rebase)

    分支: 你可以把他理解为指针,假设一开始master和test分别是origin下的两个分支,都指向file这个文件夹,随后A,B分别使用master和test对file进行更新,他们更新的版本我们记 ...

  2. git branch 为什么会进入编辑状态_gitamp;github(总结git与github的基本用法)

    Git 世界上最先进的分布式版本控制系统 版本控制是一种记录一个或若干个文件内容变化,版本迭代.(记录文件的所有历史变化.随时可恢复到任何一个历史状态.多人协作开发或修改错误恢复) 工作原理 Work ...

  3. git branch 为什么会进入编辑状态_最好的Git分支管理教程

    Git最难学习的就是Git的多分支问题,不同操作会对当前分支造成什么影响,比如相同初始状态,类似操作,rebase和merge的不同结果. rebase(左),merge(右) 教程简介 推荐一个非常 ...

  4. git branch看不到分支_最好的Git分支管理教程

    Git最难学习的就是Git的多分支问题,不同操作会对当前分支造成什么影响,比如相同初始状态,类似操作,rebase和merge的不同结果. rebase(左),merge(右) 教程简介 推荐一个非常 ...

  5. git branch 管理分支(超详细)

    这是git操作最大的一块儿,来吧,继续学习. 直至现在为止,我们的项目版本库一直都是只有一个分支 master.在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支.下面列举一些常 ...

  6. 新建本地仓库,同步远程仓场景,出现git branch --set-upstream-to=origin/master master 解决方法...

    1.本地创建一个本地仓库  2.关联远程端: git remote add origin git@github.com:用户名/远程库名.git 3.同步远程仓库到本地 git pull 这个时候会报 ...

  7. git branch

    git basic branch git branch <branchName>#create branch git branch --list#show branch list, git ...

  8. GIT如何查看本地分支与远程分支的关联配置(git branch --set-upstream)

    为什么80%的码农都做不了架构师?>>>    git本地新建一个分支后,必须要做远程分支关联.如果没有关联, git 会在下面的操作中提示你显示的添加关联.关联目的是如果在本地分支 ...

  9. git branch用法总结

    git branch        git branch 不带参数:列出本地已经存在的分支,并且在当前分支的前面加"*"号标记,例如:    #git branch * maste ...

最新文章

  1. sql08 访问接口没有oraoledb_状态接口的实现方式讨论
  2. 【分组背包问题 (HDU 3535 )】
  3. 【PC工具】更新github下载加速器,github项目辅助下载工具,github高速下载
  4. struts2 常用标签的一般用法
  5. 理解C#语言中的类型转换----初学者的理解,请大神指教
  6. 最新桌面操作系统份额统计:Windows占比91.59%
  7. Yii-模型- criteria查找数据库方法
  8. 清理SQL Server中的旧代码和未使用的对象
  9. Web Api 返回图片流给前端
  10. SignalTap II使用技巧_2
  11. linux下安装卸载永中office步骤,永中集成Office For Linux安装图文指南及简介
  12. 关于我 — About Me
  13. Ubuntu12.10 使用DNW传数据 进行ARM开发板烧写
  14. DBLP数据集用weka数据挖掘 xml转csv格式文件
  15. (附源码)ssm航空客运订票系统 毕业设计 141612
  16. AD2428W手册解读之操作与配置
  17. CMap如何使用,如何实例化?
  18. MacOS打印自定义尺寸配置教程
  19. 利用Pandas拆分Excel的单元格为多行并保留其他行的数据
  20. Windows2003 sp2 R2 的序列号及15种版本

热门文章

  1. I2C虚拟项目-test3
  2. A Generic Deep-Learning-Based Approach for Automated Surface Inspection-论文阅读笔记
  3. 开源 基于Android的SIP电话-----Speex 回音消除 在android 平台
  4. JumpServer 堡垒机
  5. 计算机会计期末考试试题题量及构成,2021初级会计考试题量及评分标准
  6. 如何关闭浏览器的302重定向
  7. oracle dblink调用,oracle dblink 调用序列
  8. 知乎上已获千赞,再不刷题就晚了!
  9. ‘BMap‘ is not defined no-undef
  10. 简单校园网络系统构建