为什么DVCS似乎都具有未落实变更的不合理恐惧症?


10

来自SVN背景,使用DVCS系统时要适应的最困难的事情之一就是,它们似乎都将任何未提交的更改视为滴答定时炸弹。

在Mercurial中,如果您尝试获取更改,并且您的工作副本中有任何未提交的更改,则必须跳过所有步骤以使其仅合并传入的更改。尝试切换分支吗?这将迫使您搁置所有内容,然后必须立即在另一端立即搁置所有内容。(SVN在这两种情况下都没有问题。)

Git大致相同。我正在与另一个项目的开发人员并肩工作,而我只是试图将他的提交之一挑进我的叉子中。它拒绝让我,因为我的工作副本中的更改尚未提交,与他提交中的更改完全不同的文件。 甚至没有合并选项。显然,我必须先隐藏我的更改!

如果一个人以这种极端的谨慎对待完全无害的东西,我会称其为“恐惧症”,这是一种非理性的恐惧,应视为精神障碍。但是Git和Mercurial是由两个不同的聪明,理性的开发人员团队设计的,所以我不得不怀疑他们是否知道我所不知道的东西。

是否有技术上的理由证明这种对待未承诺变更的态度是正确的?如果是这样,为什么问题仅在DVCS上存在?


7
您可以琐碎地检查这些东西的全部内容吗?然后,与其他开发人员合并将成为实际的合并,而不是尝试解析三个源(您的版本,您的更改及其版本)。我不是这方面的专家,所以可能不合常理。
Telastyn

3
我同意Telastyn。我认为您遇到看似不合理的限制的原因是因为您没有以惯用的方式使用Git。Git的主要优势之一是您可以在本地进行承诺。如果我必须将其他人的代码合并到我的工作副本中,那么我肯定会首先在本地提交。本地提交很便宜,易于清理,并且安全网惊人。我并不感到惊讶,Git工作流围绕它工作(因此,警告和限制假定您宁愿提交而不是对未提交的文件进行操作)。
MetaFight 2015年

3
@Telastyn:不,您不能,因为签入-甚至到您的本地分支-都需要提交原因并在历史记录中创建记录。因此,如果您签入尚未准备好提交的内容,最终当您准备将更改推送到远程存储库时,该历史记录将存在,除非您执行其他操作来重写历史记录。这与我认识到的“琐碎的”定义都不相符,在我看来,这似乎是很多额外的复杂性,没有任何明显的好处。
梅森惠勒

真?“稳定的XYZ从主要合并”是一些负担,还是过分客气的历史?
Telastyn

1
您是否会提交论文以供发表,而至少为了清晰起见不作编辑?然后,不要提交您的初稿提交系列以进行发布。请会阅读您的代码的每个人都大受帮助:回去并生成您想写的提交系列,如果您有远见的话会首先这样做。互动式改基并不难..
jthill

Answers:


4
  1. 在DVCS世界中,提交是廉价的,历史是可变的。WIP可以根据需要设置为“脏”:而且我看不出有任何理由反对“将我的当前状态放入更改集中进行存储”
  2. SVN历史是线性的,因此-您必须将草稿与新修订中的更改合并。DVCS(自然地)使用DAG,并且额外的头部(commit + pull + up)用于分散历史记录,比在运行中修改工作目录与获取外部更改合并更安全。
  3. 当您在Subversion中切换(到某个节点)修改的WC时,您摆脱了一个潜在的附加合并(与“ commit to old”-“ switch”-“ merge 1 rev。range”相反)...并且我们知道:merges SVN中的工具并不是完美的工具,而DVCS则根本不是问题

恢复

这不是恐惧症,是(有时很苛刻)强制遵循“经常提交”的良好举止(SVN用户有时会害怕这种风格)

而且,最后hg qnew|qpop|qpush是为了整洁和秩序的小公道价格


1

当您合并或选择时git,您将立即创建一个提交。直到该提交完成并成为历史的一部分,该操作才完成。

现在,如果git允许您掩盖工作目录中未提交的更改会怎样?您将(或多或少)难以区分要为合并/樱桃选择而需要处理的更改/合并冲突,以及您自己介绍的更改。而且,您几乎不可能测试您实际提交的内容。

因此,在合并情况下强制使用干净的工作目录有助于使事情简单且易于管理。毕竟,您所需要做的就是在合并之前存储未提交的更改,然后在存储之后存储它们。注意,在工作流程中

git stash
git pull
git stash pop

您有两个(!)合并操作。一种将您的最后一次提交与传入的更改合并,另一种将您未提交的更改与结果合并提交合并。这样,您只需要将两件事合并为一,就可以避免由于试图在一次操作中将三件事合并为一而忽略这三件事而造成的混乱。该git stash/ git stash pop很容易和明确的,你是忽略你的合并提交的更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.