使用SVN命令行解決樹沖突(tree conflict)

前言


很多人因為不知道處理沖突就很久很久都不愿意更新代碼, 另一些人就是不管三七二十一就選了"theirs conflict"或"mine conflict", 有時候樹沖突根本這兩個選項, 他們就強制resolve了, 到最后新代碼一提交就把別人代碼給覆蓋了. 這樣給團隊合作造成極大的不便, 甚至導致版本故障.
本文總結最厭惡最難處理的樹沖突, 讓你從此不再恐懼代碼沖突.

樹沖突的產(chǎn)生


如果一個文件在不同的端都做了修改, 就產(chǎn)生了分歧, svn在?update?或merge時會嘗試自動合并, 大部分情況會成功, 但是也有時候會失敗, 這個時候就會提示沖突.從局部來看沖突是因為兩個端對同一對象進行了修改, 樹沖突則是因為兩路修改導致了目錄結夠不一致, 樹沖突的現(xiàn)象都是一端modified, 另一端missing. 樹沖突不僅要解決目錄結構沖突, 同時可能需要解決普通的文件內容沖突.

在沖突發(fā)生時, 先可以用這些命令查看一下狀態(tài):

用svn status(st)查看哪些文件沖突了:

$ svn st
M       code/foo.c
A  +  C code/bar.c
      >   local edit, incoming delete upon update
Summary of conflicts:
  Tree conflicts: 1

用svn info查看沖突信息:

$ svn info code/bar.c
Path: code/bar.c
Name: bar.c
URL: http://svn.example.com/svn/repo/trunk/code/bar.c
…
Tree conflict: local edit, incoming delete upon update
  Source  left: (file) ^/trunk/code/bar.c@4
  Source right: (none) ^/trunk/code/bar.c@5

也可以用svn log看下何時改的:

$ svn log -r14 ^/trunk
------------------------------------------------------------------------
r14 | harry | 2011-09-06 10:38:17 -0400 (Tue, 06 Sep 2011) | 1 line
Changed paths:
   M /Makefile
   D /code/bar.c
   A /code/baz.c (from /code/bar.c:13)

Rename bar.c to baz.c, and adjust Makefile accordingly.

沖突處理


我們按文件missing原因和需不需要分類處理

1. 文件被刪除了, 不再需要了

這種情況就很好處理, 使用相關SVN命令將其刪了就可以了.

  1. 服務端modified, 本地missing, 該文件不要了. 這種情況本地不會存在該文件, 直接調用resolve就可以了.
#標記沖突已解決(使用本地的狀態(tài), 本地該文件的狀態(tài)是Delete, 提交后服務端對應的文件就會被刪除)
$ svn resolve --accept=working file_old.c
  1. 本地modified, 服務端missing, 該文件不要了. 這種情況本地存在改文件, 所以強制刪掉本地的, 再調用resolve
#強制刪除本地的文件(發(fā)生的文件不加--force是刪不掉的)
$ svn delete --force file_old.c
#標記沖突已解決(使用服務器狀態(tài))
$ svn resolve --accept=theirs-conflict file_old.c
#或者使用本地狀態(tài)也可以, 應該本地的狀態(tài)跟服務一致了(都是Delete)
$ svn resolve --accept=working file_old.c

2. 文件被刪除了, 但是還需要

這種情況可能是由于文件被不小心刪除了, 重新加回svn就可以了.

  1. 服務端modified, 本地missing, 選擇their conflict就可以了
svn resolve --accept=theirs-conflict file.c
  1. 本地modified, 服務端missing
svn resolve --accept=working file.c

3. 文件被移走或重命名了

這種情況的具體場景是A端修改了某文件, B端移動或重命名(簡稱改路徑)了該文件. 這種情況需要分兩步處理, 分別是文件內容沖突處理和目錄結構沖突處理.
為了方便描述, 我們把A端修改的文件成為舊文件, B端改路徑的文件稱為新文件. 我們最終要的是新文件還是舊文件, 在處理時只有細微的區(qū)別, 所以我們這里假定我們要的時新文件.
由于B端改路徑之后還可能又做了修改, 下面我們就有無修改分成兩種情況來處理.

  1. 文件改路徑后無修改. 這個情況很好處理, 只要把A端的修改重做一遍就可以, 具體做法是, 將A端的修改做成一個補丁, 再將補丁應用于新文件上.
  • 假設本地是A端(修改了文件--bar.c), 服務端是B端(轉移了文件->baz.c).
    內容處理:
