svn学习之路-概念篇

来源:互联网 发布:淘宝店铺不能注册 编辑:程序博客网 时间:2024/06/06 00:17

工欲善其事,必先利其器。在正式学习svn前,有必要简单理解下svn的工作原理。

1.版本库

svn是集中式的文件管理服务器,说白了就是一种C/S架构的服务器,其核心是版本库。它记录着文件的更改情况,不仅包括文件内容本身,而且包含文件的删除、增添、替换、目录结构更改等情况。用户每一次拷贝都是中心版本库当前最新的版本内容。当然,用户也可以通过svn的命令回看之前的任意版本内容。
svn的C/S架构

2.版本控制方式

当多用户同时操作同一个版本文件时,会遇到一个共享冲突的问题。如何避免这个问题是版本控制系统必须解决的。一种方式是使用“锁定-修改-解锁”的模式,这样可以有效的避免冲突, 但是多用户不能很好的并行工作,影响效率。另一种常用的模式就是“拷贝-修改-合并”,svn就是采用这种模式。举例说明。
用户A和B从中心版本库中checkout同一份工作拷贝,两人并行工作,互不干扰。当A修改完自己的工作内容,推送到中心版本库中时,更新了版本库的内容。之后B也完成了任务,提交时,会出现多种情况,1)两人修改的内容不是同一个文件,那B提交到版本库时不会有冲突,版本库中的版本会再一次更新;2)两人修改的是同一个文件,但修改的内容不冲突,比如,A在文件头位置修改,B在文件尾位置修改,这样提交后会提示有改文件版本过时(因为A先提交了,生成了一个新的版本),此时B需要把最新的版本内容更新,svn会自动合并,不会有内容冲突,然后B再次提交修改即可;3)两人修改的同一个文件,且在同一个位置修改,那这时就会有文件内容冲突的,B无法顺利提交,需要先更新版本,然后再手动合并冲突的内容,这样才能顺利提交。

以下实际操作体验下这种模式。

先svn checkout 一份版本工作拷贝,

$ svn checkout file:///home/jiangzls/svnrepos/learnsvn/trunk$ ls       # 该工作拷贝下包含一个文件夹和两个文件dir/ Groupsock.hh readme

1)用户A对Goupsock.hh做了修改后提交,

$ vi Groupsock.hh  # 用户A修改Groupsock.hh,添加第44,45行$ svn diff # 工作拷贝比较Index: Groupsock.hh===================================================================--- Groupsock.hh        (revision 14)+++ Groupsock.hh        (working copy)@@ -41,6 +41,8 @@ // user A add a no.3 line++// user A add a no.4 line class OutputSocket: public Socket { public:   OutputSocket(UsageEnvironment& env);$ svn commit -m "user A add no. 4 line in Groupsock.h" # 提交成功Sending        Groupsock.hhTransmitting file data .Committed revision 15.

用户B对readme做修改后提交,此时提交顺利不会有冲突

$ vi readme    # 用户B修改readme,添加第5行$ svn diff # 工作拷贝比较Index: readme===================================================================--- readme      (revision 14)+++ readme      (working copy)@@ -2,3 +2,4 @@ this a no.2 line this a no.3 line user B add no.4 line+user B add no.5 line$ svn commit -m "user B add no.5 line in readme"   # 提交成功Sending        readmeTransmitting file data .Committed revision 16.

2)用户A对Goupsock.hh做了修改后提交

$ vi Groupsock.hh  # 用户A修改Groupsock.h,添加第43行$ svn diff # 工作拷贝比较Index: Groupsock.hh===================================================================--- Groupsock.hh        (revision 16)+++ Groupsock.hh        (working copy)@@ -43,6 +43,7 @@ // user A add a no.4 line+// user A add a no.5 line class OutputSocket: public Socket { public:   OutputSocket(UsageEnvironment& env);$ svn commit -m "user A add no.5 line in Groupsock.hh" # 提交成功Sending        Groupsock.hhTransmitting file data .Committed revision 17.

用户B也对Groupsock.hh进行修改,提交时由于用户A已经更新了版本库(修订版17),故B的版本较旧(修订版16)需要更新,

