【问题标题】:sourcecontrol - pulling in only specific revisionssourcecontrol - 只引入特定的修订
【发布时间】:2010-01-11 17:07:24
【问题描述】:

我熟悉用于源代码控制的 SVN 和 TFS。我经常遇到的一个问题是针对不同的错误修改了同一个文件(比如 bugP 用修订版/变更集(N)修复,bugQ 用修订版(N+1)固定,bugR 固定在修订版/变更集(N+2) )

每个修订/变更集都适用于同一文件的不同部分,并且没有重叠。

利益相关者认为我们在下一个版本中包含 bugR 修复但排除 bugP 和 bugQ 修复非常重要。

我了解这可能是一种非常常见的情况。如果所有修复都在同一个分支/主干中完成,是否有一种简单的方法可以只提取那些修复特定错误的修订?

其他源代码控制系统,如 GIT/Mercurial(我理解,Hg- 是标准的说法)来处理这类问题吗?

【问题讨论】:

  • 您是否正在研究切换源代码控制系统,或者您是否试图回答如何在某个系统中执行此操作的问题?您需要什么系统的解决方案?
  • 1.Nope:我现在不打算切换版本控制。我正在使用 TFS,并且之前也遇到过与 SVN 相同的问题。 2. 将来,如果我要选择源代码控制,这里的答案将帮助我决定选择哪一个

标签: svn git version-control tfs mercurial


【解决方案1】:

Git 能够挑选出您想要集成到树中的单个提交。假设错误修复是单独的提交,您可以选择要应用到当前树的那些。该命令使用它cherry-pick

我想这就是你要找的东西?

我没有使用 Mercurial,但 this answer 讨论了这个问题。

【讨论】:

    【解决方案2】:

    Git 还有一个非常有用的命令rebase -i,它允许您选择要保留或从列表中删除的提交。在您的示例中,您应该检查组合的更改集,然后使用

    git rebase -i OLDEST_COMMIT_IN_THE_SET^
    

    然后在以下列表中:

    pick 03315fa fix for feature A
    pick 2935567 fix for feature B
    pick 4d31103 more fixes for feature A
    pick 875ca6d fix for feature C
    pick f0289e6 undo some broken fixes for feature A
    pick 1f84de2 more fixes for feature B
    
    # Rebase 5c50390..1f84de2 onto 5c50390
    #
    # Commands:
    #  p, pick = use commit
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    # However, if you remove everything, the rebase will be aborted.
    #
    

    只需删除与您不想要的提交相对应的行 - 即所有不包含短语 feature A 的行。然后保存文件,退出编辑器,让 git 为你完成所有工作。

    【讨论】:

    【解决方案3】:

    TFS 确实允许选择性合并(仅合并某些变更集和/或仅合并变更集中的某些文件)。合并时,只需在合并向导的第一页上选择“选定的变更集”,然后选择要包含的变更集。要仅合并某些文件,您可以右键单击要合并的文件并选择合并,或者您可以合并更高级别,然后撤消您不想合并的文件的签出(这些文件接下来将可用你想合并的时间)。

    【讨论】:

      【解决方案4】:

      您也可以在 SVN 中进行挑选。对于您描述的场景,

      bugP 用修订版/变更集 (N) 修复,bugQ 用修订版(N+1) 固定,bugR 固定在修订版/变更集(N+2) 中……我们在下一个版本中包含对 bugR 的修复,但排除bugP 和 bugQ 修复。

      在 SVN 中你会做类似的事情

      svn copy svn://path/to/trunk svn://path/to/branch -r N+2 -m "Made a branch"
      svn checkout svn://path/to/branch
      # do a reverse merge (note negative revision numbers)
      svn merge -c -N+1,-N svn://path/to/trunk
      

      这将为您提供一个包含 bugR 修复但不包含 bugP 或 bugQ 的工作副本。

      【讨论】:

        【解决方案5】:

        使用 SVN,您可以根据主干的某些修订创建发布分支,并有选择地合并您需要的更改(使用樱桃采摘合并)。这还记录了(客户特定的)版本包含哪些修复。

        【讨论】:

          猜你喜欢
          • 2011-11-24
          • 2015-11-24
          • 2010-09-12
          • 1970-01-01
          • 2019-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-20
          相关资源
          最近更新 更多