目前我在 Windows 上使用带有 Visual Studio 的 Git,我喜欢它。不过,我是在不久前开始在 Linux 上学习 Git 的。最初,我正在为我当时工作的一个项目运行 git-svn。尽管 git-svn 不允许利用所有 Git 功能,但它足以让我找到使用 Git 的方式并说服自己 Git 对我们的开发有用。只有在那之后,我们才决定将该存储库从 SVN 转换为 Git。
我认为 Git 的主要优势在于它足够灵活,可以适应不同的工作流程。因此,您可以选择最适合您的开发团队的内容。集中式与分布式不是两个特定工作流程之间的选择,而是更多可能的工作流程之间的选择。如果您决定继续使用类似于 SVN 的集中式工作流程,那么使用 Git 仍然有一些优势。
首先,在与上游合并之前提交更改。SVN 会在您有机会提交工作之前强制您执行“svn update”。这意味着如果您在此合并过程中犯了错误,您可能会丢失您的工作。在 SVN 中,您不能丢弃当前的合并状态并再次重做。此外,除非此人可以直接访问您计算机上的工作树,否则您不能要求更有经验的人帮助进行重要的合并。
一般来说,提交和合并使您的历史记录更加真实,因为它显示了您进行更改的实际状态以及您如何解决冲突。缺点是历史不再是线性的。使用 Git,您可以通过执行“git pull --rebase”(可以配置为默认设置)来保留线性历史记录,这使您的历史记录像使用 SVN 一样是线性的。
SVN 的第二个问题是,当您将更改提交到中央存储库时,您永远不知道其他人是否同时进行了更改。如果这些更改是针对不同的文件进行的,SVN 将接受您的 ChangeSet。结果,您在 SVN 存储库中有一个没有人测试过的新状态。通常,对不同文件所做的更改不会导致问题,但有时会。例如,一位开发人员更改了 C 标头中的某些函数以及所有使用该函数的位置,但另一位开发人员在新代码中添加了该函数的新用法。因此,即使每个开发人员都测试了他或她的更改,您最终也会在主开发分支上出现损坏的状态。在有人说“svn update”之前,开发人员可能不会立即注意到这种破坏,但此时此人可能有他/她自己的更改,
另一个有用的 Git 特性是它允许你在不提交任何东西到主干的情况下尝试一些想法。然后,如果它不起作用,你可以丢弃它,没有人会注意到。不是我喜欢向别人隐瞒一些东西,而是我不想强迫其他人将他们的工作与我的实验性东西合并,这些东西最终可能会被删除。此外,删除此实验代码会成为问题,因为它与其他更改交织在一起。因此,如果您使用 SVN,您唯一的选择就是在使用此功能时不提交任何内容。然而,它最终导致了一个巨大的补丁炸弹,而不是小的逻辑步骤,即在出现问题时要么进行审查和平分。
顺便说一句, git-bisect 对于对抗代码中棘手的回归非常有用。如果有东西坏了,可能不清楚是什么以及为什么。所以你需要找到引入这个问题的提交,而 git-bisect 是完成这项工作的最佳工具。
最后,您有更多选择来决定如何更好地处理某些情况。例如,您的核心团队成员可以将他们的更改直接推送到“主干”(在 Git 中通常称为“主控”),但您可能不希望新分配的人在没有任何审查的情况下推送他的更改。因此,只需告诉他将他的更改推送到同一中央存储库中的单独分支上,然后给他的导师发送电子邮件,如果这些更改是好的,他将审查并合并这些更改。Git 中的分支真的很便宜,你不应该害怕使用它们。当一个短暂的主题分支被合并到上游时,它的名字通常会被删除,所以它不会使分支命名空间混乱。