我们最近做了一个 hg copy
我们的存储库中的目录。我们想到了
做的事情 cp -a
和 hg add
并且可能以某种方式标记
此文件已从repo中的另一个文件复制(所以 hg
annotate
显示原始提交者)。但现在看来 hg
copy
做的更多或不同的东西。我真的找不到
很多关于如何复制的工作原理。所以:
- 到底是什么
hg copy
这有什么特别的待遇
未来的原因?
- 如果事实证明对我们的案件做了“错误的事情(tm)”,我该怎么做
取消标准文件作为另一个文件的副本?
(您可能希望在Mercurial邮件列表中提出此问题 按照原始主题 太。)
- hg拷贝究竟做了什么以及做了什么特殊处理
未来的原因?
它添加新文件并将其标记为旧文件的副本。因为它们是副本,所以原始文件中的更改将合并到副本中。时间从左到右流动:
(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
\ /
(hg copy a.txt b.txt)
- 如果事实证明对我们的案件做了'错误的事(tm)',我该怎么做
取消标准文件作为另一个文件的副本?
合并时,此机制才会启动。如果 b.txt
不存在于
共同的祖先修订(上图中的init),然后是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
。