Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn sourcecontrol-仅拉入特定修订_Svn_Git_Version Control_Tfs_Mercurial - Fatal编程技术网

Svn sourcecontrol-仅拉入特定修订

Svn sourcecontrol-仅拉入特定修订,svn,git,version-control,tfs,mercurial,Svn,Git,Version Control,Tfs,Mercurial,我熟悉SVN和TFS的源代码管理。我经常遇到的一个问题是,同一个文件因不同的错误而被修改(例如,bugP是用修订/变更集(N)修复的,bugQ是用修订(N+1)修复的,bugR是用修订/变更集(N+2)修复的) 每个修订/变更集工作在同一文件的不同部分,没有重叠 涉众认为,我们在下一个构建中包括bugR的修复,但不包括bugP和bugQ修复,这一点很重要 我知道这可能是一种非常常见的情况。如果所有的修复都在同一个分支/主干中完成,是否有一种简单的方法可以只提取那些修复特定bug的修订 还有其他的

我熟悉SVN和TFS的源代码管理。我经常遇到的一个问题是,同一个文件因不同的错误而被修改(例如,bugP是用修订/变更集(N)修复的,bugQ是用修订(N+1)修复的,bugR是用修订/变更集(N+2)修复的)

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

涉众认为,我们在下一个构建中包括bugR的修复,但不包括bugP和bugQ修复,这一点很重要

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


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

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

我猜这就是你要找的


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

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

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.
#

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

您也可以在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。

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

您是否正在研究切换源代码管理系统,或者您是否正在尝试回答如何在某个系统中执行此操作的问题?您需要哪个系统的解决方案?1.否:我现在不打算切换版本控制。我正在使用TFS,并且之前在SVN中也遇到了相同的问题。2.我将来,如果我要选择一个源代码管理,这里的答案将帮助我决定选择哪个Mercurial以Histedit扩展的形式具有此功能: