詳解SVN文件沖突和樹沖突解決方法
本節(jié)和大家一起學(xué)習(xí)一下SVN文件沖突和樹沖突,主要包括SVN文件沖突和樹沖突如何出現(xiàn),以及怎樣解決這些沖突,希望通過本文的學(xué)習(xí)大家能夠掌握住這些方法。
解決沖突
偶爾,當(dāng)你從版本庫更新、合并文件時,或者切換工作副本至一個不同的URL時你會遇到?jīng)_突。有兩種沖突:
SVN文件沖突
當(dāng)兩名(或更多)開發(fā)人員修改了同一個文件中相鄰或相同的行時就會發(fā)生文件沖突。
SVN樹沖突
當(dāng)一名開發(fā)人員移動、重命名、刪除一個文件或文件夾,而另一名開發(fā)人員也對它們進(jìn)行了移動、重命名、刪除或者僅僅是修改時就會發(fā)生樹沖突。
SVN文件沖突
當(dāng)兩名或更多開發(fā)人員修改了同一個文件中相鄰或相同的行時就會發(fā)生文件沖突。由于Subversion不知道你的項目的具體情況,它把解決沖突的工作留給了開發(fā)人員。一旦出現(xiàn)沖突,你就應(yīng)該打開有問題的文件,查找以字符串<<<<<<<開頭的行。有沖突的區(qū)域用如下的方式標(biāo)記:
<<<<<<<文件名你的修改=======合并自版本庫中的代碼>>>>>>>版本
對于每個沖突的文件Subversion在你的目錄下放置了三個文件:
文件名.ext.mine
這是你的文件,在你更新你的工作副本之前存在于你的的工作副本中——也就是說,沒有沖突標(biāo)志。這個文件除了你的***修改外沒有別的東西。
文件名.ext.r舊版本
這是在你更新你的工作副本之前的基礎(chǔ)版本(BASErevision)文件。也就是說,它是在你做***修改之前所檢出的文件。
文件名.ext.r新版本
這個文件是當(dāng)你更新你的工作副本時,你的Subversion客戶端從服務(wù)器接收到的。這個文件對應(yīng)于版本庫中的***版本。
你可以通過TortoiseSVN→編輯沖突運行外部合并工具/沖突編輯器,或者你可以使用任何別的編輯器手動解決沖突。你需要沖定哪些代碼是需要的,做一些必要的修改然后保存。
然后,執(zhí)行命令TortoiseSVN→已解決并提交人的修改到版本庫。需要注意的是已解決命令并不是真正的解決了沖突,它只是刪除了filename.ext.mine和filename.ext.r*兩個文件,允許你提交修改。
如果你有二進(jìn)制SVN文件沖突,Subversion不會試圖合并文件。本地文件保持不變(完全是你***修改時的樣子),但你會看到filename.ext.r*文件。如果你要撤消你的修改,保留版本庫中的版本,請使用還原(Revert)命令。如果你要保持你的版本覆蓋版本庫中的版本,使用已解決命令,然后提交你的版本。
你可以右擊父文件夾,選擇TortoiseSVN→已解決...,使用“已解決”命令來解決多個文件。這個操作會出現(xiàn)一個對話框,列出文件夾下所有有沖突的文件,你可以選擇將哪些標(biāo)記成已解決。
樹沖突
當(dāng)一名開發(fā)人員移動、重命名、刪除一個文件或文件夾,而另一名開發(fā)人員也對它們進(jìn)行了移動、重命名、刪除或者僅僅是修改時就會發(fā)生樹沖突。有很多種不同的情形可以導(dǎo)致樹沖突,而且不同的情形需要不同的步驟來解決沖突。
當(dāng)一個文件通過Subversion在本機刪除后,文件也從本機文件系統(tǒng)中刪除。因此即使它是樹沖突的一部分,卻既不能顯示沖突的疊加圖標(biāo)也不能通過右鍵單擊來解決沖突。使用檢查修改對話框來獲得編輯沖突選項。
TortoiseSVN能夠協(xié)助找到合并更改的正確位置,但是需要作一些額外的工作來整理沖突。請牢記:當(dāng)進(jìn)行一次更新操作后,工作副本的基礎(chǔ)文件將會包括每一個項目在執(zhí)行更新操作時版本庫中的版本。如果你在進(jìn)行更新后再撤銷更改,工作副本將返回到版本庫的狀態(tài),而不是你開始進(jìn)行更改前的狀態(tài)。
本地刪除,當(dāng)更新時有更改進(jìn)入開發(fā)人員A修改Foo.c并將其提交至版本庫中
開發(fā)人員B同時在他的工作副本中將文件Foo.c改名為Bar.c,或者僅僅是刪除了Foo.c或它的父文件夾。
更新開發(fā)人員B的工作副本會導(dǎo)致樹沖突:
在工作副本中,F(xiàn)oo.c被刪除了,但是被標(biāo)記為樹沖突。
如果沖突是由于更改文件名引起的而不是刪除文件引起的,那么Bar.c被標(biāo)記為添加,但是其中卻不包括開發(fā)人員A修改的內(nèi)容。
開發(fā)人員B現(xiàn)在必須做出選擇是否保留開發(fā)人員A的更改。在更改文件名的案例中,他可以將Foo.c的更改合并到改名后的文件Bar.c中去。對于刪除文件或文件夾的案例中,他可以選擇保留包含開發(fā)人員A更改內(nèi)容的項目并放棄刪除操作。或什么也不做而直接將沖突標(biāo)記為已解決,那樣他實際上丟棄了開發(fā)人員A的更改。
如果TortoiseSVN能夠找到被改名為Bar.c的原始文件,沖突編輯對話框?qū)⒖梢院喜⒏?。這取決于在什么地方調(diào)用更新操作,它也許不能找到原始文件。
本地更改,當(dāng)更新時有刪除進(jìn)入開發(fā)人員A將文件Foo.c改名為Bar.c并將其提交至版本庫中。
開發(fā)人員B在他的工作副本中修改文件Foo.c?;蛘咴谝粋€文件夾改名的案例中...
開發(fā)人員A將父文件夾FooFolder改名為BarFolder并將其提交至版本庫中。
開發(fā)人員B在他的工作副本中修改文件Foo.c。
更新開發(fā)人員B的工作副本會導(dǎo)致樹沖突。對于一個簡單的SVN文件沖突:
Bar.c被當(dāng)作一個正常文件添加到工作副本中。
Foo.c被標(biāo)記為添加(包括其歷史記錄)并且產(chǎn)生樹沖突。
對于一個文件夾沖突:
BarFolder被當(dāng)作一個正常文件夾添加到工作副本中。
FooFolder被標(biāo)記為添加(包括其歷史記錄)并且產(chǎn)生樹沖突。
Foo.c被標(biāo)記為已修改。
開發(fā)人員B現(xiàn)在需要做出決定是否接受開發(fā)人員A作出的結(jié)構(gòu)改變并且合并她的更改到新結(jié)構(gòu)下適當(dāng)?shù)奈募?,或者直接放棄開發(fā)人員A的更改并保留本地文件。
要合并她的本機更改到新布局中,開發(fā)人員B必須先找出沖突的文件Foo.c經(jīng)過改名/移動后在版本庫中的新文件名是什么。可以使用日志對話框來完成這個任務(wù)。更改必須要手工合并,因為沒有辦法自動的或者簡單的完成此操作。一旦更改移植完畢,沖突的路徑就是多余的并且可以刪除。在此案例中,使用沖突編輯對話框中的刪除按鈕進(jìn)行清理并將沖突標(biāo)記為已解決。
如果開發(fā)人員B認(rèn)為A的更改是錯誤的,那么在沖突編輯對話框中她必須選擇保留按鈕。這樣就會標(biāo)記沖突的文件/文件夾為已解決,但是需要手工刪除開發(fā)人員A的更改。又是通過日志對話框幫助追蹤哪些文件移動了。請期待下節(jié)SVN文件沖突和樹沖突問題講解。
【編輯推薦】