Version control “可以吗?”;“虐待”;Mercurial';s重命名功能以跟踪代码块的移动?
有时我发现,随着时间的推移,我的文件中包含的类/函数/任何东西都比我喜欢的多。是时候重构了!在这种情况下,我通常会发现我的一个文件变成几个:它本身加上几个其他文件,每个文件都包含不同的文件段 不幸的是,仅仅创建这些新文件就有点“破坏”了历史记录——很难说这些函数最初来自另一个文件。如果在重构过程中对代码进行了任何其他更改,情况会更糟 我的一位同事发现,他可以通过以下方式“滥用”重命名功能:Version control “可以吗?”;“虐待”;Mercurial';s重命名功能以跟踪代码块的移动?,version-control,mercurial,merge,rename,Version Control,Mercurial,Merge,Rename,有时我发现,随着时间的推移,我的文件中包含的类/函数/任何东西都比我喜欢的多。是时候重构了!在这种情况下,我通常会发现我的一个文件变成几个:它本身加上几个其他文件,每个文件都包含不同的文件段 不幸的是,仅仅创建这些新文件就有点“破坏”了历史记录——很难说这些函数最初来自另一个文件。如果在重构过程中对代码进行了任何其他更改,情况会更糟 我的一位同事发现,他可以通过以下方式“滥用”重命名功能: hg rename --after original_file new_file_1 hg rename
hg rename --after original_file new_file_1
hg rename --after original_file new_file_2
hg rename --after original_file new_file_3
hg add original_file
结果是,每个新文件看起来都像一个重命名,而文件的其余部分被删除,而原始文件看起来像丢失了删除的块。到目前为止,这似乎是理想的。然而,我担心这些多次重命名会导致一些混乱的合并
这种“多次重命名”方法有什么问题吗?更简单的方法是使用
hg copy
:
hg copy original_file new_file_1
hg copy original_file new_file_2
hg copy original_file new_file_3
现在所有3个都有原始历史。但是,是的,无论哪种方式,这都是完全可以的,而且通常都是这样做的。在这样做之前,你应该确保你已经完成了
简而言之,将文件从原始文件
复制到新文件_1
会添加一个链接,Mercurial将在将来的合并中使用当且仅当它在公共祖先中找不到新文件_1
时。这通常仅在创建副本后的第一次合并中发生
图表可以更好地说明这一点:
old --- edit old --- edit in old copied to new --- edit old --- merge
\ / /
copy old new --/------- edit new ------------/
我们从一个变更集开始,在该变更集中,您拥有文件old
。然后在一个分支上编辑old
,并将old
复制到另一个分支中的new
。在第一次合并中,对old
的编辑被复制到new
中。在第二次合并中,没有对new
进行特殊处理,因为new
是在公共祖先中找到的(即copy old new
变更集)
这对于您的案例意味着,未来的合并有很大的不同,这取决于人们何时看到复制旧的新的。如果你能让每个人都使用
old --- copy old new
作为他们的出发点,一切都很好。但是,如果有人从旧的
变更集中有分支,并且在该分支中实际编辑了旧的
,那么当他们试图与复制旧的
变更集合并时,他们会遇到合并冲突
更准确地说,如果他们编辑了旧
文件中未复制到新
文件中的任何部分,则会出现合并冲突。合并冲突提醒您,old
中有更改,需要复制到new
。然而,当你真的这么做的时候
hg copy old new1
hg copy old new2
hg copy old new3
然后,在三个新文件中的两个文件中会出现不相关的合并冲突
如果您刚刚删除了旧的
文件并添加了三个新文件,那么您仍然会在此处遇到合并冲突:将询问您
remove changed old which local deleted
use (c)hanged version or leave (d)eleted?
你是想看到提示还是想看到合并工具的启动取决于你自己——但是现在你知道了hg copy
(或者hg rename--after
,其实是一样的事情)。太棒了!谢谢你的详细回答!