在向使用 TFS 的同事介绍 DVCS 概念时,我遇到了以下问题:
“这些‘离线提交’与 TFS 搁置有何不同?我可以使用它来备份我的更改、回滚到特定更改并将我当前的更改与搁置的变更集进行比较。”
我得到的唯一答案是 TFS 搁置要求您连接到 DVCS 不需要的中央服务器。
你会怎么回答?DVCS 的“本地提交”方法相对于 TFS 货架有什么明显优势?
主要区别在于 DVCS 离线提交更加灵活。它们允许您准备一系列变更集,然后您可以一次性将其作为一个组发布。您还可以对它们进行一些巧妙的操作,例如重新排序、组合、拆分它们,甚至完全删除其中的一些。另一方面,使用 TFS 搁置集,您一次只能使用一个变更集在本地工作。
假设您进行了十次单独的更改,编号为 1 到 10。在 DVCS 中,您只需在每次更改后签入,然后在完成后通过单个操作推送到原点。使用 TFS,您最终会得到十个搁置集,每个搁置集都包含您的工作与存储库中最新版本之间的差异。它们看起来像这样:
等等。
这意味着您不能只使用单个命令(如 中)发布一系列变更集git push origin master
,您必须一次取消搁置它们,然后将它们全部单独签入。仅此一项就够麻烦了,但最重要的是,第二个和后续的变更集都会给您带来合并冲突,因为您正在重新应用已经应用的早期变更。
此外,您控制发布哪些更改的选项受到严重限制。如果您只想签入更改 1、2、4、6-8 和 10,而忽略更改 3、5 和 9,则无法执行此操作。您也无法重新排序它们,也无法压缩不连续的更改范围。
这样做的结果是,在 TFS 中,即使有搁置,坚持每小时几次在本地签入的最佳做法是不切实际的,确保每次签入只进行一次更改,然后在你之前整理发布您的更改。结果将是一个由更大、更臃肿的签入组成的历史记录,这些签入更难理解,也不太有用,例如,如果您需要追踪引入错误的修订版。
从未使用过 TFS,但我相信我明白了要点。
不同之处在于您可以在本地进行等效操作,例如在飞机上。为未完成的工作设置分支,使用标签标记您以后可能想要参考的开发中的任何点。可以混合和匹配,将当前提示与另一个分支、该分支上的前一个标签、另一个分支上的标签、任何两个标签,甚至是你想以某种方式选择的随机提交进行比较。无需提前计划在开发线上什么是有用的“标记”。对于历史的直观视图gitk
是一个很大的帮助。一个很好的优势是没有人需要了解你的笨手笨脚和愚蠢的实验,所有这些都是你想要的隐私。您当然可以设置远程存储库用于备份目的(不多于git
和ssh
为此需要在远程端,并且需要git push
有一些规律性的纪律),并且只将您希望其他人看到的内容发送到官方的公共存储库。