SVN 与 Git 的区别

  1. 合并对提交过程的保留

    • Git: 合并操作保留原有的提交过程(即保留了合并来源的作者、提交次数、分离提交的内容)。
    • SVN: 合并操作把来源多个提交合并成了一个合并提交,即在提交历史中Crash了自然的提交过程。

      保留原有的提交过程,可以无需繁琐追踪历史就方便实现以下目的:

      1. 跟踪修改过程。
      2. 自然的提交过程。这极大方便了代码细节演进过程的查看。
      3. 极大方便查出那行提交是什么时间、谁做出的。svn因为合并Crash了自然的提交过程,要追踪很痛苦。
  1. 修正提交

    • Git: 可以修正提交。

      使用功能分支工作流,在自己的分支可以方便修正提交而不会影响大家。

    • SVN: 一旦提交就到服务器上,实际使用中就是不能修改。

      SVN可以在服务器上修改,因为过程复杂需要权限实际上从不会这样做

      实际使用中会有误提交的情况(如提交了一个不该提交的日志文件),对于svn来说,就是让大家一遍又一遍看到这个垃圾文件。

      没有干净的提交,严重影响了Code Review,增加成本。

      另外对于想了解演进过程的同学,垃圾提交影响了了解效果。

  2. 廉价好用的本地分支

    • Git: 有本地分支
    • SVN: 无本地分支

      git可以方便创建本地分支,且瞬间就可以完成创建。由于分支可以是本地的,也就不存在svn目录权限的问题。

      可以从想要工作点闪电般创建本地分支,本地实验不确定的修改,创建分支如此之廉价,git推荐创建分支来隔离修改。

  3. 更强大智能的合并能力

    • Git: 重命名(无论文件还是目录)提交可以合并上文件重命名前的这些文件的提交。
    • SVN: 重命名(无论文件还是目录)提交后,你本地/或是分支上 有文件重命名前的这些文件的修改或提交,在做合并操作时,恭喜,你会碰上传说中难搞的树冲突!

      因为惧怕svn树冲突,在包名调整(重命名目录)或类名调整(重命名文件)前,我不得不先向一起开发的组员广播:

    1. 提交你的修改
    2. 暂停相关类的修改
    3. 我开始做调整
    4. 等我修改好后,你再开始修改

      因为这个过程烦琐,结果就是影响了大家去做这样重构操作的积极性,进而影响项目的代码质量改进

  4. 灵活、迅速

    • 打断开发

      在开发新功能过程中,突然需要你去修复一个Bug,使用Git,你可以直接 保存贮藏/提交当前改动到本地,然后切换到主分支去修复Bug,之后 弹出贮藏/切换回你原来的分支 继续开发。

    • 小步提交,互不干扰

      并行开发过程中各开发人员可以随时多次commit代码且互不影响,最后在merage到主分支,并且能记录所有成员的所有commint记录。SVN只能大量的一次性提交到中心库。

  5. 日志查看

    • Git: 本地包含了完整的日志,速度极快(并且无需网络)
    • SVN: 需要从服务拉取。
  6. Github-全球最大的开源社区

本文部分转载自 - SVN 和 Git 在日常使用中的明显差异