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
,其实是一样的事情)。

太棒了!谢谢你的详细回答!