16

我一直在使用 TortoiseSVN、svn 和 subclipse,并且我认为我了解基础知识,但是有一件事一直困扰着我一段时间:合并引入了不需要的代码。这是步骤。

trunk/test.txt@r2. 使用“A”创建了一个测试文件并返回:

A
[EOF]

branches/TRY-XX-Foo/test.txt@r3. 扩展trunkTRY-XX-Foo

A
[EOF]

branches/TRY-XX-Foo/test.txt@r4. 进行了不必要的更改TRY-XX-Foo并提交了它:

A
B (unwanted change)
[EOF]

branches/TRY-XX-Foo/test.txt@r5. 修复了一个重要的错误TRY-XX-Foo并提交了它:

A
B (unwanted change)
C (important bug fix)
[EOF]

现在,我只想将重要的错误修复合并回主干。所以,我运行 merge for revision 4:5。我最终在我的工作目录中是一个冲突。

trunk/test.txt

A
<<<<<<< .working
=======
B (unwanted change)
C (important bug fix)
>>>>>>> .merge-right.r5
[EOF]

违背我的意愿,Subversion 现在已经在主干代码中包含了“不需要的更改”,我需要手动清除它们。当在分支中进行多次连续更改时,有没有办法只合并指定的修订?

问题的一部分是 B (未更改的更改)包含在 .merge-right 中,我无法区分它来自哪个修订版。我通常使用 TortoiseMerge,它的外观如下。

text.txt.working

4

8 回答 8

38

仅将修订版 4,7 和 11-15 与svnmerge合并:

svnmerge.py merge -r4,7,11-15

并使用常规 svn:

svn merge -c4,7 -r10:15 http://.../branches/TRY-XX-Foo
于 2008-11-29T00:15:43.360 回答
5

问题是这两个svn

A
<<<<<<< .working
=======
B (unwanted change)
C (important bug fix)
>>>>>>> .merge-right.r341

TortoiseSVN 将这种情况视为 2 路合并。我听说过 3-way merge 这个词,所以我试了一下 Beyond Compare。使用 TortoiseSVN 进行快速设置后,编辑冲突现在会显示以下屏幕。这并不完美,因为它仍然需要人工干预,但至少我可以分辨出哪些变化来自哪里。

见截图

于 2008-12-14T00:14:27.787 回答
2

我相信您正确地包含了您想要的修订,但是合并算法无法找到插入所需更改的位置,因此也包括它上面的行。以下是相同的步骤,但有一组不同的更改,我相信它会按照您最初的预期工作:

$ svnadmin 创建仓库
$ svn mkdir -m '' file://`pwd`/repo/trunk

提交的修订版 1。
$ svn mkdir -m '' file://`pwd`/repo/branches

提交的修订版 2。
$ svn co file://`pwd`/repo/trunk co.trunk
签出修订版 2。
$ cat > co.trunk/test.txt << EOF
> 一个
> 乙
> C
> EOF
$ svn 添加 co.trunk/test.txt
一个 co.trunk/test.txt
$ svn commit -m '' co.trunk
添加 co.trunk/test.txt
传输文件数据。
提交的修订版 3。
$ svn copy -m '' file://`pwd`/repo/trunk file://`pwd`/repo/branches/testbr

提交的修订版 4。
$ svn co file://`pwd`/repo/branches/testbr co.testbr
一个 co.testbr/test.txt
签出修订版 4。
$ cat > co.testbr/test.txt << EOF
> 一个
> A1 不需要
> 乙
> C
> EOF
$ svn commit -m '' co.testbr
发送 co.testbr/test.txt
传输文件数据。
提交的修订版 5。
$ cat > co.testbr/test.txt << EOF
> 一个
> A1 不需要
> 乙
> B1 通缉
> C
> EOF
$ svn commit -m '' co.testbr
发送 co.testbr/test.txt
传输文件数据。
提交的修订版 6。
$ svn merge -r 5:6 file://`pwd`/repo/branches/testbr co.trunk
--- 将 r6 合并到 'co.trunk' 中:
u co.trunk/test.txt
$ cat co.trunk/test.txt
一种
乙
B1 通缉
C
于 2009-01-28T15:02:03.513 回答
2

澄清一下关于合并的事情是它实际上有两个步骤。

  1. 合并
  2. 犯罪

所以这意味着在你的合并完成后,你可以对 head 和另一个分支进行手动比较,以确保合并是正确的。如果它有问题,比如你的情况,你可以在提交之前手动修复它。

/约翰

于 2009-01-29T06:20:05.327 回答
2

在 TortoiseSVN 中,您必须只指定要合并的修订。与命令行客户端不同,您必须指定例如 -r4:5 来合并 r4 和 r5 之间的更改,您只需指定 '5' 作为修订号即可在 TortoiseSVN 合并对话框中合并。如果您不确定,请始终使用合并对话框中的日志对话框并在该日志对话框中选择要合并的修订(然后单击确定,所选修订将自动在合并对话框中设置)。

至于解决您在 TortoiseMerge 中的冲突:根据您问题中的屏幕截图,TortoiseMerge 向您显示了两条冲突的行(在底部视图中显示为“????”的行)。你想要的是包括变化'C'而不是'B'?

  • 左键单击第一个'???' 行选择它,然后右键单击,从上下文菜单中选择“使用“我的”块”
  • 左键单击第二个'???' 行选择它,然后右键单击,从上下文菜单中选择“使用来自“他们的”的块”
  • 单击保存按钮(或文件->保存)
  • (可选)单击“标记为已解决”按钮
于 2009-01-30T07:41:12.040 回答
1

您可以做的另一件事是手动撤消分支上的错误提交,然后您可以像往常一样将分支合并回主干。

TortoiseSVN

使用 TortoiseSVN 打开文件的日志视图,选择有问题的版本,然后从右键菜单中选择“Revert changes from this revision”。提交它对您的工作副本所做的更改,然后您可以轻松地将分支合并回来。

命令行

要使用命令行客户端执行此操作,您需要执行反向合并(这取自使用 Subversion 的实用源代码控制一书),您可以将有问题的版本和先前版本之间的更改合并到文件的工作副本中。然后如上所述,您将提交更改,然后可以正常分支。在您的示例中,您将执行以下操作:

svn merge -r 4:3 test.txt
于 2009-01-28T07:06:21.867 回答
1

正如其他用户所指出的那样(我不会注意到它,因为我没有注意到它),可能是这种合并的琐碎性质(即缺乏围绕更改的上下文)使工具感到困惑。

我做了很多合并,正如您所发现的,Tortoise 提供的合并工具很糟糕。如果您经常这样做,则绝对必须使用三向合并工具。Beyond Compare 是我个人的最爱,但还有其他免费的(Meld、KDiff3)和非免费的(Araxis)。

你会注意到 Beyond Compare 最终做了正确的事情,即使它让你手动验证它的正确性!

于 2009-01-28T18:55:12.950 回答
0

如果您不想要不需要的更改,请不要合并修订版 4:5,而只合并修订版 5。这意味着您合并了修订版 5 中提交的更改。

于 2008-11-29T00:58:13.633 回答