不是冲突的变更示例

Hua*_*ing 11 svn

我试图了解subversion合并命令的细节.我认为理解一场同样是冲突的变革与一场不是冲突的变革之间的区别也会有所帮助.

这是该主题的后续内容.

Sim*_*ens 23

一个冲突的变化是当两个人同时对同一个文件进行更改时,两个更改无法自动解决.

1)让我们从一个非冲突合并的例子开始.

原始文件

line1
line2
line3
Run Code Online (Sandbox Code Playgroud)

人A将其更改为:

line1CHANGED
line2
line3
Run Code Online (Sandbox Code Playgroud)

B人将其更改为:

line1
line2CHANGED
line3
Run Code Online (Sandbox Code Playgroud)

当这些都被签入并合并时,没有冲突,因为它可以轻松解析以生成这个最终文件:

line1CHANGED
line2CHANGED
line3
Run Code Online (Sandbox Code Playgroud)

Subversion将作为合并自动处理.

2)现在是一个冲突变化的例子.

原始文件

line1
line2
line3
Run Code Online (Sandbox Code Playgroud)

人A将其更改为:

line1CHANGED_BY_A
line2
line3
Run Code Online (Sandbox Code Playgroud)

B人将其更改为:

line1CHANGED_BY_B
line2
line3
Run Code Online (Sandbox Code Playgroud)

这不能自动合并,因此是冲突.您需要通过接受A人的变更或B人的变更来解决.在这种情况下,subversion会警告您冲突,并要求您决定如何解决冲突.

3)最后,您可以在同一修订版中同时进行冲突和非冲突更改.

原始文件

line1
line2
line3
Run Code Online (Sandbox Code Playgroud)

人A将其更改为:

line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
Run Code Online (Sandbox Code Playgroud)

B人将其更改为:

line1CHANGED_BY_B
line2
line3ALSO_CHANGED_BY_B
Run Code Online (Sandbox Code Playgroud)

现在,通过此示例,两个人都更改了文件,并且第1行上存在必须解决的冲突更改,但第2行和第3行是无冲突的更改,可以自动解决.

您可以选择以多种方式解决此问题.

首先,您可以完全接受A或B的文件并丢弃另一个.这将导致其他人失去不相互冲突的变化.比如,您选择使用A完全解析,您的最终文件将是:

line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
Run Code Online (Sandbox Code Playgroud)

(正好是A的文件,B的所有更改都被丢弃)

其次,您只能解决冲突的更改,并仍保留所有非冲突的更改.这就是你要为第一行选择A或B的变化,并且仍然可以从两个人那里得到其他行的变化.所以,比如说你选择使用A来解决冲突,你的最终文件将是:

line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3ALSO_CHANGED_BY_B
Run Code Online (Sandbox Code Playgroud)

另外,您可以使用像KDiff这样的工具来支持单独检查每个冲突(当然,您可以在同一个文件中进行多重冲突,包括冲突和非冲突),这样您就可以为每个冲突选择不同的分辨率方法.

如果您无法理解与命令行工具的合并,我强烈建议您查看KDiff(或其他一些GUI合并/差异工具),因为它们会一起显示文件(以及原始文件),并允许您进行视觉每个决议行动会做什么.


Mar*_*iot 7

考虑这样的函数(称之为修订版1)

void foo(){
    int bar;
}
Run Code Online (Sandbox Code Playgroud)

现在让我们假设有两个人对这个函数进行了更改,从版本1开始.

爱丽丝:

void foo(){
    char bar;
}
Run Code Online (Sandbox Code Playgroud)

鲍勃:

double foo(){
    double bar;
    bar = 0;
    return bar;
}
Run Code Online (Sandbox Code Playgroud)

为了这个例子,我们假设Alice提交了她的更改.

现在Bob去提交更改,svn会告诉Bob他已经过时了,需要更新和合并更改.所以Bob运行更新,然后进行合并.

基本上,(有点)很容易看出发生的事情是一个分析,它决定了Bob从修订版1改变了什么以及Alice从修订版1改变了什么.一个简单的合并会产生像

double foo(){
    [conflict] bar;
    bar = 0;
    return bar;
}
Run Code Online (Sandbox Code Playgroud)

请注意,Alice和Bob都改变了barfrom 的类型int,除了Alice制作它char和Bob制作它double.合并无法决定哪一个是正确的(它没有进行代码分析),因此人类鲍勃需要帮助解决冲突.

这个例子,当然,有些做作,并与标注冲突外,其他所有的变化都没有冲突.

如果Bob没有更改类型bar,则文件将合并而不会发生冲突.