我有一个关于一般DVCS的问题,包括Git和Hg。
在Git和Hg中,合并跟踪是在“提交”级别而不是“文件/目录”级别完成的。
其中一个“副作用”是您无法轻易进行“部分合并”:
使用“基于项目的合并跟踪”(Perforce,ClearCase,Plastic SCM< = 3.0),您可以选择要合并的几个文件,然后签入,然后重复合并,并显示待处理的文件。
使用Hg,Git:一旦你合并(有办法保存文件而不合并),就会设置“跟踪”,如果重复合并,则不会留下合并的候选者。
我的问题是你对此感觉如何?
是否存在您认为“部分合并”是强制性的情况?你可以没有它吗? (与提交/ cset级别跟踪合并要快得多)。
免责声明:我为Plastic SCM工作,我们已经转向4.0中的“cset”级别跟踪,但我们想知道保持“项目级别合并跟踪”甚至是不是一个好主意允许两者。
答案 0 :(得分:4)
我的感觉是,想要对分支进行部分合并是一个标志,即首先在一个分支中放置太多。处理这种情况的正确方法是将分支拆分为两个分支,从而纠正原始错误,而不是通过尝试跟踪部分合并来混合错误。我倾向于使SCM功能更容易分割分支。
答案 1 :(得分:3)
mercurial和Git的这种全树合并来自两者的哲学,它只跟踪整棵树的状态。 Mercurial和Git都不能在元数据中存储部分合并,因为SCM跟踪合并的父级以及生成的树。这种观点的优点在于,通过提交半合并的合并,使得回购处于不稳定状态的可能性要小得多。
考虑将文件从一个子目录移动到另一个子目录的情况,并将此路径编码到源文件中。现在,当您仅合并子目录中的文件时,文件会在合并期间正确移动,但源文件中的引用仍指向旧目录。现在提交此部分合并时,VCS中的已停止状态。你需要以某种方式将最终的合并提交标记为完成(我不知道Plastic SCM是否具有这样的语义),以防止其他人检查这样的工作进展状态。
当然,合并长时间转移的分支是令人讨厌的。在DVCS世界中,这种怪物合并被试图减轻以便早期合并并且不断地转移分支(例如,一个是特征分支,并且是稳定的分支,经常合并稳定的>特征是个好主意)。此外,git还能够跟踪合并冲突解决方案(称为rerere),当您尝试多次执行相同的合并时(例如何时在最终完成之前“练习”合并),这有助于缓解合并难题。
答案 2 :(得分:2)
Pablo,这是支持项目级合并的真实案例:让主M
分支成为客户分支C
。分支C
前一段时间,可能是几周或几个月前分叉,M
同时发生了显着的变化。现在,您需要为客户执行热修复,从而修改C
中的代码。此外,您需要在M
。
我们的工作流程是在M
中进行全面,正确的修复,测试M
并提供新的通用版本的产品。然后,我需要将修复程序的相关部分合并到C
,以便能够为受问题影响的客户提供自定义构建。因此,我需要将某些更改从M
转移到C
。这样的操作将有以下几个方面:
M
合并的文件无需来自M
中的最新变更集录制器,它们可能会跨越多个变更集。因此,为了能够在检查存储库的历史记录时跟踪此类操作,文件之间的“数据(代码)流”应记录在逐个文件的情况下。生成的“合并变更集”将包含1:1自动合并以及手动调整的合并。
更新:速度与可用性权衡:据我了解您的产品,您可以选择非常好的合并等功能。而且我打赌大多数用户都不会关心超速 - 但是他们会关注一个非常好的合并。
大约十年前,在ClearCase中添加1000个文件需要10分钟。花了1分钟将它们添加到Subversion中。这就是我们选择Subversion而不是ClearCase的原因。但是,如果ClearCase需要2分钟,我们很可能会选择ClearCase,因为它具有更好的功能。
如果我获得了支持真实世界商业软件开发方案的良好工作功能,我将不关心它是否比我当前的VCS(Subversion)快50%或更慢。但是,另一方面,如果您提供的功能较差和/或某些可用性阻止程序与其他VCS工具相比,用户将无法切换。
关于变更集级别与项目级别合并的结论:坚持自由 - 这至少从我的角度来看,是项级合并。
答案 3 :(得分:1)
来自Merge some files now and some later:
考虑提交由子提交组成,每个提交仅更改一个文件,然后支持基于文件的操作。很明显,人们在分支/提交时间不知道他们将来想要合并的内容,这将解决这个问题。 git可以是内容AND文件跟踪器。
答案 4 :(得分:0)
恕我直言,为此获得分支/合并最“正确”的SCM是PRCS,它支持无痛的部分合并以及完整的每个项目历史记录。它允许你拥有像平台分支这样的东西并在它们之间合并而不用担心平台特定的变化“流血”到另一个分支。它使用的算法在这里描述;
http://prcs.sourceforge.net/merge.html
我最想念的是合并基础和两个分支不同,它会对每个文件进行三向合并,并且第一次它会提示你“你的”,“他们的”或“合并” “它会记住你的回复是下次合并的默认值。
当我使用它时,我发现分支/合并非常轻松和直观,我一直使用它们,它从未感到复杂。出于某种原因,使用hg和git进行分支/合并从未感觉到如此轻松。