<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 262,  comments - 221,  trackbacks - 0

    【17】解決沖突和比較差異


    在團隊合作的情況下,如果由于溝通不暢或者分工不明,有可能出現幾個人同時修改一個文件的不同部分,甚至同時修改了同一部分的情況。當其中的一方先提交后他人再更新本地工作副本時,通常會出現沖突。這時SVN通常不知道該如何處理,而是把問題的解決方案選擇留給程序員。本節我們將來學習如何解決沖突,還有就是避免沖突的幾個基本原則。

    為了模擬這個情況,我們必須在新建一個用戶guest,該用戶同樣也從版本庫checkout出一份ECoupon項目的拷貝到本地工作副本E:\Temp\ECoupon_tmp
    C:\>svn checkout http://localhost:8000/svn/Workspace/Ericsson/ECoupon --username=guest --password=guest

    SVN支持從命令行傳遞用戶名和密碼,否則將使用緩存的用戶名和密碼。現在我們來檢查一下這個新的用戶檢出的項目的靜態信息
    C:\>svn info E:\Temp\ECoupon_tmp
    Path: E:
    \Temp\ECoupon_tmp
    URL: http:
    //localhost:8000/svn/Workspace/Ericsson/ECoupon
    Repository Root: http:
    //localhost:8000/svn/Workspace
    Repository UUID: 06f3a259
    -b3b5-ff4e-9a70-52e8834f1976
    Revision: 
    19
    Node Kind: directory
    Schedule: normal
    Last Changed Author: qlinpen
    Last Changed Rev: 
    19
    Last Changed 
    Date2009-12-09 16:08:59 +0800 (星期三, 09 十二月 2009)

    可以看出兩個用戶都共享了同一個版本庫的路徑,而且最后一次提交是由用戶qlinpen執行的。假設現在程序員A和B同時對文件read-from-wc.txt進行修改。A在第一行添加了"add by user qlinpen",而B在第二行添加了"add by user guest"。

    C:\>svn diff -r HEAD E:\Temp\ECoupon\read-from-wc.txt --username=qlinpen --password=test
    Index: E:
    /Temp/ECoupon/read-from-wc.txt
    ==============================================================
    --- E:/Temp/ECoupon/read-from-wc.txt    (revision 22)
    +++ E:/Temp/ECoupon/read-from-wc.txt    (working copy)
    @@ 
    -1 +1,2 @@
    -modify by user qlinpen
    \ No newline at end of file
    +modify by user qlinpen
    +add by user qlinpen
    \ No newline at end of file

    C:
    \>svn diff -r HEAD E:\Temp\ECoupon_tmp\read-from-wc.txt --username=guest --password=guest
    Index: E:
    /Temp/ECoupon_tmp/read-from-wc.txt
    =============================================================
    --- E:/Temp/ECoupon_tmp/read-from-wc.txt        (revision 22)
    +++ E:/Temp/ECoupon_tmp/read-from-wc.txt        (working copy)
    @@ 
    -1 +1,2 @@
    -modify by user qlinpen
    \ No newline at end of file
    +modify by user qlinpen
    +add by user guest
    \ No newline at end of file

    可以看到,用戶qlinpen和gues都基于版本庫檢出的文件作出了改變。現在來模擬一下協同開發時遇到的沖突問題。

     Step 1: 用戶qlinpen首先更新本地工作副本,然后提交自己的改變
    C:\>svn update E:\Temp\ECoupon --username=qlinpen --password=test
    At revision 
    22.

    C:
    \>svn commit E:\Temp\ECoupon -"commit change by qlinpen" --username=qlinpen --password=test
    Sending        E:
    \Temp\ECoupon\read-from-wc.txt
    Transmitting file data .
    Committed revision 
    23.

     Step 2: 用戶guest在提交前檢查版本庫是否有更新(這是一個好習慣)
    C:\>svn status E:\Temp\ECoupon_tmp --show-updates --username=guest --password=guest
    M      
    *       22   E:\Temp\ECoupon_tmp\read-from-wc.txt
    Status against revision:     
    23

    C:
    \>svn diff -r HEAD E:\Temp\ECoupon_tmp\read-from-wc.txt --username=guest --password=guest
    Index: E:
    /Temp/ECoupon_tmp/read-from-wc.txt
    ==============================================================
    --- E:/Temp/ECoupon_tmp/read-from-wc.txt        (revision 23)
    +++ E:/Temp/ECoupon_tmp/read-from-wc.txt        (working copy)
    @@ 
    -1,2 +1,2 @@
     modify by user qlinpen
    -add by user qlinpen
    \ No newline at end of file
    +add by user guest
    \ No newline at end of file

    通過本地文件read-fom-wc.txt和版本庫的最新版本同名文件(-r HEAD)比較,得知有人添加了"add by user qlinpen"。

     Step 3: 用戶guest想得知這一行是誰加上去的,還有精確的時間
    C:\>svn blame http://localhost:8000/svn/Workspace/Ericsson/ECoupon/read-from-wc.txt -v
        
    23    qlinpen 2009-12-10 11:03:21 +0800 (星期四, 10 十二月 2009) modify by user qlinpen
        
    23    qlinpen 2009-12-10 11:03:21 +0800 (星期四, 10 十二月 2009) add by user qlinpen

    通過svn blame命令配合參數-v(--verbose),我們可以精確地知道文件每一行的修改時間,修改者,版本號。

     Step 4: 用戶guest決定先提交自己的變更,再來更新本地的工作副本
    C:\>svn commit E:\Temp\ECoupon_tmp -"commit change by guest" --username=guest --password=guest
    Sending        E:
    \Temp\ECoupon_tmp\read-from-wc.txt
    svn: Commit failed (details follow):
    svn: File 
    or directory 'read-from-wc.txt' is out of date; try updating
    svn: resource out of date; try updating

    還記得前面我們說過的嗎?當本地工作副本的版本低于版本庫的時候,是不允許提交的,SVN會要求用戶先更新本地的工作副本,再提交新的變更。

     Step 5: 用戶guest根據建議選擇了先update
    C:\>svn update E:\Temp\ECoupon_tmp\ --username=guest --password=guest
    Conflict discovered in 
    'E:/Temp/ECoupon_tmp/read-from-wc.txt'.
    Select: (p) postpone, (df) diff-full, (e) edit, (h) help for more options: p
    C    E:
    \Temp\ECoupon_tmp\read-from-wc.txt
    Updated 
    to revision 23.

    很不幸,沖突出現了。為什么呢?因為大家同樣都在第2行更改了文件,如果update成功那么用戶qlinpen提交的內容將會覆蓋用戶guest的修改。所以沖突就出現了。這時SVN提供了幾種建議,它們包括:

     A.(p) postone 延遲解決
     B.(df) diff-full 顯示所有沖突的內容
     C.(e) edit 啟動編輯器解決沖突
     D.(r) resolve 標識沖突已經解決
     E.(mf) mine-full 用我的版本覆蓋他人的修改
     F.(tf) theirs-full 用他人的版本覆蓋我的修改
     G.(l) lanuch 啟動其他工具來解決沖突
     H.(h) help 啟動幫助信息
     
     Step 6: 用戶guest選擇了p延遲解決。
    C:\>dir E:\Temp\ECoupon_tmp\read*
     驅動器 E 中的卷是 Shared Folders
     卷的序列號是 
    0000-0064

     E:
    \Temp\ECoupon_tmp 的目錄

    2009-12-10  11:27               122 read-from-wc.txt
    2009-12-10  11:27                41 read-from-wc.txt.mine
    2009-12-10  11:27                22 read-from-wc.txt.r22
    2009-12-10  11:27                43 read-from-wc.txt.r23

    這時在E:\Temp\ECoupon_tmp目錄下,read-from-wc.txt所在的位置會產生三個文件
     A.read-from-wc.txt.mine:這是我本地修改的副本
     B.read-from-wc.r22:這是read-from-wc.txt的BASE版本
     C.read-from-wc.r23:這是read-from-wc.txt的HEAD版本

    我們分別打開這四個文件,觀察其內容
    C:\>type E:\Temp\ECoupon_tmp\read-from-wc.txt.r22
    modify by user qlinpen

    C:
    \>type E:\Temp\ECoupon_tmp\read-from-wc.txt.r23
    modify by user qlinpen
    add by user qlinpen

    C:
    \>type E:\Temp\ECoupon_tmp\read-from-wc.txt.mine
    modify by user qlinpen
    add by user guest

    C:
    \>type E:\Temp\ECoupon_tmp\read-from-wc.txt
    <<<<<<< .mine
    modify by user qlinpen
    add by user guest
    =======
    modify by user qlinpen
    add by user qlinpen
    >>>>>>> .r23

    可以看到從上到下,依次是原始版本,用戶qlinpen修改后的版本,用戶guest修改的版本(本地尚未提交的副本),合并后的版本。read-from-wc.txt文件是合并后的結果,但是里面出現的內容并不是我們想要的。里面多了一些<<,==,>>之類的符號,還有版本號。下面解析一下:

     A.從<<到==之間的部分是.mine的內容,即用戶guest本地修改但尚未提交的內容
     B.從==到>>之間的部分是.r23的內容,即來自版本庫由用戶qlinpen提交的最新版本

    SVN不知道如何合并,所以將它們都用沖突標記標記出來

     Step 7: 用戶guest手工解決沖突

    經過和用戶qlinpen討論,最終用戶guest選擇將兩人的修改合并,合并后的結果如下:
    C:\>type E:\Temp\ECoupon\read-from-wc.txt
    modify by user qlinpen
    add by user qlinpen

    C:
    \>type E:\Temp\ECoupon_tmp\read-from-wc.txt
    modify by user qlinpen
    add by user qlinpen
    add by user guest

     Step 8: 用戶guest通知SVN沖突已經解決

    執行svn resolved PATH 來通知SVN沖突已經被解決,可以準備再次更新或提交了。需要注意的是:svn resolved命令只是簡單地把文件的狀態從鎖定(L)改為正常,至于沖突是否真的解決,更新或提交后會不會引起別的問題它是不知道的。
    C:\>svn status E:\Temp\ECoupon_tmp --show-updates
    ?                   E:
    \Temp\ECoupon_tmp\read-from-wc.txt.r22
    ?                   E:
    \Temp\ECoupon_tmp\read-from-wc.txt.r23
    ?                   E:
    \Temp\ECoupon_tmp\read-from-wc.txt.mine
    C              
    23   E:\Temp\ECoupon_tmp\read-from-wc.txt
    Status against revision:     
    23

    C:
    \>svn resolved E:\Temp\ECoupon_tmp\read-from-wc.txt
    Resolved conflicted state of 
    'E:\Temp\ECoupon_tmp\read-from-wc.txt'

    C:
    \>svn status E:\Temp\ECoupon_tmp --show-updates
    M              
    23   E:\Temp\ECoupon_tmp\read-from-wc.txt
    Status against revision:     
    23

    在沒有執行svn resoved命令之前,文件read-from-wc.txt的狀態是'C',代表沖突(Conflict)。執行svn resolved命令,SVN會做兩件事:

     A.刪除臨時生成的幾個文件:*.mine,*.rBASE,*.rHEAD
     B.去除鎖定文件的鎖,通知SVN沖突已經解決

    在這里需要再次強調的是:svn resovle只負責清除沖突環境和通知SVN,是否真正解決沖突最終還是靠程序員自己。

     Step 9: 用戶guest提交最終修復的版本
    C:\>svn commit E:\Temp\ECoupon_tmp -"commit after conflict resolved by user guest" --username=guest --password=guest
    Sending        E:
    \Temp\ECoupon_tmp\read-from-wc.txt
    Transmitting file data .
    Committed revision 
    24.

    C:
    \>svn update E:\Temp\ECoupon_tmp --username=guest --password=guest
    At revision 
    24.

     Step 10: 用戶qlinpen更新本地工作副本
    C:\>svn status E:\Temp\ECoupon --show-updates
           
    *       23   E:\Temp\ECoupon\read-from-wc.txt
    Status against revision:     
    24

    C:
    \>svn update E:\Temp\ECoupon --username=qlinpen --password=test
    U    E:
    \Temp\ECoupon\read-from-wc.txt
    Updated 
    to revision 24.

    至此沖突解決。

    雖然SVN提供了比較差異和解決沖突的方法,但避免沖突的最好方法永遠只有一個:明確的分工和良好的溝通,盡量避免多個人同時修改同一份文件。如果不能避免,那么最好指定一個人在提交前負責合并各人的更新,然后一次性提交。



    -------------------------------------------------------------
    生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
    posted on 2009-12-09 23:25 Paul Lin 閱讀(593) 評論(0)  編輯  收藏 所屬分類: 項目管理
    <2009年12月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产线视频精品免费观看视频| 久久久久亚洲精品影视| xxxxx做受大片视频免费| 亚洲成a人片在线观看无码| 日韩视频在线精品视频免费观看| 国产精品日本亚洲777| 亚洲国产精品无码久久久蜜芽| 无人在线观看完整免费版视频| 永久免费精品影视网站| 亚洲伊人tv综合网色| 色www永久免费视频| 免费观看男人吊女人视频| 亚洲欧美日韩综合久久久久| 在线亚洲97se亚洲综合在线| 亚洲日日做天天做日日谢| 久久久久亚洲AV无码专区网站| 曰批视频免费40分钟试看天天| 四虎永久在线精品免费一区二区 | 国外亚洲成AV人片在线观看| 在线视频免费观看爽爽爽| 国产成人自产拍免费视频| 国产成人精品日本亚洲专 | 亚洲av无码成人影院一区| 亚洲国产精品特色大片观看完整版| 成人一a毛片免费视频| 无码人妻精品中文字幕免费 | 久久不见久久见中文字幕免费| 亚洲精品视频免费| 亚洲综合色一区二区三区| 国产精品自在自线免费观看| 59pao成国产成视频永久免费| 国产裸体美女永久免费无遮挡 | 免费无码黄网站在线看| 国产亚洲精彩视频| 中文文字幕文字幕亚洲色| 亚洲福利在线视频| 亚洲精品无码乱码成人 | 亚洲国产成人久久综合野外| 国产va免费精品观看精品 | 又大又黄又粗又爽的免费视频| 成年在线观看网站免费|