Git branch has diverged after rebase
背景
最近在使用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相关推荐
- Git学习--分支(branch、merge、rebase)
分支: 你可以把他理解为指针,假设一开始master和test分别是origin下的两个分支,都指向file这个文件夹,随后A,B分别使用master和test对file进行更新,他们更新的版本我们记 ...
- git branch 为什么会进入编辑状态_gitamp;github(总结git与github的基本用法)
Git 世界上最先进的分布式版本控制系统 版本控制是一种记录一个或若干个文件内容变化,版本迭代.(记录文件的所有历史变化.随时可恢复到任何一个历史状态.多人协作开发或修改错误恢复) 工作原理 Work ...
- git branch 为什么会进入编辑状态_最好的Git分支管理教程
Git最难学习的就是Git的多分支问题,不同操作会对当前分支造成什么影响,比如相同初始状态,类似操作,rebase和merge的不同结果. rebase(左),merge(右) 教程简介 推荐一个非常 ...
- git branch看不到分支_最好的Git分支管理教程
Git最难学习的就是Git的多分支问题,不同操作会对当前分支造成什么影响,比如相同初始状态,类似操作,rebase和merge的不同结果. rebase(左),merge(右) 教程简介 推荐一个非常 ...
- git branch 管理分支(超详细)
这是git操作最大的一块儿,来吧,继续学习. 直至现在为止,我们的项目版本库一直都是只有一个分支 master.在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支.下面列举一些常 ...
- 新建本地仓库,同步远程仓场景,出现git branch --set-upstream-to=origin/master master 解决方法...
1.本地创建一个本地仓库 2.关联远程端: git remote add origin git@github.com:用户名/远程库名.git 3.同步远程仓库到本地 git pull 这个时候会报 ...
- git branch
git basic branch git branch <branchName>#create branch git branch --list#show branch list, git ...
- GIT如何查看本地分支与远程分支的关联配置(git branch --set-upstream)
为什么80%的码农都做不了架构师?>>> git本地新建一个分支后,必须要做远程分支关联.如果没有关联, git 会在下面的操作中提示你显示的添加关联.关联目的是如果在本地分支 ...
- git branch用法总结
git branch git branch 不带参数:列出本地已经存在的分支,并且在当前分支的前面加"*"号标记,例如: #git branch * maste ...
最新文章
- sql08 访问接口没有oraoledb_状态接口的实现方式讨论
- 【分组背包问题 (HDU 3535 )】
- 【PC工具】更新github下载加速器,github项目辅助下载工具,github高速下载
- struts2 常用标签的一般用法
- 理解C#语言中的类型转换----初学者的理解,请大神指教
- 最新桌面操作系统份额统计:Windows占比91.59%
- Yii-模型- criteria查找数据库方法
- 清理SQL Server中的旧代码和未使用的对象
- Web Api 返回图片流给前端
- SignalTap II使用技巧_2
- linux下安装卸载永中office步骤,永中集成Office For Linux安装图文指南及简介
- 关于我 — About Me
- Ubuntu12.10 使用DNW传数据 进行ARM开发板烧写
- DBLP数据集用weka数据挖掘 xml转csv格式文件
- (附源码)ssm航空客运订票系统 毕业设计 141612
- AD2428W手册解读之操作与配置
- CMap如何使用,如何实例化?
- MacOS打印自定义尺寸配置教程
- 利用Pandas拆分Excel的单元格为多行并保留其他行的数据
- Windows2003 sp2 R2 的序列号及15种版本
热门文章
- I2C虚拟项目-test3
- A Generic Deep-Learning-Based Approach for Automated Surface Inspection-论文阅读笔记
- 开源 基于Android的SIP电话-----Speex 回音消除 在android 平台
- JumpServer 堡垒机
- 计算机会计期末考试试题题量及构成,2021初级会计考试题量及评分标准
- 如何关闭浏览器的302重定向
- oracle dblink调用,oracle dblink 调用序列
- 知乎上已获千赞,再不刷题就晚了!
- ‘BMap‘ is not defined no-undef
- 简单校园网络系统构建