我正在尝试了解subversion merge命令的细节。我认为理解冲突的变化与非冲突的变化之间的区别会有所帮助。
这是此thread的后续内容。
答案 0 :(得分:23)
一个冲突的变化是当两个人同时对同一个文件进行更改时,两个更改无法自动解决。
1)让我们从一个非冲突合并的例子开始。
原始文件
line1
line2
line3
人A将其更改为:
line1CHANGED
line2
line3
B人将其更改为:
line1
line2CHANGED
line3
当这些都被签入并合并时,没有冲突,因为它可以轻松解析以生成这个最终文件:
line1CHANGED
line2CHANGED
line3
Subversion会自动将其作为合并处理。
2)现在是一个冲突变化的例子。
原始文件
line1
line2
line3
人A将其更改为:
line1CHANGED_BY_A
line2
line3
B人将其更改为:
line1CHANGED_BY_B
line2
line3
这不能自动合并,所以这是一个冲突。您需要通过接受A人的变更或B人的变更来解决。在这种情况下,颠覆会警告你冲突,并要求你决定如何解决它们。
3)最后,您可以在同一版本中同时进行冲突和非冲突更改。
原始文件
line1
line2
line3
人A将其更改为:
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
B人将其更改为:
line1CHANGED_BY_B
line2
line3ALSO_CHANGED_BY_B
现在,通过这个例子,两个人都改变了文件,并且第1行有一个必须解决的冲突变化,但是第2行和第2行。 3是非冲突的变化,可以自动解决。
您可以选择以多种方式解决此问题。
首先,您可以完全接受A或B的文件并丢弃另一个。这将导致其他人失去不相互冲突的变化。比如,您选择使用A完全解析,您的最终文件将是:
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
(完全是A的文件,B的所有更改都被丢弃)
其次,您只能解决冲突的更改,并仍然保留所有非冲突的更改。这就是你要为第一行选择A或B的变化,并且仍然可以从两个人那里得到其他行的变化。因此,例如,您选择使用A解决冲突,您的最终文件将是:
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3ALSO_CHANGED_BY_B
备选方案您可以使用KDiff之类的工具来支持单独检查每个冲突(因为您可以在同一个文件中进行多重冲突,包括冲突和非冲突),这样您就可以选择每种方法都有不同的解决方法。
如果您无法理解与命令行工具的合并,我强烈建议您查看KDiff(或其他一些GUI合并/差异工具),因为它们会一起显示文件(以及原始文件)并允许你可以看到每个决议行动会做什么。
答案 1 :(得分:7)
考虑这样的函数(称之为修订版1)
void foo(){
int bar;
}
现在让我们假设有两个人对这个功能进行了修改,都是从修订版1开始的。
爱丽丝:
void foo(){
char bar;
}
鲍勃:
double foo(){
double bar;
bar = 0;
return bar;
}
为了这个例子,我们假设Alice提交了她的更改。
现在Bob要提交更改,svn会告诉Bob他已经过时了,需要更新和合并更改。因此Bob运行更新,并进行合并。
基本上,(有点)很容易看出发生的事情是一个分析,它决定了鲍勃从修订版1改变了什么以及Alice从修订版1改变了什么。一个简单的合并将产生类似
的东西double foo(){
[conflict] bar;
bar = 0;
return bar;
}
请注意,Alice和Bob都更改了bar
的{{1}}类型,但Alice将其设为int
,Bob将其设为char
。合并无法决定哪一个是正确的(它没有进行代码分析),因此人类鲍勃需要帮助解决冲突。
当然,这个例子有点人为,除了上述冲突之外,所有其他变化都是不冲突。
如果Bob没有更改double
的类型,则文件将合并而不会发生冲突。