我通常使用Tortoise SVN,但我一直在研究Mercurial,因为它是一个分布式版本控制系统。
我在两个系统中寻找的是一个工具,让我只选择文件的一部分并提交它们。如果我现在要这样做,我必须复制到该文件的临时版本并仅保留我想在当前版本中提交的更改,然后在提交后再次将临时版本复制到当前版本。这只是一个麻烦,程序应该能够为我做到这一点。
我听说Git支持这个,如果这是正确的,请告诉我。
答案 0 :(得分:40)
Mercurial可以使用record扩展程序执行此操作。
它会提示您输入每个文件和每个差异。例如:
% 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)。
更新:还可以尝试crecord扩展程序,该扩展程序为hunk / line选择提供了curses接口。
答案 1 :(得分:12)
是的,git允许你这样做。 git add
命令有一个-p
(或--patch
)选项,允许您逐个查看您的更改,选择要进行的更改(您还可以优化这些更改或编辑)补丁到位了)。您还可以使用交互模式进行git-add(git add -i
)并使用“p”选项。
这是一个screencast on interactive adding,它还演示了git add
的补丁功能。
答案 2 :(得分:8)
查看TortoiseHG,它将进行大块选择,并允许您对不同的提交对一个文件进行不同的更改。
它甚至允许您对一些文件提交所有更改,并在一次提交中对其他文件进行部分更改。
答案 3 :(得分:5)
我刚才问了similar question,使用hgshelve extension得到的答案正是我所寻找的。 p>
在您提交之前,您可以将来自不同文件(或文件中的更改)的更改放在“架子”上,然后提交您想要的内容。然后,您可以取消搁置您未提交的更改并继续工作。
过去几天我一直在使用它并喜欢它。非常容易想象和使用。
答案 4 :(得分:2)
Mercurial现在为--interactive
命令提供了一个选项-i
(或commit
),它可以立即启用此功能。
这可直接在命令行中运行,因此如果您是命令行发烧友,它是完美的!
运行
> hg commit -i
开始一个交互式会话,允许检查,编辑和记录各个更改以创建提交。
此行为与--patch
和--interactive
命令的git add
和git commit
选项非常相似。
答案 5 :(得分:0)
我建议不要这样工作。
如果您需要进行一组更改,请设置A已准备好进行检查并设置尚未准备好的B,您如何确定只检查A组不会破坏您的构建/测试?你可能会错过一些行,忘记不同文件中的行,或者没有意识到A对B的依赖性会破坏其他人的构建。
您的提交应该是谨慎的原子更改,不会破坏您团队中或其他的构建。如果你正在部分提交一个文件,你就会大大增加你为其他人打破构建的机会而不知道它,直到你有一些不快乐的同事敲门。
最大的问题是,为什么你觉得有必要以这种方式工作?