参考这个写得很好的答案:https://stackoverflow.com/a/4675513/1139436
如果您实际上出于某种原因感到需要某种东西作为分支...
“分支”在这里指的是什么?在我们的工作流程中,我们分支母版以进行错误修复,添加新功能等,然后将这些更改推送给gerrit进行审核,一旦批准(我假设我没有设置),这些合并会合并到母版中。这些分支是被引用的,还是注释所引用的是更大的项目(项目分歧等等)?
返回我们的工作流程...提交更改后,我们将git checkout master
,git pull
*和git branch -D bugfix_branch
。我用*标记了pull,因为它通常导致在本地master中合并提交。我开始使用git pull --rebase
,不再看到那些合并提交,但是我承认,我根本不了解幕后发生的事情。
为什么我会看到合并提交,我是否想要它们?我最好--rebase
并避免使用它们吗?只要“可以正常工作”,似乎没人会回答。
答案 0 :(得分:2)
最终,关于是否使用面向合并的工作流程,面向基于基础的工作流程或某种混合的决定(即,同时使用两者,根据判断选择哪个),是一个意见问题,判断。 1 双方都有很好的论点。这是两个外部意见页面,one by Ken Sheedlo in favor of rebase和one that lists arguments on both sides,以及Atlassian tutorial page的合并与重新定基。
关于变基的要认识的是,它复制(某些)提交。如果您了解将提交表示为 graph , 2 的Git模型,那么Ken Sheedlo的pro-rebase参数中的示例将向您确切说明这是什么意思:原始提交{{1 }}和B
中的
C
象征性地放弃了狼,取而代之的是闪亮的新替代品 B--C <-- feat
/
A--D--E <-- master
和B'
:
C'
已经用闪亮的新 B--C [abandoned]
/
A--D--E <-- master
\
B'-C' <-- feat
提交链替换了沉闷的旧B-C
链,现在可以将新功能分支无缝合并到B'-C'
中,无论是否有合并提交。使用合并提交(在master
上运行git merge --no-ff feat
时,会得到以下图表:
master
这将有助于历史学家将来使用(一旦删除名称A--D--E------F <-- master
\ /
B'-C' <-- feat
,这是安全的,因为feat
会记住F
和C'
)并看到落实 pair E
是实现此功能的原因。相对于简单的外观,它是否有价值?
B'-C'
是一个单独的问题。但是,由于重新设置了基准,所以 true 原始提交是A--D--E--B'-C' <-- master
的事实丢失了。如果那个事实由于某种原因很重要,那么您通过重新定级确实失去了一些东西。
简而言之,这是反rebase的论点:您可能会丢失一些重要的历史记录。 pro-rebase的论点是,这些历史记录不仅仅是不重要,他们积极干预理解。许多计算机编程都与抽象有关,而抽象是消除不必要细节的艺术。 3 这为您提供了一个很好的“全局视图”。一旦了解了现在的位置和想要去的地方,便可以然后绘制出如何到达这里以及如何到达那里的详细信息。如果您迷失在细节的杂草中,却不知道自己在哪里,往哪里去,那么您最多会因某种布朗运动而感到幸运。
1 关于是否用额外的“ e”拼写判断也是如此:http://grammarist.com/spelling/judgment-judgement/,https://www.dictionary.com/e/judgement-vs-judgment/
2 如果不要,请浏览Think Like (a) Git上的页面。
3 这在数学上也是如此。图论本身源于消除不必要的细节:欧拉意识到所有重要的事情都是桥梁和土地块。 (请参阅脚注2中的链接。)