- hg copy具体是做什么的,这会对未来造成什么特殊影响?
它添加新文件并将其标记为旧文件的副本。因为它们是副本,所以在原文件中进行的更改将合并到副本中。时间从左到右流动:
(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
\ /
(hg copy a.txt b.txt)
- 如果发现对我们的情况做了“错误的事情”,我该如何将文件标记为不是另一个文件的副本?
此机制仅在合并时启动。如果在共同祖先版本(上述图表中的init)中不存在b.txt
,则Mercurial将向后搜索以查看b.txt
是否从其他地方复制而来。
让我们继续上面的图表:
(i)
\ / /
(copy a b)
问题在于最终合并是如何完成的。共同祖先点现在是
copy a b
节点,在这里同时存在
a
和
b
。这意味着不会搜索任何副本! 因此,对
a
的第二次编辑将不会合并到
b
中。
为了双重检查,我试了一下:
$ hg init
$ echo a > a
$ hg add a
$ hg commit -m init
$ hg copy a b
$ hg commit -m "copy a b"
这是复制品,
b
现在只包含
a
。
$ hg update 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo aa >> a
$ hg commit -m "edit a"
created a new head
$ hg merge
merging a and b to b
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m "a edit copied to b"
这是第一次合并,对 a
的编辑已被复制到 b
中:
$ cat b
a
aa
我们现在同时进行变更:
$ echo aaa >> a
$ hg commit -m "edit a again"
$ hg update 3
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo bbb >> b
$ hg commit -m "edit b"
created new head
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
没有进行进一步的复制:
$ cat a
a
aa
aaa
$ cat b
a
aa
bbb
关于禁用复制检测,实际上你并不能明确地禁用它。但是如我在上面所示,第一次合并后它就不会再“打扰”你了。
如果第一次合并是个问题,那么你可以使用hg resolve --tool internal:local
将文件重置回合并之前的状态。因此:
$ hg resolve --tool internal:local b
我们可以通过将
b
还原为包含一个行的状态来实现。