duk*_*ave 4 version-control haskell dvcs darcs merge-conflict-resolution
我的混淆来自于此处的以下声明:
当拉出彼此冲突的补丁(例如,更改文件的相同部分)时,Darc会检测冲突并将其标记在存储库内容中.然后,它允许用户解决问题.
这似乎与我所看到的不一致,因此我使用darcs 2.5.2创建了以下工作流程:
在执行这些步骤之后,我darcs whatsnew在bar中运行,并显示了两个"补丁原语":
我的问题是:为什么没有提到在栏中添加和记录的行?
如果我darcs revert在bar中运行,那么一切都有意义:我看到"非空文件"受到两个冲突补丁的影响,根据此处的说法:
命令darcs revert将删除冲突标记并在冲突补丁之前恢复到状态.
但是如果我运行的话,我会darcs mark-conflicts回到拉动之后的状态,使用上面提到的两个"补丁基元",并且没有提到添加并记录在条形中的行.
对于参考/再现,这是我从命令行完成的工作流程:
$ mkdir foo
$ cd foo/
foo$ darcs initialize
foo$ touch shopping
foo$ vi shopping <-- add a couple of lines
foo$ darcs add shopping
foo$ darcs record
addfile ./shopping
Shall I record this change? (1/2) [ynW...], or ? for more options: y
hunk ./shopping 1
+cake
+pie
Shall I record this change? (2/2) [ynW...], or ? for more options: y
What is the patch name? Added shopping
Do you want to add a long comment? [yn]n
Finished recording patch 'Added shopping'
foo$ cd ..
$ darcs get foo/ bar
$ cd bar/
bar$ vi shopping <-- add another line
bar$ darcs record
hunk ./shopping 2
+beer
Shall I record this change? (1/1) [ynW...], or ? for more options: y
What is the patch name? Added beer
Do you want to add a long comment? [yn]n
Finished recording patch 'Added beer'
bar$ cd ../foo
foo$ rm shopping
foo$ darcs record
hunk ./shopping 1
-cake
-pie
Shall I record this change? (1/2) [ynW...], or ? for more options: y
rmfile ./shopping
Shall I record this change? (2/2) [ynW...], or ? for more options: y
What is the patch name? Removed shopping
Do you want to add a long comment? [yn]n
Finished recording patch 'Removed shopping'
foo$ cd ../bar
bar$ darcs pull
Pulling from "../foo"...
Mon Nov 14 19:26:44 GMT 2011 dukedave@gmail.com
* Removed shopping
Shall I pull this patch? (1/1) [ynW...], or ? for more options: y
Backing up ./shopping(-darcs-backup0)
We have conflicts in the following files:
./shopping
Finished pulling and applying.
bar$ darcs whatsnew
hunk ./shopping 1
-cake
-pie
rmfile ./shopping
Run Code Online (Sandbox Code Playgroud)
如果您darcs changes -v在栏内运行,您将看到更改的历史记录,包括因拉动冲突补丁而引入的冲突者.
我把你的例子总结为略微缩短的东西:
DARCS=/usr/bin/darcs
$DARCS init --repo foo
cd foo
echo 'a' > myfile
$DARCS add myfile && $DARCS record -am 'Add myfile'
$DARCS get . ../bar
rm myfile
$DARCS record -am 'Remove myfile'
cd ../bar
echo 'b' >> myfile
$DARCS record -am 'Change myfile'
$DARCS pull -a ../foo
$DARCS changes -v
Run Code Online (Sandbox Code Playgroud)
现在,在那之后,我看到了这个输出 darcs changes -v
Tue Nov 15 19:44:38 GMT 2011 Owen Stephens <darcs@owenstephens.co.uk>
* Remove myfile
conflictor [
hunk ./myfile 2
+b
]
|:
hunk ./myfile 1
-a
conflictor {{
|:
hunk ./myfile 2
+b
|:
hunk ./myfile 1
-a
}} []
|hunk ./myfile 1
|-a
|:
rmfile ./myfile
Tue Nov 15 19:44:38 GMT 2011 Owen Stephens <darcs@owenstephens.co.uk>
* Change myfile
hunk ./myfile 2
+b
Tue Nov 15 19:44:38 GMT 2011 Owen Stephens <darcs@owenstephens.co.uk>
* Add myfile
addfile ./myfile
hunk ./myfile 1
+a
Run Code Online (Sandbox Code Playgroud)
那么,让我们来解释一下"删除myfile"的疯狂输出.foo中存在以下内容:"删除myfile":
Tue Nov 15 19:44:38 GMT 2011 Owen Stephens <darcs@owenstephens.co.uk>
* Remove myfile
hunk ./myfile 1
-a
rmfile ./myfile
Run Code Online (Sandbox Code Playgroud)
所以,第1行的一个大块并删除了该文件.
将"删除myfile"拉入栏中,我们通过引入特殊的"conflicttor"原语来修改补丁内容,这些原语表示"删除myfile"中与"bar"中其他原语冲突的原语.Nb这里没有信息丢失 - 我们总是可以通过取消冲突的变化来回到原始原语 - 在这种情况下,取消对"更改myfile"的删除.
冲突者感到困惑,但AFAICT基本上将与当前补丁相冲突的变化分为两组:"ix",这是一组补丁,包括:i)与x冲突的补丁和回购中的其他补丁ii)补丁与与x"xx"冲突的补丁发生冲突,x"xx"是仅与补丁x冲突的补丁序列.我认为这样做的原因是,冲突者具有"撤销"导致冲突的原语的作用,但只有那些未被另一个冲突者撤消的原语.
我们看到的输出是这样的:
"conflictor" ix "[" xx "]" x
Run Code Online (Sandbox Code Playgroud)
我正在滥用符号,但希望你能解读一下(请参阅darcs.net repo中的src/Darcs/Patch/V2 /(Real.hs | Non.hs)以获取完整的故事)
在这种情况下,"删除myfile"有2个原始补丁,并且(在这种情况下)拉入条形时有2个相应的冲突器.
第一个原语(从myfile中删除第1行)只与"更改myfile"中的原语冲突(将'b'添加到myfile的第2行),这是第一个冲突者:
conflictor [ <--- The start of xx (no ix here)
hunk ./myfile 2
+b
] <--- The end of xx
|:
hunk ./myfile 1 <--- x
-a
Run Code Online (Sandbox Code Playgroud)
NB("|:"是一个标记,它从原始本身界定"非"原始的上下文 - 我不会尝试进一步解释它,只需阅读下面的|:来查看有问题的原语)
第二个原语(删除myfile)只是稍微复杂一些:(rmfile myfile)与(在myfile的第2行添加'b')冲突,我们知道它与myfile中的第1行相冲突,所以它们都进入" ix","xx"中没有补丁.我将删除不必要的"|:"分隔符和空格:
conflictor {{
hunk ./myfile 2
+b
hunk ./myfile 1
-a
}}
[] <--- no xx
|hunk ./myfile 1 <--- start of x
|-a
|:
rmfile ./myfile <--- end of x
Run Code Online (Sandbox Code Playgroud)
最后的(rmfile myfile)有一些上下文来识别我们所指的确切原语(我不确定为什么/如何这是必需的,但我们有),它由前导'|'和由"|:"分隔.
最后,尝试解释darcs whatsnewfoo 的输出; 当多个补丁冲突时,我认为冲突者的实际效果是"撤消"任何冲突的补丁,不会产生任何效果; 给出了一些解释的开头:http://en.wikibooks.org/wiki/Understanding_Darcs/Patch_theory_and_conflicts.
我想你现在看到的是"改变MYFILE"和"删除文件MyFile"称呼他们的强迫换流的结果A,并B分别.然后合并这两个,Darcs创建A^-1和通勤,A^-1并B给予B'和(A^-1)'在哪里B'有效果A^-1(因为我们迫使换向工作),这意味着B'(即合并的"删除myfile")的效果实际上只是撤消添加"更改myfile"所做的行.
我没有时间看看它是如何darcs mark-conflicts工作的,所以我还不能解释你darcs changes在酒吧看到的工作变化.