解决 SVN 更新时的合并冲突问题

33

我正在尝试学习Eric Sink的版本控制基础 - http://ericsink.com/vcbe/vcbe_usletter_lo.pdf

目前我在第22页。我将为您描述下面的情况。两个用户在同一台计算机上工作,harry和sally正在处理一个名为lottery.c的文件,该文件存储在名为lottery的代码库中。

1 - Harry提交了第一个/初始代码。 2 - Sally对其进行了更改并提交。 3 - 在执行2时,harry已经做出了更改,但没有提交。 4 - Harry提交并遇到错误。

Transmitting file data .svn: Commit failed (details follow):
svn: File '/lottery.c' is out of date

5 - 为了解决这个问题,哈利将使用svn update更新他的本地副本。

这就是我遇到的问题!作者说输出应该是:

lottery harry$ svn update
G lottery.c
Updated to revision 2.

但是,我的输出是 :

lottery harry$ svn update
Updating '.':
C    lottery.c
Updated to revision 2.
Conflict discovered in file 'lottery.c'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
        (mc) my side of conflict, (tc) their side of conflict,
        (s) show all options:

我是新来的,不知道该如何回复这条消息。我的书错了吗?请帮帮我。谢谢。


我现在正在使用tc。我猜这可能是作者的意思。 - Steam
3个回答

55

当多人同时更改同一文件时,很可能会发生两个人同时更改相同的行。这就是发生在你身上的事情。Sally 更改了 Harry 正在更改的相同行。当 Harry 运行 svn update 时,Subversion 检测到此情况,并询问你该怎么做。

需要注意的是:有时 Subversion 只会查找你的版本和他们的版本之间的差异,而不是有意义的差异。例如,如果更改了行的缩进或空格,或者更改了行结束符号,Subversion 将宣布此类情况为冲突,尽管实际上并不是。这可能是书中没有发现这个问题但你却发现了的原因。这并不意味着你做错了什么。

该怎么办?Subversion 给出了几个选择。

  • 延迟 p:这是我通常在这种情况下要做的。Subversion 将在文件中嵌入差异标记,看起来像这样:

 

<<<<<<< .mine
foobar
=======
fubar
>>>>>>> .rxxx

这显示了修订版本rxxx中Sally所做的更改与你所做的更改(Harry的更改)之间的差异。通常,更改很小,因此很容易弄清楚该怎么做。

  • show diff df: 这将向您显示您的更改(Harry的更改)和其他修订版本(Sally的更改)之间的区别。基本上它会展示差异标记。
  • edit e: 您可以在合并过程中编辑合并冲突,而不必等到以后再编辑。
  • merge m: 不太确定这是什么意思。您正在进行合并,因此这没有太多意义。
  • their side of conflict tc: 接受Sally所做的更改以解决冲突。您可能需要重新执行您的更改,但至少您正在考虑Sally所做的更改。
  • my side of the conflict mc: 这是最危险的情况,因为您完全忽略了Sally所做的更改。 Sally进行了修复,而您可能正在进行取消修复的操作。当发布出来时,如果Sally的修复未包含在其中,则将指责您删除了该更改。那么,为什么要这样做呢?因为您已经查看了更改,并意识到冲突实际上并不是什么问题。它可能仅仅是缩进的变化或者您称一个变量为increment而Sally称其为counter

正如我所说,我通常会延迟处理,让我的更新完成,然后再解决问题。

解决问题后,您需要在该文件上执行svn resolved命令,以告知Subversion您已解决了冲突。

还有其他选择-例如,您可以启动第三方diff/merge工具来处理冲突。

欲了解更多信息,请参阅关于解决合并冲突的Subversion在线手册。


好的简单描述。 - thebluephantom

7
如果您选择 s 选项,它将向您显示:
(e)  edit             - change merged file in an editor
(df) diff-full        - show all changes made to merged file
(r)  resolved         - accept merged version of file

(dc) display-conflict - show all conflicts (ignoring merged version)
(mc) mine-conflict    - accept my version for all conflicts (same)
(tc) theirs-conflict  - accept their version for all conflicts (same)

(mf) mine-full        - accept my version of entire file (even non-conflicts)
(tf) theirs-full      - accept their version of entire file (same)

(p)  postpone         - mark the conflict to be resolved later
(l)  launch           - launch external tool to resolve conflict
(s)  show all         - show this list

使用 dc 查看冲突,然后您可以决定使用最佳选项


1
"G"表示文件已被其他人修改,但该人所做的修改位于文件的不同部分,因此SVN可以在不需要帮助的情况下将其合并给你。
"C"表示不仅文件已被其他人修改,而且他们的更改是对你也更改的相同行进行的,因此SVN不知道该怎么做。现在轮到你来进行合并了。
你可能没有做错任何事情,书也没有错,只是显然省略了有关具体更改的细节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接