不是冲突的变更示例

时间:2010-01-22 23:02:20

标签: svn

我正在尝试了解subversion merge命令的细节。我认为理解冲突的变化与非冲突的变化之间的区别会有所帮助。

这是此thread的后续内容。

2 个答案:

答案 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的类型,则文件将合并而不会发生冲突。