以前曾经分享过灵活运用 git rebase,让团队协做下的提交记录整洁些,使用 --preserve-merges
参数(简写-p
),能够像剪刀同样咔嚓
一下将整段分支历史基于最新 master 分支进行变基迁移,效果很是的赞。html
然而,这是理想状况下的操做,好比你的分支是基于 master 的上一个节点进行开发且期间并无和 master 进行互动,那么,就可使用git rebase master -p
这个命令进行完美变基。git
可是!咱们经常碰到这样一个状况:有不少个特性分支基于同一个master
节点同时开发,而后你们合并进test
分支一块儿开始测试,这时候,其中一个特性分支须要先上线它先合进了master
分支。post
因而仍在测试中的其余分支表示这个场景很是尴尬,说好的好兄弟共同进退呢。。。测试
事情已经发生了,test
分支表示再也不认这个兄弟了,更不能忍受本身的提交历史里出现这段黑历史,因而祭出大招git rebase -i
,要清理本身的提交历史。3d
历史是任人打扮的小姑娘版本控制
简单的说,--interactive
参数(简写-i
)能够用来编辑提交历史,然而在2.17.0
版本以前,这个命令配合--preserve-merges
并不能作到完美的历史编辑,甚至在 git --help
的文档里都直接的指出这个 bug 一直存在,并且存在了不少年-。-code
就如PHP跳过了6直接来个7同样,-i -p
的 bug 困扰了你们不少年,忍无可忍一忍再忍,总算一个新的参数--rebase-merges
(简写-r
)从2.18.0
版本出现了,这个参数能够实现若干强大功能暂且不说我也不熟,总之,咱们想要重改历史
这件事如今能够作到了。cdn
注意:此特性须要git版本2.18.0以上,最好是最新版本。htm
在前文里,咱们说过,要想完美的使用git rebase master -p
来基于最新 master 分支进行变基,前提是二者之间不要出现互动交集。blog
若是出现了交集,好比提交历史里的某个特性分支先合并进 master上线了,那么,就要清理门户,移除当前测试分支里的黑历史。
使用命令:git rebase -i -r c82269475b9....1addb9f3f6fd
进行历史编辑。
此处的 c82269475b9....1addb9f3f6fd 为当前测试分支的根节点(一般是 master 分支的上一个节点)
还记得上文里,先跑的分支曾经三次合并进 test 分支么?在此处,注释掉这三次合并动做。
清理门户以后,test 分支的历史里就和最新 master 没有交集了,能够进行下一步完美变基。
这步简单,能够参考前文,使用git rebase master -p
来基于最新 master 分支进行变基便可。
变基这件事吧,其实挺违背版本控制的理念的,然而对有洁癖的开发者来讲,头可断血可流发型不能乱,因此在沟通良好的团队或我的开发过程当中,变基用的好,也何尝不是一件妙事儿。
原文来自阿星的博客: wanyaxing.com/blog/201901…