关于Git的合并和重组
以上是合并和重组的结果。
我的问题是,在最终状态下, C5和C3'是否相同?
或者说, 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
你只需要:
other
'分支时代表回购的全部内容,而不是三角洲) 对于本图中工作目录和阶段的含义,请注意箭头进入三向合并,然后到工作目录和阶段。 工作目录代表您看到的所有文件(在您的硬盘上),其中一些文件因三向合并而改变。 该阶段保存由三路合并更改的文件,然后用于创建新的提交(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
上面的命令获取' topic
'中但不包含在master
所有提交(即169a6
和2c33a
),将它们重放到master
,然后将分支头移至新提示。 请注意,如果旧提交不再被引用,旧的提交将[最终]垃圾收集。
重新启动时使用工作目录和暂存区域来重放提交(将更改应用于工作目录,将更改添加到暂存区域,提交暂存的更改,重复)。 一旦完成所有这些,重新设置分支的头部就被设置为新提交的最后一个(f7e63)。
另外2个区别:
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"?