我熟悉源控制的SVN和TFS。我经常遇到的一个问题是针对不同的bug修改了相同的文件(比如bugP用修订版/变更集(N)修复,bugQ用修订版(N + 1)修复,bugR在修订版/变更集中修复(N + 2) )
每个修订/变更集都在同一个文件的不同部分上工作,并且没有重叠。
利益相关者决定在下一次构建中包含bugR的修复程序非常重要,但不包括bugP和bugQ修复程序。
我知道这可能是一种非常常见的情况。如果所有修复都在同一个分支/主干中完成,是否有一种简单的方法可以只提取那些修复特定错误的修订?
还有其他源控制系统,如GIT / Mercurial(Hg-是我理解的标准方式)来处理这类问题吗?
答案 0 :(得分:1)
Git能够选择要集成到树中的单个提交。假设错误修复是单独的提交,您可以选择要应用于当前树的错误。该命令使用它cherry-pick
。
我认为这就是你要找的东西?
我没有使用过Mercurial,但this answer讨论了这个问题。
答案 1 :(得分:1)
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为你完成所有的工作。
答案 2 :(得分:0)
TFS允许选择性合并(仅合并某些变更集和/或仅合并变更集中的某些文件)。合并时,只需在合并向导的第一页上选择“选定的更改集”,然后选择要包含的更改集。要仅合并某些文件,您可以右键单击要合并的文件并选择合并,也可以合并更高级别,然后撤消您不想合并的文件的签出(这些文件随后可用你要合并的时间。)
答案 3 :(得分:0)
你也可以在SVN挑选。对于您描述的场景,
用修订版/变更集(N)修复bugP,用修订版(N + 1)修复bugQ,在修订版/变更集(N + 2)修复bugR ...我们在下一版本中包含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。
答案 4 :(得分:0)
使用SVN,您将基于某些版本的主干创建一个发布分支,并有选择地合并您需要的更改(使用cherry picking merge)。这也记录了(客户特定的)版本包含哪些修复。