开始用master
和branchA
,都与每个几个提交,branchA
被检出(显示为*):
m1 - m2 - m3 <--- master
\
a1 - a2 <--- branchA*
[编辑:更新的合并结果,每个评论,表明master
不向前移动到合并提交自动]
然后合并成主branchA,示为合并提交a2m3:
m1 - m2 - m3 <-- master
\ \
a1 - a2 - a2m3 <-- branchA*
合并的还原只是适用的变化“撤消”,它不会撤消实际的合并 - 显示为a2m3' :
m1 - m2 - m3 <-- master
\ \
a1 - a2 - a2m3 - a2m3' <-- branchA*
而且因为你这样做是恢复与branchA
仍检出,然后branchA
引用将指向新的提交,并且master
ref仍指向m3提交。
您又添加了承诺:
m1 - m2 - m3 <-- master
\ \
a1 - a2 - a2m3 - a2m3' - a3 <-- branchA*
最后,当你签出master
和合并在branchA
,你猜到了,这只是一个快进,其转发master
指向同一个commit为branchA
。这是可能的,因为从m3到a2m3的合并链接仍然存在(回复没有移除它),所以master
被认为是a3的父提交(对于a3有一个不间断的链)并且可以快进到它。
m1 - m2 - m3
\ \
a1 - a2 - a2m3 - a2m3' - a3 <-- branchA/master*
这是你试图合并branchA
为master
,但得到的回应,这是“已经更新了”的地步。
现在,之前第二合流尝试,如果你已经签出master
和branchA
合并前承诺至少一次,或其他人已承诺master
遥控器上的,你拉下来,然后你的分支将有再次分道扬((想想新的m4承诺为m3的权利)。如果发生了这种情况,从branchA
到master
的合并将是一次完全合并,而不仅仅是一个快进。
如何看待分支
关于如何看待分支机构对我的突破,是分支实际上只是一个参考提交 - 和技术上,所有的父母犯下连接到它。当你合并两个分支时,你只是创建了一个有两个父母的提交,而不是一个,此时没有两个分支,有一个 - 即使是分开的一系列提交,它们以前是分开的master
和branchA
,不再分开 - 它们已经真正合并,现在两个分支都指代它们全部。
你还能做什么?
基于我认为你想做什么,你可以这样做:
警告:有“不好的事情可能发生(TM)”,如果你推到一个远程后更改的历史,其他人(TM)可以访问......但至少在这种情况下,只会重写branchA
历史,不master
而不是恢复的master
合并为branchA
,只是重置branchA
到事先提交a2
:
git reset --hard <hash of a2>
复位这样的删除所有引用a2m3所以它实际上是从回购删除。它仍然会在您的回购中有一段时间,但除非您将散列保存在某处,否则将无法实现。 Git跟踪此类提交一段时间,然后垃圾收集并删除它们,如果它们不被重用足够长时间。
此时你会:
m1 - m2 - m3 <-- master
\
a1 - a2 <-- branchA
就像在合并之前。
你推你的分支到远程吗?还是仅限于本地? – 3D1T0R
@ 3D1T0R:我已经将所有内容都推送到了远端。 – Anonymous
在https://www.atlassian.com/git/tutorials/merging-vs-rebasing的教程中,“合并选项”下似乎表明,合并到主分支会自动让这个主点该分支,如果历史符合某一套标准? – Anonymous