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

为什么Git在合并时显示两个提交?,git,Git,让我们看一下以下场景: 两位开发商克隆了回购协议 dev1提交更改,然后推送 dev2提交了一个更改,然后尝试推送,Git会说不,你不能,你需要拉,这很公平 开发人员2提取开发人员1所做的更改 现在dev2想要推动更改,Git说有两个提交需要推动,一个是他自己做的更改,一个是合并,但为什么要两个呢?为什么其中不包含合并信息呢 我相信有一个很好的解释:)因为当Alice和Bob对同一个提交应用更改时,他们创建了一个岔路口。爱丽丝或鲍勃必须把这两条路合二为一 这是通过所谓的“合并提交”来完成的——如

让我们看一下以下场景:

  • 两位开发商克隆了回购协议
  • dev1提交更改,然后推送
  • dev2提交了一个更改,然后尝试推送,Git会说不,你不能,你需要拉,这很公平
  • 开发人员2提取开发人员1所做的更改
  • 现在dev2想要推动更改,Git说有两个提交需要推动,一个是他自己做的更改,一个是合并,但为什么要两个呢?为什么其中不包含合并信息呢

  • 我相信有一个很好的解释:)

    因为当Alice和Bob对同一个提交应用更改时,他们创建了一个岔路口。爱丽丝或鲍勃必须把这两条路合二为一

    这是通过所谓的“合并提交”来完成的——如果Alice和Bob的更改之间没有冲突,则该提交通常为空。如果存在需要解决的冲突,这些冲突将进入“合并提交”

    或者,您可以
    git pull--rebase
    ,它将执行fetch+rebase,而不是fetch+merge


    这样可以避免创建“合并提交”。相反,Bob将倒带他的更改,拉出Alice的更改,然后在Alice的更改之上重放他的更改。如果存在任何冲突,则必须在“重播”过程中解决这些冲突,并将成为Bob提交的一部分。

    因为当Alice和Bob对同一提交应用更改时,他们创建了一个岔路口。爱丽丝或鲍勃必须把这两条路合二为一

    这是通过所谓的“合并提交”来完成的——如果Alice和Bob的更改之间没有冲突,则该提交通常为空。如果存在需要解决的冲突,这些冲突将进入“合并提交”

    或者,您可以
    git pull--rebase
    ,它将执行fetch+rebase,而不是fetch+merge

    这样可以避免创建“合并提交”。相反,Bob将倒带他的更改,拉出Alice的更改,然后在Alice的更改之上重放他的更改。如果有任何冲突,则必须在“重播”期间解决这些冲突,并将成为Bob提交的一部分。

    在Alice“赢得推送比赛”之后,再进一步说明,Bob必须将Alice的更改与他的更改结合起来

    Bob的两个选择是“合并”和“重设基础”

    合并在技术上是最精确的。后来它告诉C(或D或E,或可能一直到Zach),Alice和Bob同时进行了更改,可能没有看另一个在做什么

    Bob的另一个选择是“重设基础”,包括Bob找出他所做的,撤销它,得到Alice所做的,查看它,然后重做Bob所做的。(使用
    git-rebase
    自动化了所有这些,因此在大多数情况下,它是完全琐碎的。)后来,扎克会认为爱丽丝先做了自己的事情,然后鲍勃后来来做他的事情,在爱丽丝做的事情的基础上工作

    这里要考虑的问题是扎克(或凯西或道格等)是否会真正关心。如果不是的话,Bob做一个重基可能是更好的选择。这样以后事情看起来就简单了。只是技术上不太准确

    在更复杂的情况下,保存真实的历史更有意义。比方说,不只是爱丽丝和鲍勃,而是有一个由爱丽丝和鲍勃领导的团队。每个团队不是一次提交,而是多次提交。在这一点上,如果某个地方出了问题,那么对于将来的处理来说,使用真正的合并,保留真正的历史就更有意义了。如果一段时间后,扎克需要真实的历史来快速追踪一个bug,那么,一个重基“重写历史”,掩盖了真相。

    在爱丽丝“赢得推送比赛”之后,再进一步,鲍勃必须引入爱丽丝的变化,并将她的变化与他的结合起来

    Bob的两个选择是“合并”和“重设基础”

    合并在技术上是最精确的。后来它告诉C(或D或E,或可能一直到Zach),Alice和Bob同时进行了更改,可能没有看另一个在做什么

    Bob的另一个选择是“重设基础”,包括Bob找出他所做的,撤销它,得到Alice所做的,查看它,然后重做Bob所做的。(使用
    git-rebase
    自动化了所有这些,因此在大多数情况下,它是完全琐碎的。)后来,扎克会认为爱丽丝先做了自己的事情,然后鲍勃后来来做他的事情,在爱丽丝做的事情的基础上工作

    这里要考虑的问题是扎克(或凯西或道格等)是否会真正关心。如果不是的话,Bob做一个重基可能是更好的选择。这样以后事情看起来就简单了。只是技术上不太准确


    在更复杂的情况下,保存真实的历史更有意义。比方说,不只是爱丽丝和鲍勃,而是有一个由爱丽丝和鲍勃领导的团队。每个团队不是一次提交,而是多次提交。在这一点上,如果某个地方出了问题,那么对于将来的处理来说,使用真正的合并,保留真正的历史就更有意义了。如果一段时间后,Zach需要真实的历史来快速追踪bug,那么,一个重基“重写历史”,模糊事实。

    因为合并是一个承诺,因为开发人员2没有在开发人员1上重新设置更改的基础。因为合并是一个承诺,因为开发人员2没有在开发人员1上重新设置更改的基础。我理解这一点,但我感到困惑的是,合并提交包含了与开发人员2相同的更改即使没有冲突。如果合并提交为空,我可以接受,但现在我可以看到两个提交:一个是带有真实提交消息的真实更改,另一个是带有相同更改但带有合并提交消息的合并提交。我觉得很困惑,但我想我只是