Mar*_*ler 14 version-control merge mercurial
我们最近hg copy在我们的存储库中创建了一个目录.我们认为它做了类似的事情cp -a,hg add并且可能以某种方式标记该文件已从repo中的另一个文件复制(因此hg
annotate显示原始提交者).但现在看来,hg
copy它确实比这更多或更不同.我真的找不到复制的确切方式.所以:
hg copy什么以及这将在未来引起什么特殊待遇?(这个问题是在Mercurial邮件列表中提出的,您可能也想跟随原始帖子.)
Mar*_*ler 16
- hg拷贝究竟做了什么以及这将在未来引起什么特殊处理?
它添加新文件并将其标记为旧文件的副本.因为它们是副本,所以原始文件中的更改将合并到副本中.时间从左到右流动:
(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
\ /
(hg copy a.txt b.txt)
Run Code Online (Sandbox Code Playgroud)
- 如果事实证明对我们的案例做了"错误的事情(tm)",我如何取消文件作为另一个文件的副本?
合并时,此机制才会启动.如果b.txt共同的祖先修订版(上图中的init)中没有,那么Mercurial将向后搜索以查看是否b.txt从其他地方复制.
让我们以缩写形式继续上面的图表:
(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge)
\ / /
(copy a b) --/------- (edit b) ------------------/
Run Code Online (Sandbox Code Playgroud)
问题是最终合并是如何完成的.共同的祖先点现在是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"
Run Code Online (Sandbox Code Playgroud)
这是副本,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"
Run Code Online (Sandbox Code Playgroud)
这是第一次合并,编辑a被复制到b:
$ cat b
a
aa
Run Code Online (Sandbox Code Playgroud)
我们现在并行进行更改:
$ 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)
Run Code Online (Sandbox Code Playgroud)
没有进一步复制:
$ cat a
a
aa
aaa
$ cat b
a
aa
bbb
Run Code Online (Sandbox Code Playgroud)
至于禁用此...您无法真正明确禁用复制检测.但正如我希望上面说明的那样,它在第一次合并后不会再"打扰"你了.
如果第一次合并有问题,那么您可以使用hg resolve --tool
internal:local在重新开始合并之前将文件重置回其状态.所以
$ hg resolve --tool internal:local b
Run Code Online (Sandbox Code Playgroud)
我们本可以带b回来只包含一行a.
| 归档时间: |
|
| 查看次数: |
7763 次 |
| 最近记录: |