SVN是一款集中式的代碼存儲工具,可以幫助多個用戶協同開發同一應用程序。
但是SVN不能完全代替人工操作,有時也需要程序員自己進行溝通確認有效的代碼。
下面就簡單的看一下,常見的代碼沖突以及解決方法。
總結起來,無非是:
1 避免開發人員共同開發同一文件
2 開發前需要時常更新本地代碼庫
修改同一文件不同位置引發的沖突
首先看一下問題背景:
樣例場景中有連個用戶:xingoo和test。他們共同開發一個程序,改程序只有一個文件,原始的代碼如下:
public void Test{ System.out.println("Test!"); return 1; }
此時用戶xingoo,修改代碼第2行,修改打印語句!
public void Test{ System.out.println("Test!xingoo"); return 1; }
用戶test,修改代碼第3行,修改返回值
public void Test{ System.out.println("Test!"); return 0; }
此時xingoo用戶先提交了代碼,當test提交代碼時,提示錯誤:
提示用戶該文件已經過期,需要先更新文件。
此時,SVN會自動把其他用戶修改的操作更新到該文件中(前提是不同用戶修改的位置不同),並且保存當前用戶修改的部分。
點擊更新,更新代碼。
觀察代碼發現,已經更新為:
public void Test{ System.out.println("Test!xingoo"); return 0; }
再次提交,提示成功:
這種情況,是最簡單的代碼沖突樣例。不同用戶修改了不同位置的代碼,因此只需要在提交前進行更新,就可以解決沖突。
那么如果用戶修改的是同一位置呢?
修改同一文件相同位置引發的沖突
前面例子中,xingoo的代碼當前為,版本號為9:
public void Test{ System.out.println("Test!xingoo"); return 1; }
test的代碼為,版本號為10:
public void Test{ System.out.println("Test!xingoo"); return 0; }
此時test的代碼時最新版本的。
如果此時,xingoo用戶,想要修改 return 1; 部分的代碼,提交時會發生什么呢?
再次提交遇到錯誤:
點擊OK后,提示更新或取消,點擊更新,更新代碼!
再次報錯,提示:文件存在沖突!
此時觀察文件夾發現,多了3個文件
分別打開這3個文件:
test.txt中的內容,該文件記錄了沖突的詳細內容,
其中<<<<<<.mine到====之間為當前用戶修改的內容;
====到>>>>>.r10為版本庫中的內容:
public void Test{ System.out.println("Test!xingoo"); <<<<<<< .mine return 2; ======= return 0; >>>>>>> .r10 }
test.txt.mine 記錄當前用戶修改后的文件內容快照
public void Test{ System.out.println("Test!xingoo"); return 2; }
test.txt.r9 記錄當前用戶修改前,版本庫中的內容快照
public void Test{ System.out.println("Test!xingoo"); return 1; }
test.txt.r10 記錄當前版本庫中內容快照
public void Test{ System.out.println("Test!xingoo"); return 0; }
通過這四個文件就可以很快速的發現,哪里有沖突。
至於如何修改,這里推薦:
直接拷貝mine文件,然后把r10文件的r10后綴去掉,進行更新。更新后,對比mine中的內容在進行修改。
也可以直接與其他人員進行協商溝通;更新版本庫中的內容。
通過TortoiseSVN進行代碼對比
有時候,需要對比文件的歷史修改內容,可以直接在該文件上右鍵,選擇Diff
該操作會自動對比代碼庫中文件的內容。
通過TortoiseSVN進行版本對比
也可以通過查看文件的歷史版本,來對比代碼:
選擇Show log菜單
在彈出對話框中,上面列出最近的幾個版本;可以直接雙擊下方藍色的文件名稱,就可以直接使當前文件與該版本的文件進行對比。
參考
【1】《版本控制之道》
【2】慕課網,SVN版本控制:http://www.imooc.com/learn/109