Git 我可以使用SVN或Mercurial只提交部分代码吗?

Git 我可以使用SVN或Mercurial只提交部分代码吗?,git,svn,version-control,mercurial,tortoisesvn,Git,Svn,Version Control,Mercurial,Tortoisesvn,我通常使用Ortoise SVN,但我一直在研究Mercurial,因为它是一个分布式版本控制系统 在这两个系统中,我所要寻找的是一个只允许我选择文件的一部分并提交它们的工具。如果我现在想这样做,我必须复制到文件的临时版本,并且只在当前版本中保留我想要提交的更改,然后在提交后再次将临时版本复制到当前版本。这真是一件麻烦事,程序应该能帮我做到这一点 我听说Git支持这一点,请告诉我这是否正确。Mercurial可以通过扩展实现这一点 它会提示您输入每个文件和每个diff hunk。例如: % hg

我通常使用Ortoise SVN,但我一直在研究Mercurial,因为它是一个分布式版本控制系统

在这两个系统中,我所要寻找的是一个只允许我选择文件的一部分并提交它们的工具。如果我现在想这样做,我必须复制到文件的临时版本,并且只在当前版本中保留我想要提交的更改,然后在提交后再次将临时版本复制到当前版本。这真是一件麻烦事,程序应该能帮我做到这一点


我听说Git支持这一点,请告诉我这是否正确。

Mercurial可以通过扩展实现这一点

它会提示您输入每个文件和每个diff hunk。例如:

% hg record
diff --git a/prelim.tex b/prelim.tex
2 hunks, 4 lines changed
examine changes to 'prelim.tex'? [Ynsfdaq?]  
@@ -12,7 +12,7 @@
 \setmonofont[Scale=0.88]{Consolas}
 % missing from xunicode.sty
 \DeclareUTFcomposite[\UTFencname]{x00ED}{\'}{\i}
-\else
+\else foo
 \usepackage[pdftex]{graphicx}
 \fi

record this change to 'prelim.tex'? [Ynsfdaq?]  
@@ -1281,3 +1281,5 @@
 %% Local variables:
 %% mode: latex
 %% End:
+
+foo
\ No newline at end of file
record this change to 'prelim.tex'? [Ynsfdaq?]  n
Waiting for Emacs...
提交后,剩余的差异将被留下:

% hg di
diff --git a/prelim.tex b/prelim.tex
--- a/prelim.tex
+++ b/prelim.tex
@@ -1281,3 +1281,5 @@
 %% Local variables:
 %% mode: latex
 %% End:
+
+foo
\ No newline at end of file
或者,您可能会发现使用MQ(Mercurial Queues)将存储库中的单个更改分离为补丁更容易。还有记录的MQ变体(qrecord)

更新:还可以尝试扩展,它为hunk/line选择提供了一个curses界面


我建议不要这样工作

如果您必须更改集合,集合A已准备好签入,集合B尚未准备好,您如何确保仅签入集合A不会破坏您的构建/测试?您可能会遗漏一些行,忘记其他文件中的行,或者没有意识到a对B的依赖性会破坏其他构建

您的提交应该是谨慎的原子更改,不会破坏您或您团队中其他人的构建。如果你正在部分提交一个文件,那么你将极大地增加你在不知情的情况下破坏他人构建的机会,直到有不愉快的同事敲你的门

最大的问题是,为什么你觉得有必要这样工作?

我刚才问过,结果是使用的答案正是我想要的

在执行提交之前,可以将来自不同文件(或文件中的大量更改)的更改放在“架子”上,然后提交所需的内容。然后,您可以取消搁置未提交的更改并继续工作


过去几天我一直在用它,而且非常喜欢它。非常容易可视化和使用。

是的,git允许您这样做。
git add
命令有一个
-p
(或
-patch
)选项,允许您逐个检查您的更改,选择要进行的阶段(您也可以细化大块或就地编辑补丁)。您还可以使用交互式模式添加git(
git add-i
),并使用“p”选项


下面是一个示例,它还演示了git add的补丁功能Check out TortoiseHG,它将进行大块选择,并允许您针对不同的提交对一个文件提交不同的更改

它甚至允许您在一次提交中提交对某些文件的所有更改以及对其他文件的部分更改


Mercurial现在为
commit
命令提供了一个选项
--interactive
(或
-i
),可直接启用此功能

这可以直接从命令行运行,因此如果您是命令行爱好者,这将是完美的选择

运行

> hg commit -i
开始交互式会话,该会话允许检查、编辑和记录单个更改以创建提交


这与git add和git commit命令的
--patch
--interactive
选项的行为非常相似。

通常是因为我在提交之前写了太多的代码。我可能会更改一个文件中的两个不同内容,并希望使用不同的注释提交它们。Git支持(使用Git stash--keep index)仅隔离您将要提交的更改,这使您可以轻松地在它们上运行单元测试或任何内容。根据VisionMap开发约定:“没有比一个危险的变化和一千个琐碎的变化相结合更糟糕的评论家的噩梦了。从这个意义上说,有意义的改变必须彻底清除任何模糊的垃圾“这对于Subversion来说是个问题,因为提交会影响到所有人,但对于Git和Mercurial这样的分布式系统来说,这根本不是问题。在实际分发更改之前,您可以将提交拆分并对每个提交进行测试。如果你真的是1337岁,你甚至可以在事后编辑历史记录来清理任何混乱,这样就没有人需要知道它们发生了。如前所述,在Subversion中,如果执行此操作的人员足够胜任,则仍然可以执行此操作。然而,集中式模式保证了颠覆式回购协议中不可避免地会出现问题,这并不总是一种选择。有时候很晚了,你放弃了一个改变,直到另一天,在意识到发生了什么之前,你被另一个特性/改变所吸引。我们是人。我们的风投应该处理我们笨拙的工作。这将发生,即使是错误的。因此,有必要具备这样的特征。遗憾的是没有一个GUI工具。用GitX做这件事太棒了。阿门。GitX是我使用Git的原因;但愿墨奇也能这样。(不幸的是,我的开源项目太多,无法修复它,尽管我为GitX和Murky都做了贡献:-)有一个GUI工具用于此:Tortoisehg支持hunk selection…现在使用了Tortoisehg,它缺乏还原GitX提供的hunk的能力,并且通常提供了一个不太有用的界面。能够轻松地从差异中删除非预期的(例如,仅空白)更改是非常必要的…不能编辑大块是一件好事。我不喜欢让我的开发人员提交他们实际上没有构建或测试过的代码的“特性”。当他们运行hg-record时,个别的大块头应该被视为不可变的;如果它们需要进一步编辑,那么是时候t了