$ svn diff bar.c > PATCHFILE  #創(chuàng)建補丁文件
$ vi PATCHFILE  #編輯補丁文件
...
---bar.c    (working copy)  #將這行的bar.c改成baz.c
+++bar.c    (working copy)  #將這行的bar.c也改成baz.c
...
svn patch PATCHFILE .    #應用補丁到當前目錄(補丁只能應用到目錄)

結構處理:

svn delete --force bar.c    #將已經(jīng)missing的文件狀態(tài)改為D
svn resolve --accept=working bar.c    #標記已解決(此處也可用theirs-conflict)
  • 假如服務端是A端修改了文件, 本地是B端轉移了文件, 創(chuàng)建補丁的方法有細微的區(qū)別
    內容處理:
$ svn info bar.c #先使用svn info查看詳情
Tree conflict: local file moved away, incoming file edit upon update
  Source  left: (file) bar.c@1485
  Source right: (file) bar.c@1486
$ svn diff -r1485:1486 bar.c > PATCHFILE  #根據(jù)詳情創(chuàng)建補丁文件
$ vi PATCHFILE  #編輯補丁文件
...
---bar.c    (working copy)  #將這行的bar.c改成baz.c
+++bar.c    (working copy)  #將這行的bar.c也改成baz.c
...
svn patch PATCHFILE .    #應用補丁到當前目錄(補丁只能應用到目錄)

結構處理:

svn resolve --accept=working bar.c   #標記已解決
  1. 文件改路徑后有修改. 這種情況目錄結構沖突處理跟上面類似, 這里就不再累述了, 但是的文件內容沖突處理比較麻煩, 目前還沒有找到自動合并的方法, 需要手動合并, 這里只能是給點建議, 建議是先用svn diff 查看就舊文件的改動作為索引:
$ svn info bar.c #找到舊文件變化的版本
Tree conflict: local file moved away, incoming file edit upon update
  Source  left: (file) bar.c@1485
  Source right: (file) bar.c@1486
$ svn diff -r1485:1486 bar.c #查看變化的內容
Index: bar.c
===================================================================
--- bar.c   (revision 1485)
+++ bar.c   (revision 1486)
@@ -3,4 +3,5 @@
void main()
{
printf("hello")
+printf("world")
}

之后, 在用圖形界面工具(如beyond compare)比對舊文件與新文件, 將svn diff里的變更點一個一個手動應用到新文件.

其他說明


*由于merge產(chǎn)生的沖突和update產(chǎn)生的沖突現(xiàn)象和處理方法都是一樣的, 所以我們這里處理只針對了update, merge產(chǎn)生沖突時, 只要把源分支當成服務端按一致的方法處理就可以了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市靴患,隨后出現(xiàn)的幾起案子呼盆,更是在濱河造成了極大的恐慌,老刑警劉巖访圃,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腿时,居然都是意外死亡批糟,警方通過查閱死者的電腦和手機徽鼎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棠隐,“玉大人助泽,你說我怎么就攤上這事“暗郏” “怎么了帕涌?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵溜嗜,是天一觀的道長炸宵。 經(jīng)常有香客問我土全,道長裹匙,這世上最難降的妖魔是什么概页? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任惰匙,我火速辦了婚禮项鬼,結果婚禮上劲阎,老公的妹妹穿的比我還像新娘悯仙。我一直安慰自己锡垄,他們只是感情好偎捎,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著程奠,像睡著了一般瞄沙。 火紅的嫁衣襯著肌膚如雪距境。 梳的紋絲不亂的頭發(fā)上垫桂,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天诬滩,我揣著相機與錄音疼鸟,去河邊找鬼空镜。 笑死姑裂,一個胖子當著我的面吹牛男旗,可吹牛的內容都是我干的察皇。 我是一名探鬼主播什荣,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嗜闻,長吁一口氣:“原來是場噩夢啊……” “哼琉雳!你這毒婦竟也來了翠肘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甥桂,沒想到半個月后黄选,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糕簿,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡蜂嗽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年辱揭,在試婚紗的時候發(fā)現(xiàn)自己被綠了问窃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片域庇。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尉姨,靈堂內的尸體忽然破棺而出又厉,到底是詐尸還是另有隱情馋没,我是刑警寧澤篷朵,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布笔链,位于F島的核電站鉴扫,受9級特大地震影響坪创,放射性物質發(fā)生泄漏莱预。R本人自食惡果不足惜依沮,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辜限。 院中可真熱鬧薄嫡,春花似錦、人聲如沸费什。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽言沐。三九已至险胰,卻和暖如春起便,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鼻疮。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工震贵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留媚送,地道東北人塘偎。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像涵防,于是被迫代替她去往敵國和親壮池。 傳聞我的和親對象是個殘疾皇子厅克,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內容