Svn 不是冲突的变更示例

Svn 不是冲突的变更示例,svn,Svn,我试图理解subversion合并命令的细节。我认为理解同时是冲突的变化和非冲突的变化之间的区别会有所帮助 这是本文的后续内容。考虑这样一个函数(称为修订版1) 现在让我们假设有两个人对此函数进行了更改,都是从修订版1开始的 爱丽丝: void foo(){ char bar; } 鲍勃: 在本例中,假设Alice提交了她的更改 现在Bob开始提交更改,svn将告诉Bob他已经过时,需要更新和合并更改。因此Bob运行更新,合并就发生了 基本上,很容易看出,所发生的是一个分析,它决定了B

我试图理解subversion合并命令的细节。我认为理解同时是冲突的变化和非冲突的变化之间的区别会有所帮助


这是本文的后续内容。

考虑这样一个函数(称为修订版1)

现在让我们假设有两个人对此函数进行了更改,都是从修订版1开始的

爱丽丝:

void foo(){
    char bar;
}
鲍勃:

在本例中,假设Alice提交了她的更改

现在Bob开始提交更改,svn将告诉Bob他已经过时,需要更新和合并更改。因此Bob运行更新,合并就发生了

基本上,很容易看出,所发生的是一个分析,它决定了Bob从第1版更改了什么,Alice从第1版更改了什么。一个简单的合并将产生如下结果

double foo(){
    [conflict] bar;
    bar = 0;
    return bar;
}
请注意,Alice和Bob都将
条形图的类型从
int
更改为
,除了Alice将其改为
char
和Bob将其改为
double
。合并无法决定哪一个是正确的(它没有进行代码分析),因此作为一个人,Bob需要帮助解决冲突

当然,这个例子有些做作,除了注意到的冲突之外,所有其他变化都不是冲突


如果Bob没有更改
条的类型
,文件将合并而不发生冲突。

冲突的更改是指两个人都对同一文件进行了更改,导致两个更改无法自动解决

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

原始文件

line1
line2
line3
line1
line2
line3
line1
line2
line3
人员A将其更改为:

line1CHANGED
line2
line3
line1
line2CHANGED
line3
line1CHANGED_BY_A
line2
line3
line1CHANGED_BY_B
line2
line3
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
line1CHANGED_BY_B
line2
line3ALSO_CHANGED_BY_B
人员B将其更改为:

line1CHANGED
line2
line3
line1
line2CHANGED
line3
line1CHANGED_BY_A
line2
line3
line1CHANGED_BY_B
line2
line3
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
line1CHANGED_BY_B
line2
line3ALSO_CHANGED_BY_B
当这些文件都签入并合并时,不会发生冲突,因为它可以轻松解决以生成此最终文件:

line1CHANGED
line2CHANGED
line3
Subversion将自动将其作为合并处理

2)现在是冲突更改的示例。

原始文件

line1
line2
line3
line1
line2
line3
line1
line2
line3
人员A将其更改为:

line1CHANGED
line2
line3
line1
line2CHANGED
line3
line1CHANGED_BY_A
line2
line3
line1CHANGED_BY_B
line2
line3
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
line1CHANGED_BY_B
line2
line3ALSO_CHANGED_BY_B
人员B将其更改为:

line1CHANGED
line2
line3
line1
line2CHANGED
line3
line1CHANGED_BY_A
line2
line3
line1CHANGED_BY_B
line2
line3
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
line1CHANGED_BY_B
line2
line3ALSO_CHANGED_BY_B
这无法自动合并,因此是冲突。您需要通过接受人员A的变更或人员B的变更来解决问题。在这种情况下,subversion将警告您冲突,并要求您决定如何解决冲突

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

原始文件

line1
line2
line3
line1
line2
line3
line1
line2
line3
人员A将其更改为:

line1CHANGED
line2
line3
line1
line2CHANGED
line3
line1CHANGED_BY_A
line2
line3
line1CHANGED_BY_B
line2
line3
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
line1CHANGED_BY_B
line2
line3ALSO_CHANGED_BY_B
人员B将其更改为:

line1CHANGED
line2
line3
line1
line2CHANGED
line3
line1CHANGED_BY_A
line2
line3
line1CHANGED_BY_B
line2
line3
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
line1CHANGED_BY_B
line2
line3ALSO_CHANGED_BY_B
现在,在这个例子中,两个人都更改了文件,第1行中有一个冲突的更改必须解决,但是第2行和第3行是非冲突的更改,可以自动解决

您可以选择几种方式来解决此问题

首先,您可以完全接受A或B的文件,并丢弃另一个文件。这将导致其他非冲突变更丢失。假设,您选择使用完全解析,您的最终文件将是:

line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3ALSO_CHANGED_BY_B
(正是A的文件,B所做的所有更改都将被丢弃)

其次,您只能解决冲突的更改,并且仍然保留所有非冲突的更改。这是你会选择A或B的变化为第一行,但仍然得到另一行的变化,从两个人。例如,假设您选择使用解决冲突,您的最终文件将是:

line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3
line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3ALSO_CHANGED_BY_B
或者,您可以使用支持单独查看每个冲突的工具(因为您当然可以在同一个文件中进行多个更改,包括冲突更改和非冲突更改),这将允许您为每个冲突选择不同的解决方法


如果您在理解与命令行工具的合并时遇到困难,我强烈建议您查看KDiff(或其他一些GUI合并/差异工具),因为它们将文件并排显示(与原始文件一起),并允许您查看每个解析操作的功能。

谢谢您的详细回答!我能够在一个svn项目中重现您的示例,我终于理解了地雷冲突和地雷完整命令之间的区别!=)