一、SVN 和 Git
SVN 和 Git 都是优秀的版本控制工具,但是两者有较大的差别。
SVN
-
优点:最突出的特点是集中式管理,代码统一提交到指定的服务器,同时服务器会对文件权限做访问控制。
-
缺点:对服务器的性能、稳定性要求较高,服务器相当于枢纽,如果宕机会造成较大的影响。SVN 的分支管理不灵活,每一个分支都是一个完整的目录,操作分支需要与服务器同步,不能本地化操作,带来的问题是,团队的成员需要被动进行同步。
Git
-
优点:最突出的特点是分布式管理,在本地可以进行完整的版本控制。git 分支的本质是一个指向提交快照的指针,速度快、灵活,分支之间可以任意切换,可以在本地进行操作可以不同步到远程。
-
缺点:Git 的文件没有严格的权限控制,工作的目录只能是完整的文件目录,而 SVN 可以单独 checkout 某一个有权限的目录。
总结
SVN 一般用于商业的团队项目开发。Git 配套 GitHub,用于开源项目。
二、SVN 的使用
SVN 的使用比较简单,网上可以找到很多博客,在这里主要说一下多人合作带来的代码冲突问题、分支合并问题该如何解决。
三、代码冲突问题的解决
代码冲突是指:A 和 B 同时修改了某一个类的代码,修改完后,我们假设 A 先提交了代码,此时,B 的代码将发生代码冲突无法上传,因为对于发生冲突的地方服务器无法决定使用谁提交的代码。如果 B 想继续上传代码到服务器,将不得不解决代码冲突的问题。
基于以上前提,代码冲突的解决有 4 种情况:
-
① 以 B 的代码为准,把服务器的代码覆盖掉。
-
② 以服务器的代码为准,把 B 本地的代码覆盖掉。
-
③ 以 A、B 修改前的版本为准,把同时取消 A、B 的修改。
-
④ 由 B 比对发生冲突的代码行,兼顾 A、B 修改的代码。(最常用)
在发生代码冲突后,点击Windows -- Show View --Synchronize
,调出Synchronize视图
,然后右键项目根目录--Team--资源库同步
,此时在Synchronize视图
的冲突文件会变为 4 个,例如:Test.java Teat.java.mine Test.java.r2 Test.java.r3
。
第 ① 种情况解决方式
右键Test.java--标记已解决(Mark Resolved)--Resolve the conflict by using my version of the file.--OK
第 ② 种情况解决方式
右键Test.java--标记已解决(Mark Resolved)--Resolve the conflict by using the incoming of the file.--OK
第 ③ 种情况解决方式
右键Test.java--标记已解决(Mark Resolved)--Resolve the conflict by using base version of the file.--OK
第 ④ 种情况解决方式
右键Test.java--编辑冲突(Edit Conflicts)--编辑左边的Test.java--保存--右键Test.java--标记已解决(Mark Resolved)--Conflicts have been resolved in the file.--OK
四、分支合并问题的解决
正常情况下,一个项目会有 3 种不同类型的分支:trunk 分支、branches 分支、tags 分支。
trunk 分支:作为主分支,日常的开发在此进行。
branches 分支:存放阶段性的 release 版本,可以接着开发和维护。
tags 分支:存放已发布的版本,一般不会修改。
分支合并一般有以下几种 merge type(不同版本的 Ecplise 会有出入):
-
①Merge a range of revisions
翻译翻译:把 A 分支的代码合并到 B 分支
-
②Change-set based merge
翻译翻译:用于将修复程序反向移植到发布分支。需要安装插件。
-
③Merge two different trees
翻译翻译:用于合并两个不同的 URL,URL 可以来自同一个项目(tree),也可以来自不同的项目(tree)。
-
④Manually record merge information(block one or more revisions)
翻译翻译:手动指定某一分支不需要合并的文件,然后进行合并。
-
⑤Manually remove merge information(unblock one or more revisions)
翻译翻译:手动指定某一分支需要合并的文件,然后进行合并。
下面以:同一个项目的两个分支 trunk、branches,将 trunk 分支的代码合并到 branches 分支,为例说明:
第 ① 种分支合并方式
切换到branches分支--右键根目录--Team--合并--选择Merge a range of revisions--不要勾选Perform pre-merge best practices checks--Merge from选择我们的trunk分支--Revisions处选择All eligible revisions--Finish--分支合并完毕
第 ② 种分支合并方式
目前没用过。
第 ③ 种分支合并方式
切换到branches分支--右键根目录--Team--合并--选择Merge two different trees--在From处填入我们的branches对应的URL--选择HEAD Revision(最新版本)--在To处填入我们的trunk对应的URL--选择HEAD Revision(最新版本)--Finish--分支合并完毕
第 ④/⑤ 种分支合并方式
目前没用过。
参考
[1] 版本控制工具-git 和 svn:https://baijiahao.baidu.com/s?id=1621743840312073288&wfr=spider&for=pc
[2] Eclipse 中解决冲突详解:https://blog.csdn.net/uniqueweimeijun/article/details/81143165