代码之家  ›  专栏  ›  技术社区  ›  ram

SourceControl-仅拉入特定修订

  •  3
  • ram  · 技术社区  · 15 年前

    我熟悉SVN和TFS的源代码管理。我经常遇到的一个问题是,同一个文件针对不同的bug进行了修改(例如,bugp是用revision/changeset(n)修复的,bugq是用revision(n+1)修复的,bugr是用revision/changeset(n+2)修复的)。

    每个修订/变更集在同一文件的不同部分工作,并且没有重叠。

    利益相关者认为,我们在下一个构建中包含bugr修复程序,但不包括bugp和bugq修复程序,这一点很重要。

    我知道这可能是一个非常常见的场景。如果所有的修复都是在同一个分支/主干中完成的,那么是否有一种简单的方法可以只提取那些修复特定bug的修订?

    其他的源代码控制系统,比如git/mercurial(hg——我理解,这是标准的说法)是否也能解决这些问题?

    5 回复  |  直到 15 年前
        1
  •  0
  •   Chris Shaffer    15 年前

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

        2
  •  1
  •   Community CDub    8 年前

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

    我想这就是你要找的?

    我没用过mercurial,但是 this answer 讨论这个问题。

        3
  •  1
  •   Alex Brown    15 年前

    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为您完成所有工作。

        4
  •  0
  •   Michael Hackner    15 年前

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

    bugp用revision/changeset(n)修复,bugq用revision(n+1)修复,bugr用revision/changeset(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
  •  0
  •   Sander Rijken    15 年前

    使用SVN,您将基于主干的某些修订创建一个发布分支,并有选择地合并您需要的更改(使用cherry-picking合并)。这还记录了什么(特定于客户的)版本包含哪些修复。