合并代码的两种方法
一、Merge命令:
[if !supportLists]1、 [endif]feature_amount分支mergedevelop分支
命令:git merge origin develop
会把两个分支基于最近共同祖先的最新快照(最新的commitId)和两个分支的最近共同祖先进行一个三方的合并,合并的结果是生成一个新的快照并提交。
这是小海龟的历史记录
feature_amount分支的Merge操作把develop分支的commitId带过来;并且三方合并生成一个新的快照(新的commitId)c7
[if !supportLists]2、 [endif]
如果develop分支再mergefeature_amount分支,将不能进行快速合并,整个提交历史会出现分叉。如下图
命令:git merge origin feature_amount
二、Rebase命令:
可以使用rebase命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。
原理是首先找到这两个分支(即当前分支feature_amount、变基操作的目标基底分支develop)的最近共同祖先C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底C4,最后以此将之前另存为临时文件的修改C5’,C6’依序应用。
[if !supportLists]1、 [endif]feature_amount分支rebasedevelop分支
命令:git pull origin develop --rebase
注意:rebase之后,feature_amount分支push到远端需要强推 git push –f
feature_amount分支把develop分支上的最新快照(C3,C4)拿了过来,
并将基于共同祖先的修改C5’,C6’依序应用在 C4之后
2、
如果这时候develop分支再mergefeature_amount分支,就可以直接进行快速合并
命令:git merge origin feature_amount
如下图,尽管实际的开发工作是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。
为什么需要强推?什么情况下不需要强推?
push的时候git会检查分支的历史commit,在你当前分支的上一个提交不是远端分支上最新的提交时,git就会阻止你提交。
[if !supportLists]1) [endif]、如果feature_amount分支从远程拉到本地后一直都是本地commit,没有推送到远端,那么当feature_amount分支Rebase Develop分支的时候,f分支不需要强推,因为当前分支的上一次提交和远程的最新提交是同一个,可以直接push,而且这个时候f分支上不会出现多余的commit,工作树也是线性的一条直线。
[if !supportLists]2) [endif]如果是f分支从远程拉到本地后,有其中一些commit,比如C5,C6,已经推送到了远端,然后再rebase Develo分支,这时候如果直接git push的话,会出现以下的提示
这时候,因为你已经rebase了develop分支,如果再pull的话,就会继续合并远程f分支是上的C5和C6,就会导致出现了重复的commit信息,如下图
命令git log --graph --oneline如下
f分支的commit记录会出现如下的情况