- hg copy 到底有什么作用,有什么特殊处理
以后有什么原因?
它添加新文件并将它们标记为旧文件的副本。因为它们是副本,所以对原始文件所做的更改将被合并到副本中。时间从左向右流动:
(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
\ /
(hg copy a.txt b.txt)
- 如果事实证明我们的情况是“错误的事情 (tm)”,我该怎么办
取消将该文件标记为另一个文件的副本?
此机制仅在您合并时启动。如果b.txt 不存在于
共同祖先修订(上图中的初始化),然后 Mercurial 将
向后搜索,看看b.txt 是否是从其他地方复制的。
让我们以缩写形式继续上图:
(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge)
\ / /
(copy a b) --/------- (edit 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 带回只包含一行a。