Version control DVCS和数据丢失?

Version control DVCS和数据丢失?,version-control,dvcs,Version Control,Dvcs,在使用DVCS近两年后,一个固有的“缺陷”似乎是意外的数据丢失:我丢失了未被推送的代码,我知道其他人也丢失了 我可以看到这样做的一些原因:非现场数据复制(即,“提交必须到远程主机”)不是内置的,存储库与代码位于同一目录中,并且“黑客”的概念很流行,直到你有东西要发布为止。。。但这不是重点 我很想知道:您是否经历过与DVCS相关的数据丢失?或者你一直在使用DVCS没有问题?另外,除了“记住经常推送”之外,还有什么可以做的来降低风险吗?我丢失了DVCS中的数据,这是因为将树与存储库一起删除(不记得它

在使用DVCS近两年后,一个固有的“缺陷”似乎是意外的数据丢失:我丢失了未被推送的代码,我知道其他人也丢失了

我可以看到这样做的一些原因:非现场数据复制(即,“提交必须到远程主机”)不是内置的,存储库与代码位于同一目录中,并且“黑客”的概念很流行,直到你有东西要发布为止。。。但这不是重点


我很想知道:您是否经历过与DVCS相关的数据丢失?或者你一直在使用DVCS没有问题?另外,除了“记住经常推送”之外,还有什么可以做的来降低风险吗?

我丢失了DVCS中的数据,这是因为将树与存储库一起删除(不记得它有重要信息),以及因为使用DVCS命令行(在特定情况下是git)时出错:某些旨在还原我所做更改的操作实际上从存储库中删除了许多已提交的修订。

我在集中式VCS中删除了未提交的更改,然后决定我确实需要这些更改,这比我使用DVCS所做的任何操作所丢失的数据都要多。部分原因是我已经使用CVS将近十年了,使用git不到一年了,所以我有更多的机会遇到集中式模型的麻烦,但是两个模型之间工作流属性的差异也是主要的促成因素

有趣的是,大多数这样做的原因归结为“因为数据更容易丢弃,所以我更可能保留它,直到我确定我不想要它”。(丢弃数据和丢失数据之间的唯一区别在于您打算丢弃数据。)最大的影响因素可能是我的工作流程习惯的一个怪癖——当我使用DVCS时,我的“工作副本”通常是分布在多台计算机上的多个不同副本,因此,在一次回购中发生的损坏或丢失,甚至是我一直在使用的计算机上发生的灾难性数据丢失,都不太可能破坏数据的唯一副本。(能够做到这一点是分布式模型相对于集中式模型的一大胜利——当每次提交都成为存储库的永久部分时,复制临时更改的心理障碍要高得多。)

就最小化风险而言,可以养成最小化风险的习惯,但你必须养成这些习惯。这里有两个一般原则:

  • 数据只有在存在时才存在 以不同的格式复制多份 地方。有一些工作流习惯 那会给你多份 免费-f'rexample,如果你工作的话 在两个不同的地方,你会 推到公共位置的原因 在每次工作会议结束时, 即使它还没有准备好发布
  • 不要做任何聪明的事, 愚蠢,还是超出你的舒适区 只引用一个提交 你可能想留下来。创建一个 可以还原到的临时标记, 或者创建一个临时分支来执行 在上的操作。(git的reflog let 您可以在更新后恢复旧引用 事实上,如果其他人 DVCSs具有类似的功能。 因此,手动标记可能不适用 这是必要的,但往往更多 无论如何都很方便。)

在分发和确保所有内容都“保存”之间存在着固有的紧张关系(基本假设是保存意味着在其他地方备份)


在我看来,这只是一个真正的问题,如果您在同一条工作线上同时在多台计算机上工作(或者更确切地说是在多个存储库上工作:例如,我经常需要在同一台计算机上的多个VM之间共享更改)。在这种情况下,“集中式”工作流是理想的:您可以设置一个临时服务器,并在某些给定分支上使用集中式工作流。我所知道的当前DVC(git/bzr/hg)都不支持这一点。不过,这是一个很好的特性。

Bazaar确实区分了“分支”和“签出”,后者是绑定到另一个目录中的存储库的工作副本。在这样的树上,每次提交都隐含着一次推送(就像集中式VCS一样)。这让你在多大程度上避免了海报的问题是另一回事,但你可以得到你所说的集中式工作流程。实际上,Mercurial,从1.3开始,它具有与共享扩展类似的功能:。实际上,使用git,您可以使用contrib提供的
git new workdir
。我不知道为什么ShareExtension或git new workdir会有帮助:为了能够在计算机之间共享,共享需要联网(通过vmware IMHO,即使在同一台机器上,网络也更加实用)