Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercurial 自从hg书问世以来,“hg回退”的行为是否发生了变化?_Mercurial_Vimdiff - Fatal编程技术网

Mercurial 自从hg书问世以来,“hg回退”的行为是否发生了变化?

Mercurial 自从hg书问世以来,“hg回退”的行为是否发生了变化?,mercurial,vimdiff,Mercurial,Vimdiff,我创建了一个新的存储库,测试回退,并在其中添加了一个新文件,文件。然后,我每次提交4次,并使用 echo [manually entered number] >> file hg commit -m '[manually entered number]' 实际上,该文件有: init 1 2 3 根据hg书籍,如果我运行hg backout--merge 2,我应该: init 1 3 但是,它无法合并并打开我的difftool(vimdiff),我有3个选项: init

我创建了一个新的存储库,
测试回退
,并在其中添加了一个新文件,
文件
。然后,我每次提交4次,并使用

echo [manually entered number] >> file
hg commit -m '[manually entered number]'
实际上,该文件有:

init
1
2
3
根据hg书籍,如果我运行
hg backout--merge 2
,我应该:

init
1
3
但是,它无法合并并打开我的difftool(vimdiff),我有3个选项:

init          | init          | init
1             | 1             |
2             |               |
3             |               |
我最初使用
--merge
选项进行了尝试,然后再次尝试不使用它。我现在的问题是,我是否还有办法:

init
1
3

我只是犯了一个错误或者错过了什么,或者我被这些选项困住了吗?

你为什么得到三方合并的一个重要因素是你的上下文太过人工,我将继续讨论

如果我使用一个50行的文本文件,更改一个不同的部分并提交每个更改,我就不必解决冲突。我的意思是我有4个变更集:版本0添加文件,版本1,版本2,版本3每个变更文件的一个区域:开始,中间,或结束

在这种情况下,当我执行
hg backout 2
时,它与rev 2相反,并将这些更改合并到我的工作目录中,当我提交时,图形是线性的:

@  backout 2
|
o  3
|
o  2
|
o  1
|
o  initial
如果我改为执行
hg backout 2--merge
,它会自动将backout提交为它要备份的修订的子版本,然后将其与tip合并,在提交合并后生成分支图:

@    merge
|\
| o  backout 2
| |
o |  3
|/
o    2
|    
o    1
|    
o    initial
在这两种情况下,我不必进行任何三方合并。你不能自动得到的原因

init
1
3
取而代之的是,必须进行三方合并,因为更改太接近了。每个变更集中的上下文和更改是完全重叠的(diff块的默认上下文行数是3行,它包含仍然在第4个变更集中的整个文件)

类似的例子是,如果您有3个变更集,每个变更集都修改了同一行。如果您像这里这样退出中间的更改,您仍然会看到一个3向合并,您可能需要手动编辑以获得正确的结果

顺便说一句,行为在1.7中确实发生了变化,hg help backout证实了这一点:

在版本1.7之前,不带--merge的行为相当于指定--merge,后跟“hg update--clean.”来取消合并,并将REV的子项作为头单独合并


但是,我不认为这正是您所怀疑的。

如果我将测试文本加长,即使用
Lorem ipsum
,这会使它工作吗?另外,作为澄清,使用
--merge
时,输出是否有差异,或者两个输出都是
tip-rev2
,其中
tip
是到tip的所有修订集,而
rev2
是由
hg backout
?@anonymous删除的所有修订集:这样把文本加长不会有什么区别。差异(以及由此产生的合并)是在行的“块”上完成的,而不是字符。如果您在数字后回显多个(>6)空行,您的示例可能会起作用-这可能会导致文件中的每一个添加都被记录为一个单独的差异“块”,从而使回退合并更容易,+1感谢Joel提到差异块。@anon:换言之,如果您将文本加长,并且在修订后要退出的任何更改仍然与退出中的任何更改非常接近,那么您必须手动合并一个很好的更改。有/没有
——merge
,结果相同,只是结构不同。但我想澄清的是,回退并不能消除任何东西。它添加了与您要退出的修订相反的更改,将内容更改回修订之前的方式(然后将其与以后的更改合并)。