關於版本控制器,大體可分爲集中式和分佈式兩種。git
集中式的版本控制器一般會存在一箇中央服務器,主要是用來存放版本庫的,(這裏暫且先不說分支的事)當咱們工做以前,首先須要從中央服務器獲得一份最新版本的代碼,修改完畢以後,再次推送到中央服務器。集中式的版本控制器有個最大的缺點,就是必需要聯網才能工做,同時,一旦中央服務器掛掉,整個項目就所有奔潰,可是用起來確實要方便一些。
vim
分佈式版本控制器的優點就很明顯了,對於分佈式的版本控制器,並無中央服務器一說,加入該版本控制器的每一個人的電腦上都有一個完整的版本庫,所以,也同時避免了聯網的缺點。當進行了本地的修改以後,只要推送給彼此,各自的修改就均可以看到。爲了方便,一般的分佈式版本控制器中也有一臺相似於中央處理器的機器,只是爲了你們相互推送的時候更加地方便,即便一臺服務器down掉,只須要再拷貝一個版本庫便可,容災性要好得多。
bash
對於這兩種版本控制器,SVN是集中式的表明,Git是分佈式的表明,二者各有優缺點,在互聯網公司中,二者都有着必定的應用。這裏要說的是SVN的搭建與操做。
服務器
環境: CentOS6.5
分佈式
操做以前:安裝svnserver,直接使用yum安裝便可,一些狀況下,電腦是自動安裝了svn和git的ide
開始操做:svn
一、SVN倉庫的創建ui
a、建立項目目錄dir,並進行倉庫初始化spa
mkdir /svn_repo版本控制
svnadmin create /svn_repo
b、修改倉庫目錄下的conf文件夾下的三個文件的內容,每行開頭沒有空格
authz:權限相關信息
[/] # 倉庫所在目錄 muhui = rw # 給muhui用戶rw權限 *= # 其餘用戶沒有任何權限 |
passwd:用戶名和密碼相關信息
user = passswd |
svnserver.conf:相關配置路徑
anon-access = none 匿名用戶權限 auth-access = write 受權用戶有寫權限 password-db = passwd 密碼文件,未指定路徑,表示當前目錄 authz-db = authz 權限文件 realm = /svn_repo/httpd 版本庫所在目錄 |
二、SVN項目目錄
a、建立主工做目錄manager
[root@bogon svn_test]# tree
.
└── manager
└── httpd
├── branched # 子分支目錄
├── tags
└── trunk # 主分支目錄
進入到manager目錄,3將manager的目錄結構同步到倉庫,在httpd項目目錄下,有了這個三個文件夾。
svn import httpd svn://127.0.0.1/httpd -m "init httpd"
b、建立用戶,並將主分支的代碼檢出到本地。
mkdir -p /svn_test/dev1 cd /svn_test/dev1 svn co svn://127.0.0.1/httpd/trunk httpd |
c、文件修改,並提交文件
[root@bogon httpd]# vim main.cpp [root@bogon httpd]# ls main.cpp [root@bogon httpd]# svn st ? main.cpp # ?表示該文件未歸入版本控制 [root@bogon httpd]# svn add main.cpp # add將該文件添加到版本控制 A main.cpp [root@bogon httpd]# svn ci -m "dev1 modify" # 將修改提交到服務器 增長 main.cpp 傳輸文件數據. 提交後的版本爲 2。 |
三、多人協做
須要說明的一點,多人協做,和多分支操做是兩個概念。一個分支上能夠有多個user在操做,這裏說的是在主分支下的多用戶操做。
a、建立用戶dev2,下拉代碼修改並再次提交
[root@bogon httpd]# pwd /svn_test/dev2/httpd [root@bogon httpd]# vim main.cpp [root@bogon httpd]# svn st M main.cpp [root@bogon httpd]# svn up # 更新代碼,防止遠程庫代碼已被更改 版本 2。 [root@bogon httpd]# svn log # 查看提交日誌信息 ......... [root@bogon httpd]# svn diff # 查看修改信息 ......... [root@bogon httpd]# svn ci -m "dev2 write sub" # 提交代碼到倉庫 ......... |
b、衝突解決
衝突緣由:多個用戶同時下拉一份代碼進行修改,修改完畢在提交以前,未再次svn up更新,多個用戶同時對一個版本進行修改,形成衝突。
[root@bogon httpd]# svn ci -m "dev1--complict" # 提交失敗,存在衝突 正在發送 main.cpp 傳輸文件數據.svn: 提交失敗(細節以下): svn: 文件 「/trunk/main.cpp」 已通過時 [root@bogon httpd]# svn up 在 「main.cpp」 中發現衝突。 選擇: (p) 推遲,(df) 顯示所有差別,(e) 編輯, (mc) 個人版本, (tc) 他人的版本, (s) 顯示所有選項: p # p選項,進行延時 C main.cpp 更新到版本 4。 衝突概要: 正文衝突:1 # 出現不少臨時文件,爲各個版本的源文件 [root@bogon httpd]# svn resolve --accept working main.cpp # 衝突雙方進行協商,修改源文件,以後臨時文件被刪除 「main.cpp」的衝突狀態已解決 [root@bogon httpd]# svn ci -m "deal complict" # 再次提交,衝突解決 |
四、分支操做
a、分支建立
[root@bogon dev3]# svn copy svn://127.0.0.1/httpd/trunk svn://127.0.0.1/httpd/branched/branch1 -m "add new branch1" 提交後的版本爲 6。
# svn分支建立的過程,其實是對主分支的一份拷貝
b、查看共有多少個分支
[root@bogon dev3]# svn list svn://127.0.0.1/httpd/branched -v 6 muhui 5月 28 09:38 ./ 6 muhui 5月 28 09:38 branch1/
c、從分支branch1分支檢出代碼到當前工做目錄,並查看當前屬於那個分支
[root@bogon dev3]# svn co svn://127.0.0.1/httpd/branched/branch1 httpd A httpd/main.cpp 取出版本 6。 [root@bogon httpd]# svn info 路徑: . URL: svn://127.0.0.1/httpd/branched/branch1 版本庫根: svn://127.0.0.1/httpd 版本庫 UUID: 39c9dc13-9f79-4073-bb0e-2b58c9b71fbb 版本: 6 節點種類: 目錄 調度: 正常 最後修改的做者: muhui 最後修改的版本: 6 最後修改的時間: 2017-05-28 09:38:49 +0800 (日, 2017-05-28)
d、分支合併操做,要在主分支目錄下進行合併
分支上的用戶修改文件內容,並檢入到分支
[root@bogon httpd]# svn ci -m "branch1 modify" 正在發送 main.cpp 傳輸文件數據. 提交後的版本爲 7。
獲取查看分支時的版本號
[root@bogon httpd]# svn log --verbose --stop-on-copy ------------------------------------------------------------------------ r6 | muhui | 2017-05-28 09:38:49 +0800 (日, 2017-05-28) | 1 行 改變的路徑: A /branched/branch1 (從 /trunk:5) add new branch1 ------------------------------------------------------------------------
獲取主幹目錄的最新版本號
[root@bogon httpd]# svn up 版本 7。
分支合併
[root@bogon httpd]# svn merge -r 6:7 svn://127.0.0.1/httpd/branched/branch1
五、版本回退
一、僅僅修改源文件,但還未進行ci操做
[root@bogon httpd]# svn revert main.cpp
二、修改完畢的結果已經進行了commit
[root@bogon httpd]# svn up # 獲取版本庫最新版本 [root@bogon httpd]# svn log # 找到要回滾的版本號 [root@bogon httpd]# svn merge -r 9:8 main.cpp # merge進行回退,9表示當前版本號,8表示要回退到的版本號
------muhuizz整理