关于Git的合并和重组

以上是合并和重组的结果。

我的问题是,在最终状态下, C5C3'是否相同?

或者说, git rebase等于git merge + remove C3


这个例子不是很好,因为它只考虑一次提交(合并或重新发布),给你的结果是相似的提交的印象。 一般来说,rebase会添加多个提交,而合并最多只能添加一个(快进合并不添加)。

此外,只要没有冲突要解决,或者如果每次解决冲突的方式相同,C3'和C5的最终内容将是相同的,但它们仍然是不同的提交(因为C3'和C5具有不同的父项,它们也会有不同的哈希值,这一点在下面的插图中更为明显)。 相应地,每个记录的历史是不同的。 请注意rebase,历史是线性的,而合并它是一个格子。

在合并/重新绑定几个提交时 ,请考虑同样的问题,如Mark Lodato的“Visual Git Reference”中所述。 你会看到最终的结果是完全不同的。

git checkout master
git merge other # update master with tip of branch 'other' changes

git合并其他

你只需要:

  • 当前的提交(下面ed489,因为你是主人),
  • 最新的分支提交 (这是一个快照,表示在' other '分支时代表回购的全部内容,而不是三角洲)
  • 他们的共同祖先(b325c),并执行三路合并。
  • 对于本图中工作目录和阶段的含义,请注意箭头进入三向合并,然后到工作目录和阶段。 工作目录代表您看到的所有文件(在您的硬盘上),其中一些文件因三向合并而改变。 该阶段保存由三路合并更改的文件,然后用于创建新的提交(f8bc5)。

    这与尝试在目的地分支之上重新应用分支机构的每一次提交的 rebase非常不同:

    git checkout topic # this time we are on topic
    git rebase master  # means: recreate every topic commits on top of master
                               at the end, we are still on (new) 'topic' branch
    

    git rebase master

    上面的命令获取' topic '中但不包含在master所有提交(即169a62c33a ),将它们重放到master ,然后将分支头移至新提示。 请注意,如果旧提交不再被引用,旧的提交将[最终]垃圾收集。

    重新启动时使用工作目录和暂存区域来重放提交(将更改应用于工作目录,将更改添加到暂存区域,提交暂存的更改,重复)。 一旦完成所有这些,重新设置分支的头部就被设置为新提交的最后一个(f7e63)。


    另外2个区别:

  • 合并和重新分配服务于不同的工作流程:请参阅“git merge vs. rebase”
  • “我们的”和“他们的”在合并和重组之间是不同的:“为什么”我们“和”他们的“的意思颠倒了”

  • C5和C3'将有不同的父提交,这意味着它们本身会有所不同。

    如果你问C5和C3'引用的根树是否相同,那么是(假设任何冲突都以相同的方式解决)。 换句话说,“包含在”这两个提交中的文件树将是相同的。


    如果你只看提交的内容(即不是他们的父母是什么),那么C5和C3'就包含相同的东西(假设没有合并冲突或其他需要手动更改的事物)。 所以有人可以认为它与C3已被删除一样,因为“删除C3”的一些定义。 但在Git中,不可能删除任何提交(所有提交都是不可变的),所以从Git中删除提交的操作并未定义。

    链接地址: http://www.djcxy.com/p/41683.html

    上一篇: About Git's merge and rebase

    下一篇: How can I discard remote changes and mark a file as "resolved"?