我将feature
分支合并回master
并删除了feature
分支。但它仍然出现在树上。
左侧列表中的feature
分支已按预期消失,树形可视化中的标签也已按预期消失。
可是:
我知道上面截图中的最终提交有两个父母。
但我不明白为什么在功能分支上发生的紫罗兰提交不在master
的最终合并提交内(我认为,这意味着紫罗兰分支不应该是可见的删除后再删除。)
我在命令行上重播它(只是为了检查SourceTree是否做了我认为它做了什么),最后一步是git merge feature
。同样的情况:
--squash
我解除了最后一次合并并尝试了这个:
git merge --squash feature
git commit "Squashed merge"
git delete -D feature # Note that -d did not work; it said "error: The branch 'feature' is not fully merged."
现在它显示了我首先想到的东西。一条直线并没有指示feature
分支存在:
我想我在上述所有试验和错误之后将这些合并发生的事情拼凑在一起,但如果有人能够真正详细解释上述步骤的语义差异,我将不胜感激。
答案 0 :(得分:4)
删除分支时,您将删除指向提交的指针,而不是提交本身。如果没有其他对提交的引用,那么提交最终可以被垃圾收集,但是合并提交会创建对该提交的引用(因为该提交是其父提交)。
初始merge
工作流创建了一个包含两个父项的合并提交,第二个父提交仍然存在,即使指向它的分支不存在。
执行git merge --squash
时,您实际上会将rebase
提交到目标分支,这会为您提供线性历史记录而不是双父历史记录。有关该命令与rebase
之间的区别,请查看this question。
答案 1 :(得分:4)
你仍然会看到紫色部分,因为你选择git merge
,这会创建一个合并提交来组合两个分支。由于分支已经分歧,这是一个“非快进”合并,这就是为什么历史仍然会显示这种树。
你不想要紫罗兰色的部分吗?使用git rebase
代替git merge
。在你的情况下:
git checkout master
git rebase feature
git branch -d feature
这会在分歧之前重播feature
master
的提交。您的历史记录日志中会有一条直线。
git merge --squash
非常类似于一个rebase - 但是你在一次提交中压缩了源代码分支的所有提交(在你的情况下你只有一次提交,所以它没有真正显示)