为什么Git在合并时会显示两个提交?

时间:2014-03-13 15:04:52

标签: git

让我们看一下以下情景:

  1. 两名开发人员克隆回购。
  2. Dev 1提交更改,然后推送。
  3. Dev 2提交更改,然后尝试推送,Git会说不,你不能,你需要拉,公平。
  4. Dev 2拉出变更Dev 1 made
  5. 现在Dev 2想要推动变革,Git说有两个提交被推,一个是他自己做的改变,一个是合并,但为什么两个?为什么不只是一个合并信息包含在其中?
  6. 我确信有一个很好的解释:)

2 个答案:

答案 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需要真实的历史才能快速追踪一个错误 - 好吧,一个改变历史"重写真相。