git pull vs git pull --rebase

时间:2018-08-31 15:13:19

标签: git branch

参考这个写得很好的答案:https://stackoverflow.com/a/4675513/1139436

如果您实际上出于某种原因感到需要某种东西作为分支...

“分支”在这里指的是什么?在我们的工作流程中,我们分支母版以进行错误修复,添加新功能等,然后将这些更改推送给gerrit进行审核,一旦批准(我假设我没有设置),这些合并会合并到母版中。这些分支是被引用的,还是注释所引用的是更大的项目(项目分歧等等)?

返回我们的工作流程...提交更改后,我们将git checkout mastergit pull *和git branch -D bugfix_branch。我用*标记了pull,因为它通常导致在本地master中合并提交。我开始使用git pull --rebase,不再看到那些合并提交,但是我承认,我根本不了解幕后发生的事情。

为什么我会看到合并提交,我是否想要它们?我最好--rebase并避免使用它们吗?只要“可以正常工作”,似乎没人会回答。

1 个答案:

答案 0 :(得分:2)

最终,关于是否使用面向合并的工作流程,面向基于基础的工作流程或某种混合的决定(即,同时使用两者,根据判断选择哪个),是一个意见问题,判断。 1 双方都有很好的论点。这是两个外部意见页面,one by Ken Sheedlo in favor of rebaseone 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会记住FC')并看到落实 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中的链接。)