让我们看一下以下情景:
我确信有一个很好的解释:)
答案 0 :(得分:5)
因为,当Alice和Bob将更改应用于同一个提交时,他们在路上创建了一个分支。无论是Alice还是Bob都必须将这两条路径合并为一条。
这是通过所谓的“合并提交”来完成的 - 如果通常是空的,那么Alice和Bob的更改之间没有冲突。如果有待解决的冲突,这些将进入“合并提交”。
或者,您可以git pull --rebase
,它将执行fetch + rebase,而不是fetch + merge。
这可以避免创建“合并提交”。相反,鲍勃将回放他的变化,拉动爱丽丝的变化,然后在爱丽丝之上重播他的变化。如果存在任何冲突,则必须在“重播”期间解决这些冲突 - 并且这将是Bob提交的一部分。
答案 1 :(得分:0)
在Alice"赢得推动竞赛后,只需稍微扩展dcastro's answer"因此,鲍勃必须引入爱丽丝的变化,并将其与他的......结合起来。
鲍勃的两个选择是"合并"和" rebase"。
合并是技术上最准确的。它告诉人C(或D或E,或者可能一直到Zach),稍后,Alice和Bob同时进行了的更改,可能没有看到另一个是什么做。
Bob的另一个选择," rebase",包括Bob弄清楚他做了什么,撤消它,得到Alice做了什么,看着那个,然后重做Bob做了什么。 (使用git rebase
自动化所有这些,以便在大多数情况下它完全无关紧要。)后来,Zach会认为Alice先做了她的事,然后Bob又来了,然后做了他的事情,在爱丽丝的工作之上工作。
这里需要考虑的问题是Zach(或Cathy或Doug等)到那时是否真正关心。如果没有,Bob做一个rebase可能是更好的选择。它使事情看起来更简单。它在技术上不太准确。
在更复杂的情况下,保留真实历史更有意义。让我们说的不仅仅是爱丽丝和鲍勃,还有爱丽丝和鲍勃的整个团队 led 。而不是每个只提交一个,每个团队都做了很多提交。在这一点上,如果某些事情在某处出现问题,为了将来解决问题,使用真正的合并更有意义,保持真实的历史。如果,过了一段时间后,Zach需要真实的历史才能快速追踪一个错误 - 好吧,一个改变历史"重写真相。