專家指導(dǎo) SVN簡(jiǎn)易使用手冊(cè)
本節(jié)向大家介紹一下SVN簡(jiǎn)易使用手冊(cè)中有關(guān)SVN沖突問題,SVN經(jīng)過長(zhǎng)時(shí)間的發(fā)展,大家應(yīng)該了解SVN沖突問題了,這里我發(fā)表一下個(gè)人理解,和大家討論討論。
手工合并沖突
SVN簡(jiǎn)易使用手冊(cè)介紹沖突問題中關(guān)于手工合并沖突。第一次嘗試解決沖突讓人感覺很害怕,但經(jīng)過一點(diǎn)訓(xùn)練,它簡(jiǎn)單的像是騎著車子下坡。
這里一個(gè)簡(jiǎn)單的例子,由于不良的交流,你和同事Sally,同時(shí)編輯了sandwich.txt。Sally提交了修改,當(dāng)你準(zhǔn)備更新你的版本,沖突發(fā)生了,我們不得不去修改sandwich.txt來解決這個(gè)問題。首先,看一下這個(gè)文件:
$catsandwich.txtToppieceofbreadMayonnaiseLettuceTomatoProvolone<<<<<<<.mineSalamiMortadellaProsciutto=======SauerkrautGrilledChicken>>>>>>>.r2CreoleMustardBottompieceofbread
小于號(hào)、等于號(hào)和大于號(hào)串是沖突標(biāo)記,并不是沖突的數(shù)據(jù),你一定要確定這些內(nèi)容在下次提交之前得到刪除,前兩組標(biāo)志中間的內(nèi)容是你在沖突區(qū)所做的修改:
<<<<<<<.mineSalamiMortadellaProsciutto=======
后兩組之間的是Sally提交的修改沖突:
=======SauerkrautGrilledChicken>>>>>>>.r2
通常你并不希望只是刪除沖突標(biāo)志和Sally的修改—當(dāng)她收到三明治時(shí),會(huì)非常的吃驚。所以你應(yīng)該走到她的辦公室或是拿起電話告訴Sally,你沒辦法從從意大利熟食店得到想要的泡菜。[5]一旦你們確認(rèn)了提交內(nèi)容后,修改文件并且刪除沖突標(biāo)志。
ToppieceofbreadMayonnaiseLettuceTomatoProvoloneSalamiMortadellaProsciuttoCreoleMustardBottompieceofbread
現(xiàn)在運(yùn)行svnresolved,你已經(jīng)準(zhǔn)備好提交了:
$svnresolvedsandwich.txt$svncommit-m"Goaheadandusemysandwich,discardingSally'sedits."
記住,如果你修改沖突時(shí)感到混亂,你可以參考subversion生成的三個(gè)文件—包括你未作更新的文件。你也可以使用第三方的合并工具檢驗(yàn)這三個(gè)文件。
拷貝覆蓋你的工作文件
SVN簡(jiǎn)易使用手冊(cè)介紹中如何拷貝覆蓋你的工作文件。如果你只是希望取消你的修改,你可以僅僅拷貝Subversion為你生成的文件替換你的工作拷貝:
$svnupdateCsandwich.txtUpdatedtorevision2.$lssandwich.*sandwich.txtsandwich.txt.minesandwich.txt.r2sandwich.txt.r1$cpsandwich.txt.r2sandwich.txt$svnresolvedsandwich.txt
下注:使用svnrevert
如果你得到?jīng)_突,經(jīng)過檢查你決定取消自己的修改并且重新編輯,你可以恢復(fù)你的修改:
$svnrevertsandwich.txtReverted'sandwich.txt'$lssandwich.*sandwich.txt
注意,當(dāng)你恢復(fù)一個(gè)沖突的文件時(shí),不需要再運(yùn)行svnresolved。
現(xiàn)在我們準(zhǔn)備好提交修改了,注意svnresolved不像我們本章學(xué)過的其他命令一樣需要參數(shù),在任何你認(rèn)為解決了沖突的時(shí)候,只需要小心運(yùn)行svnresolved,—一旦刪除了臨時(shí)文件,Subversion會(huì)讓你提交這文件,即使文件中還存在沖突標(biāo)記。
提交你得修改
最后!SVN簡(jiǎn)易使用手冊(cè)介紹中你的修改結(jié)束了,你合并了服務(wù)器上所有的修改,你準(zhǔn)備好提交修改到版本庫(kù)。
svncommit命令發(fā)送所有的修改到版本庫(kù),當(dāng)你提交修改時(shí),你需要提供一些描述修改的日志信息,你的信息會(huì)附到這個(gè)修訂版本上,如果信息很簡(jiǎn)短,你可以在命令行中使用--message(-m)選項(xiàng):
$svncommit--message"Correctednumberofcheeseslices."Sendingsandwich.txtTransmittingfiledata.Committedrevision3.
然而,如果你把寫日志信息當(dāng)作工作的一部分,你也許會(huì)希望通過告訴Subversion一個(gè)文件名得到日志信息,使用--file選項(xiàng):
$svncommit--filelogmsgSendingsandwich.txtTransmittingfiledata.Committedrevision4.
如果你沒有指定--message或者--file選項(xiàng),Subversion會(huì)自動(dòng)地啟動(dòng)你最喜歡的編輯器(見“config”一節(jié)的editor-cmd部分)來編輯日志信息。
提示
如果你使用編輯器撰寫日志信息時(shí)希望取消提交,你可以直接關(guān)掉編輯器,不要保存,如果你已經(jīng)做過保存,只要簡(jiǎn)單的刪掉所有的文本并再次保存。
$svncommitWaitingforEmacs...DoneLogmessageunchangedornotspecifieda)bort,c)ontinue,e)dita$
版本庫(kù)不知道也不關(guān)心你的修改作為一個(gè)整體是否有意義,它只檢查是否有其他人修改了同一個(gè)文件,如果別人已經(jīng)這樣做了,你的整個(gè)提交會(huì)失敗,并且提示你一個(gè)或多個(gè)文件已經(jīng)過時(shí)了:$svncommit--message"Addanotherrule"Sendingrules.txtsvn:Commitfailed(detailsfollow):svn:Outofdate:'rules.txt'intransaction'g'
此刻,你需要運(yùn)行svnupdate來處理所有的合并和沖突,然后再嘗試提交。
我們已經(jīng)覆蓋了Subversion基本的工作周期,還有許多其它特性可以管理你得版本庫(kù)和工作拷貝,但是只使用前面介紹的命令你就可以很輕松的工作了。
--------------------------------------------------------------------------------
[2]當(dāng)然沒有任何東西是在版本庫(kù)里被刪除了—只是在版本庫(kù)的HEAD里消失了,你可以通過檢出(或者更新你的工作拷貝)你做出刪除操作的前一個(gè)修訂版本來找回所有的東西。
[3]Subversion使用內(nèi)置區(qū)別引擎,缺省情況下輸出為統(tǒng)一區(qū)別格式。如果你期望不同的輸出格式,你可以使用--diff-cmd指定外置的區(qū)別程序,并且通過--extensions傳遞其他參數(shù),舉個(gè)例子,察看本地文件foo.c的區(qū)別,同時(shí)忽略空格修改,你可以運(yùn)行svndiff--diff-cmd/usr/bin/diff--extensions'-bc'foo.c。
[4]你也可以手工的刪除這三個(gè)臨時(shí)文件,但是當(dāng)Subversion會(huì)給你做時(shí)你會(huì)自己去做嗎?我們是這樣想的。
[5]如果你向他們?cè)儐?,他們非常有理由把你帶到城外的鐵軌上。本節(jié)關(guān)于SVN簡(jiǎn)易使用手冊(cè)中SVN沖突問題講解完畢。
【編輯推薦】