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

时间:2020-03-06 14:52:49  来源:igfitidea点击:

我通常使用Tortoise SVN,但是我一直在研究Mercurial,因为它是一个分布式修订控制系统。

在这两个系统中,我正在寻找的工具是让我仅选择文件的一部分并提交的工具。如果现在要执行此操作,则必须复制到文件的临时版本,并仅将要提交的更改保留在当前版本中,然后在提交后再次将临时版本复制到当前版本。太麻烦了,程序应该可以为我做到这一点。

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

解决方案

Mercurial可以通过记录扩展名做到这一点。

它将提示我们输入每个文件和每个差异块。例如:

% 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队列)将存储库中的各个更改分成补丁会更容易。记录(qrecord)也有一个MQ变体。

更新:还可以尝试使用crecord扩展名,它为粗线/行选择提供了curses界面。

我建议不要这样工作。

如果必须进行更改,请设置可以检入的A以及尚未准备就绪的B,如何确保仅检入A不会破坏构建/测试?我们可能会错过一些行,忘记其他文件中的行,或者没有意识到A对B的依赖会破坏B的构建。

提交应该是谨慎的原子更改,并且不会破坏我们或者团队中其他人的构建。如果我们要部分提交文件,则将大大增加我们在不知情的情况下为他人破坏构建的机会,直到我们遇到一些不高兴的同事敲门。

最大的问题是,为什么我们觉得需要以这种方式工作?

不久前,我问了一个类似的问题,使用hgshelve扩展程序得到的答案正是我想要的。

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

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

是的,git允许我们执行此操作。 git add命令具有-p(或者--patch)选项,可让我们逐块查看更改,选择暂存(还可以优化块或者编辑补丁)到位)。我们也可以使用交互模式进行git-add(git add -i)并使用" p"选项。

这是交互式添加的截屏视频,还演示了git add的补丁功能。

签出TortoiseHG,它将进行大块选择,并使我们可以对一个文件进行不同的更改,以进行不同的提交。

它甚至可以让我们一次提交对某些文件的所有更改以及对其他文件的部分更改。

http://tortoisehg.bitbucket.io/