3

我在一个项目上所做的部分开发无法部署,应该在单独的分支中完成。我已经合并了向后的更改(通过乌龟的“从这个版本恢复更改”和仔细编辑),撤消应该在单独的分支中的工作,并将这个反向补丁提交到主干。我现在想创建一个分支,其中包含在上述补丁中撤消的更改。这是我所做的:

我在撤消修订之前的修订中为新开发创建了一个新分支。

我通过合并乌龟 SVN 中的一系列修订将撤消修订合并到新分支中。

我打开了更改日志,选择了“包括合并的修订版”和“从该修订版还原更改”。这恢复了我的工作副本中的这些更改。这就是我希望分支成为的样子。我提交了这些更改。此提交在“包含合并的修订”下列出了撤消补丁;我不认为它应该这样做;这里似乎有问题。关键可能是记录这个补丁(平方反比,或原始修改的产物),使颠覆不知道创建它所执行的操作。

然后,我通过相同的方法(合并一系列修订)将主干中的所有更改合并到新分支中。这包括第二次原始撤消补丁,使我的分支与主干相同(现在将其列为三次作为包含的合并修订版)。这不是预期的结果。

<编辑 - 解决方案>

以下是所需的行为,并且可以正常工作:

首先,我创建了一个带有文件夹标签、主干、分支的空存储库。在主干中,我创建了一个文件 file.txt,其内容为(rev1):

one
two
three

然后将文件编辑为

one
two_edit
three

并签入(rev2)。然后我在日志中选择了 rev2 并从这个版本中选择了 revert changes 并签入(rev3)。该文件现在再次看起来像这样:

one
two
three

然后我创建了一个从rev3到branches\b1 的主干分支(rev4,was5;这一步都做)。在 branch\b1 中,文件如下所示:

one
two
three

然后我将 rev2 从主干反向合并到分支/b1 中,忽略祖先(rev5)。分支现在看起来像这样,历史包含类似的内容现在纯属巧合:

one
two_edit
three

我将主干(rev6)编辑为如下所示:

one
two
three
four

我将主干中的所有更改合并到分支/b1(rev7)中。分支/b1 现在正确地看起来像:

one
two_edit
three
four

</编辑 - 解决方案>

<编辑>

它应该如何工作

以下是所需的行为,如果按如下方式执行斜体步骤,则可以正常工作:

首先,我创建了一个带有文件夹标签、主干、分支的空存储库。在主干中,我创建了一个文件 file.txt,其内容为(rev1):

one
two
three

然后将文件编辑为

one
two_edit
three

并签入(rev2)。然后我在日志中选择了 rev2 并从这个版本中选择了 revert changes 并签入(rev3)。该文件现在再次看起来像这样:

one
two
three

然后我创建了一个从 rev2 到branches\b1 (rev4) 的主干分支。在 branch\b1 中,文件如下所示:

one
two_edit
three

然后我将主干中的 rev3 合并到分支\b1(rev5)中,分支现在看起来像这样:

one
two
three

我编辑分支 3 (rev6),就好像我此时正在分支一样。现在纯粹是巧合,历史包含类似的东西:

one
two_edit
three

我将主干(rev7)编辑为如下所示:

one
two
three
four

我将主干中的所有更改合并到分支/b1(rev8)中。分支/b1 现在看起来像:

one
two_edit
three
four

它是如何工作的

以下是实际行为;如果执行斜体步骤,它将无法正常工作,由于追溯分支的复杂性,这是必要的。错误在最后一步的第二行。

首先,我创建了一个带有文件夹标签、主干、分支的空存储库。在主干中,我创建了一个文件 file.txt,其内容为(rev1):

one
two
three

然后将文件编辑为

one
two_edit
three

并签入(rev2)。然后我在日志中选择了 rev2 并从这个版本中选择了 revert changes 并签入(rev3)。该文件现在再次看起来像这样:

one
two
three

然后我创建了一个从 rev2 到branches\b1 (rev4) 的主干分支。在 branch\b1 中,文件如下所示:

one
two_edit
three

然后我将主干中的 rev3 合并到分支\b1(rev5)中,分支现在看起来像这样:

one
two
three

在branchs\b1 中,我在日志中选择了rev5,并从该版本中选择了revert changes 并签入(rev6)。该文件现在再次看起来像这样:

one
two_edit
three

我将主干(rev7)编辑为如下所示:

one
two
three
four

我将主干中的所有更改合并到分支/b1(rev8)中。分支/b1 现在看起来像:

one
two
three
four

</编辑>

4

3 回答 3

6

您描述的问题(以及您的解决方案)很常见。当然,立即在一个单独的分支中开始开发“不上线”更改会更明智,但我知道这不是一个完美的世界,我们生活的世界会发生变化;)。

幸运的是,使用 SVN 等优秀的版本控制系统,您可以随时随地进行任何更改。也有多种不同的方法可以做到这一点。因此,当您已经为自己回答了您的问题时,我自由地起草了我如何理解您的问题以及我将如何解决它。下面的图表也将用于内部目的,因此如果它不再对您有帮助,也不会造成任何伤害。

附带说明:我对乌龟不太熟悉,但我想它比 SVN 命令行更容易挑选樱桃(在你的情况下是反向樱桃挑选)。特别是如果您有许多分散的提交可供选择。我仍然更喜欢 CLI 进行合并操作,因为它通常会更清楚我现在在做什么;)

我希望你能无冲突地合并我的朋友;)

克里斯托夫

存储库时间表

于 2010-09-16T11:03:50.323 回答
1

在 TortoiseSVN 分支对话框中选择“存储库中的特定修订版”,使用...按钮选择您希望在新分支中拥有的最后一个修订版。

分支时照常进行。

<编辑>

我试图重现您的问题,很难跟踪主干中的内容和分支中的内容,但这就是我所做的。

tags首先,我创建了一个带有文件夹、trunk、的空存储库branch。在trunk我创建了一个file.txt包含内容(rev1)的文件:

one
two
three

然后我将文件编辑为

one
two_edit
three

并签入(rev2)。然后我在日志中选择了rev2并选择revert changes from this revision并签入(rev3)。该文件现在再次看起来像这样:

one
two
three

然后我创建了一个trunkrev2branches\b1(rev4) 的分支。在branches\b1文件中看起来像这样:

one
two_edit
three

然后我像这样编辑文件trunk并签入(rev5)

one
two
three
four

然后我从合并trunkbranches\b1只选择rev5并提交(rev6)。现在branches\b1\file.txt看起来像这样

one
two_edit
three
four

一切都按我的预期合并。

在这个过程中,你在哪里“出错”了?

</编辑>

于 2010-09-04T07:15:34.623 回答
1

关键可能是记录这个补丁(平方反比,或原始修改的产物),使颠覆不知道创建它所执行的操作。

我认为您正在谈论试图阻止合并跟踪(又名 mergeinfo)被记录在分支中。我认为你可以使用svn diffor来做到这一点svn merge --ignore-ancestry。阅读有关高级合并的 SVN 红皮书,特别是在没有 Mergeinfo和注意或忽略祖先的情况下进行合并。

svn diff与其从 rev2 分支,不如从 rev3 创建一个主干分支,然后使用或在 rev3 的分支中应用/捕获从 rev1 到 rev2 的更改,这可能更容易svn merge --ignore-ancestry

或者,您可以考虑svn merge --record-only伪造合并以阻止将来合并的修订,即说服分支或主干您已经合并了撤消更改,因此不会再次应用它。

于 2010-09-16T00:35:48.543 回答