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