【问题标题】:how to merge only specific non - continuous changes from one branch to other如何仅合并从一个分支到另一个分支的特定非连续更改
【发布时间】:2014-07-17 13:52:21
【问题描述】:

如何将补丁从一个分支合并/应用到另一个分支。两个分支与另一个分支的合并历史几乎相同。例如: 分支 1 和分支 2 都从 BranchX ,Branch Y ,Branch Z (父分支)进行了几乎相同的代码合并。但是在合并的间隔内,Branch1 中也提交了大的增量代码更改。并且这个增量是在 Branch 的代码库上提交的X ,分支 Y 和分支 Z 。 (正如我在合并 delta 的 itnervals 中所说的那样) 现在我只想合并/应用从 Branch1 到 branch2 的增量更改。

在这种情况下,我认为自动合并不是一个好选择,因为它会重复更改 作为两个分支作为相同的父分支,但具有不同的合并历史。 请建议任何好的方法仅应用从分支 1 到分支 2 的增量更改(近 2000 个文件)。 应用补丁会是一个不错的选择吗?我认为自动合并可能会导致重复和不必要的冲突。 谢谢,

【问题讨论】:

    标签: svn merge


    【解决方案1】:

    如果您使用的是最新版本的 SVN(我认为是 1.7 或更高版本),那么合并跟踪应该足够聪明,可以避免合并已正确记录为合并的修订。

    由于您显然有数千个您想要的提交,而不仅仅是一两个,因此最简单的方法是尝试自动合并。如果合并导致问题,那么您并没有丢失任何东西;你可以随时恢复。

    在最坏的情况下,我敢打赌,任何冲突都可以使用 KDiff3 或 Meld 等优秀的 3 路 diff 工具轻松解决,因为大多数冲突更改已经应用到目标分支。

    请注意,如果完全自动合并存在困难,您可以尝试将合并拆分为更小更易于管理的块。首先合并前 100-200 个连续修订,然后合并接下来的 100-200,依此类推,直到合并所有修订。有了更多的小块,自动合并算法有时会更容易,任何手动解决冲突肯定会更容易。

    【讨论】:

    • 为迟到的回复道歉,Ben 如果我在自动合并命令中使用 --ignore ancestry 和 --ignore whitespace,您的输入。使用这些选项有什么害处吗?
    • 为什么要使用--ignore-ancestry?如果我理解正确,那么该选项的意义在于两个分支实际上不共享任何历史记录。如果他们真的分享历史,那可能只会让事情变得更复杂。 --ignore-whitespace 可能不会对合并难度产生太大影响,除非它使合并更容易。无论哪种方式,将合并分解成更小的块应该更容易。
    【解决方案2】:

    听起来,在分支 1 上的许多提交中,您只想合并一个或两个提交的更改。为此,请通过准确指定要合并的修订版来使用“樱桃挑选”合并。例如,

    svn merge -c 1234,4567 http://example.com/svn/branches/branch1
    

    详情请参阅http://svnbook.red-bean.com/en/1.7/svn.ref.svn.html#svn.ref.svn.sw.changehttp://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.merge.html

    【讨论】:

    • 是的,我知道这一点......但是大约有非连续的 1000 rev#。而且它不可能使用樱桃采摘。这里的任何其他解决方法将不胜感激!
    • 如果我再次从分支 1 合并到分支 2 会不会很好。它包含大约 60 % 的代码在两边相同。这种重复会产生任何问题。
    • TortoiseSVN,至少在 1.8 版本中,具有可以隐藏已经合并的修订的功能。我仍然不是 100% 清楚此功能何时可用,但也许它会帮助您在选择修订版时快速选择所需的所有修订版。但我误解了你的问题,可能会先尝试自动合并。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2015-06-29
    • 1970-01-01
    • 2011-09-16
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多