什么版本控制系统允许我同时将更改添加到多个待定提交中?

3

我的工作流程通常涉及对文件进行多次更改,每次更改都属于项目中自己的概念单元(=提交)。

我想要做的是将某些差异(整个文件或仅文件的某些行)添加到挂起的提交中(可能必须命名该提交),并且可以同时存在多个待提交的提交。

然后,当所有相关的待提交更改在所有文件中都完成时,我就可以提交命名的提交!

有什么版本控制系统适合这种情况吗?

6个回答

6
在svn中,您可以定义变更列表,然后仅提交特定变更列表中的文件。
Git更进一步,允许您通过交互式选择文件中已更改的块来记录补丁,使用git add -p
尽管这些功能很受欢迎,但与最佳实践相反。您无法以这种方式正确测试更改。在您的工作副本中可能一切正常,但仅提交部分更改可能会破坏构建。使用特性分支更安全,并且任何现代版本控制系统都支持此功能。

还有Mercurial ShelveExtensiongit-stash,它们允许您以补丁块的粒度挂起所选更改以供以后提交。这种工作方式确实可以让您在提交之前进行适当的测试。


1
这对我来说很好,'破坏构建'的概念并不适用。 但我希望svn changelists能够以子文件为基础进行操作。看起来要转向git了,除非e.g. mercurial或bazaar也提供此功能? - EoghanM
不,我认为Mercurial或Bazaar并不直接支持这一点。您需要改变工作流程才能获得相同的效果。 - Wim Coenen
1
当你像这样进行更改时,你肯定可以测试它们。你只需要在提交后测试它们。我有一个工具,可以确保范围内的每个单独提交都通过了所有测试,并在推送系列之前使用它。 - Dustin
2
Mercurial绝对支持这种工作流程,使用现在内置的mq(mercurial queues)扩展(https://developer.mozilla.org/en/Mercurial_Queues)。 - Ted Naleid
我并不真正理解mercurial队列,但在查看mercurial时,我偶然发现了ShelveExtension,它似乎是实现这种操作最简单的方法。我已经添加了一条关于它的注释。 - Wim Coenen
显示剩余3条评论

2

原始请求听起来很像“挑剔”:手动选择要包含在新提交中的“差异”片段。至少Git和Darcs支持这种功能。对于emacs + git,有gitsum,我非常喜欢。


谢谢 - 这正是我在寻找的工具类型。 - EoghanM

1
在bzr中,您可以使用shelve/unshelve命令来获取文件中的一些更改并将其放回,或者使用loom插件轻松管理一组相关补丁。但是,这两种方法都无法解决您的原始请求,并且我怀疑任何版本控制系统都不能以这种方式完成。

0

确保每个单独更改的提交都会产生可构建的系统非常困难。

我强烈建议一次只做一件事,并分别提交每个问题。


1
一个可构建系统的概念可能不会出现在这里,例如CSS文件可能有多个独立的修改,影响网站上的不同页面。或者是一个包含多个条目的更改日志文本文件,针对不同的更改内容。 - EoghanM

0

内容警告:基于仅有的一面之缘而得出的印象:

如果您需要微观管理同时进行但在某种程度上是不相关的更改,那么您可能需要调查darcs,与svn、git或mercurial等系统相比,它具有相反的重点。

在darcs中,补丁是关键要素,给定分支的状态实际上只是一组补丁的总和。这种模型可能适合您想要做的事情,但显然@wcoenen对最佳实践的警告仍然存在。对于每组补丁,您需要确保构建(无论它包含什么)没有损坏。

顺便问一下,你是我认为的Eoghan M...r吗?


不,我不是你想到的 EoghanM! - EoghanM

-1

Subversion客户端(>=1.5)包含一个Changelist概念:一组与所选名称相关联的文件

当在同一个工作副本中处理多个不同文件集时,这尤其有用。不必记住每个文件集中的每个文件,Subversion允许您将更改列表与每个文件集相关联。大多数以一组文件为目标的命令现在也接受--changelist选项,该选项基于更改列表的成员过滤这些目标。可以使用新的更改列表子命令编辑更改列表成员资格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接