$ vi Groupsock.hh      # 用户B修改Groupsock.hh,修改221行内容$ svn diff # 工作拷贝比较Index: Groupsock.hh===================================================================--- Groupsock.hh        (revision 16)+++ Groupsock.hh        (working copy)@@ -221,4 +221,4 @@ #endif-// User B add no.1 line in tail+// User B add no.3 line in tail$ svn commit -m "user B add no.3 line in Groupsock.hh" # 提交,发现版本过久Sending        Groupsock.hhsvn: E155011: Commit failed (details follow):svn: E155011: File '/home/jiangzls/workplace/2test/learnsvn/trunk/Groupsock.hh' is out of datesvn: E160028: File '/learnsvn/trunk/Groupsock.hh' is out of date$ svn update   # 更新版本Updating '.':G    Groupsock.hhUpdated to revision 17.$ svn commit -m "user B add no.3 line in Groupsock.hh" # 再次提交成功Sending        Groupsock.hhTransmitting file data .Committed revision 18.

3)用户A对Goupsock.hh做了修改后提交

$ vi Groupsock.hh  # 用户A修改Groupsock.hh, 添加74行$ svn diff # 工作拷贝比较Index: Groupsock.hh===================================================================--- Groupsock.hh        (revision 18)+++ Groupsock.hh        (working copy)@@ -71,6 +71,7 @@   unsigned fLastSentTTL; };+// user A add no.6 line class destRecord { public:   destRecord(struct in_addr const& addr, Port const& port, u_int8_t ttl, unsigned sessionId,$ svn commit -m "user A add no.6 line in Groupsock.hh" # 提交成功Sending        Groupsock.hhTransmitting file data .Committed revision 19.

用户B也对Groupsock.hh进行修改,提交时由于用户A已经更新了版本库(修订版19),故B的版本较旧(修订版18)需要更新,更新后发现两人修改的位置内容冲突,需要手动解决冲突合并后提交

$ svn diffIndex: Groupsock.hh===================================================================--- Groupsock.hh        (revision 18)+++ Groupsock.hh        (working copy)@@ -71,6 +71,8 @@   unsigned fLastSentTTL; };+// user B add no.4 line+// user B add no.5 line class destRecord { public:   destRecord(struct in_addr const& addr, Port const& port, u_int8_t ttl, unsigned sessionId,$ svn commit -m "user B add no.4 no.5 line in Groupsock.hh"    # 版本过久,需要更新Sending        Groupsock.hhsvn: E155011: Commit failed (details follow):svn: E155011: File '/home/jiangzls/workplace/2test/learnsvn/trunk/Groupsock.hh' is out of datesvn: E160028: File '/learnsvn/trunk/Groupsock.hh' is out of date$ svn update   # 和版本库的内容冲突,需要手动合并Updating '.':C    Groupsock.hhUpdated to revision 19.Conflict discovered in file 'Groupsock.hh'.Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,        (mc) my side of conflict, (tc) their side of conflict,        (s) show all options: p   # 选择p,然后手动合并冲突Summary of conflicts:  Text conflicts: 1$ ls # 会有其他冲突文件提示,.mine 表示B本地修改的,.r18 表示修订版18,.r19 表示修订版19的内容(即版本库前一刻更新到的)dir/  Groupsock.hh  Groupsock.hh.mine  Groupsock.hh.r18  Groupsock.hh.r19  readme$ svn diff  # 再次比较,会有冲突内容提示,需要手动解决冲突Index: Groupsock.hh===================================================================--- Groupsock.hh        (revision 19)+++ Groupsock.hh        (working copy)@@ -71,7 +71,12 @@   unsigned fLastSentTTL; };+<<<<<<< .mine+// user B add no.4 line+// user B add no.5 line+======= // user A add no.6 line+>>>>>>> .r19 class destRecord { public:   destRecord(struct in_addr const& addr, Port const& port, u_int8_t ttl, unsigned sessionId,$ svn commit -m "user B solve conflict"  # 解决冲突后提交Sending        Groupsock.hhTransmitting file data .Committed revision 20.
0 0