SVN分支與合并中修改問題專家詳解
本節(jié)接著上節(jié)繼續(xù)向大家簡單介紹一下SVN分支與合并問題,主要內(nèi)容有SVNmerge用法取消修改,SVN與修改集以及如何找回刪除的項目等,希望本文的介紹對大家的學(xué)習(xí)有所幫助。下面是SVN分支與合并具體介紹。
取消修改
SVNmerge另一個常用的做法是取消已經(jīng)做得提交,假設(shè)你愉快的在/calc/trunk工作,你發(fā)現(xiàn)303版本對integer.c的修改完全錯了,它不應(yīng)該被提交,你可以使用svnmerge來“取消”這個工作拷貝上所作的操作,然后提交本地修改到版本庫,你要做得只是指定一個相反的區(qū)別。(你可以通過指定--revision303:302--change-303
$svnmerge-c-303http://svn.example.com/repos/calc/trunk
Uinteger.c
$svnstatus
Minteger.c
$svndiff…
#verifythatthechangeisremoved…
$svncommit-m"Undoingchangecommittedinr303."
Sendinginteger.c
Transmittingfiledata.
Committedrevision350.
我們可以把版本庫修訂版本想象成一組修改(一些版本控制系統(tǒng)叫做修改集),通過-r選項,你可以告訴svnmerge來應(yīng)用修改集或是一個修改集范圍到你的工作拷貝,在我們的情況例子里,我們使用svnmerge合并修改集#303到工作拷貝。SVN分支與合并中取消修改問題介紹完了,我們再來看一下SVN與修改集的問題。
SVN與修改集
每一個人對于“修改集”的概念都有些不一樣,至少對于版本控制系統(tǒng)的“修改集特性”這一概念有著不同的期望,根據(jù)我們的用途,可以說修改集只是一個有***名字的一系列修改集合,修改也許包括文件內(nèi)容的修改,目錄樹結(jié)構(gòu)的修改,或是元數(shù)據(jù)的調(diào)整,更通常的說法,一個修改集就是我們可以引用的有名字的補丁。
在SVN里,一個全局的修訂版本號N標(biāo)示一個版本庫中的樹:它代表版本庫在N次提交后的樣子,它也是一個修改集的隱含名稱:如果你比較樹N與樹N-1,你可以得到你提交的補丁。出于這個原因,想象“版本N”并不只是一棵樹,也是一個修改集。如果你使用一個問題追蹤工具來管理bug,你可以使用版本號來表示特定的補丁修正了bug—舉個例子,“這個問題是在版本9238修正的”,然后其他人可以運行svnlog-r9238來查看修正這個bug的修改集,或者使用svndiff-r9237:9238來看補丁本身。SVN的合并命令也使用版本號作為參數(shù),可以將特定修改集從一個分支合到另一個分支:svnmerge-r9237:9238將會合并修改集#9238到本地拷貝。記住回滾修改和任何一個svnmerge命令都一樣,所以你應(yīng)該使用svnstatus或是svndiff來確定你的工作處于期望的狀態(tài)中,然后使用svncommit來提交,提交之后,這個特定修改集不會反映到HEAD版本了。
繼續(xù),你也許會想:好吧,這不是真的取消提交吧!是吧?版本303還依然存在著修改,如果任何人取出calc的303-349版本,他還會得到錯誤的修改,對吧?
是的,這是對的。當(dāng)我們說“刪除”一個修改時,我們只是說從HEAD刪除,原始的修改還保存在版本庫歷史中,在多數(shù)情況下,這是足夠好的。大多數(shù)人只是對追蹤HEAD版本感興趣,在一些特定情況下,你也許希望毀掉所有提交的證據(jù)(或許某個人提交了一個秘密文件),這不是很容易的,因為SVN設(shè)計用來不丟失任何信息,每個修訂版本都是依賴其它修訂版本的不可變目錄樹,從歷史刪除一個版本會導(dǎo)致多米諾效應(yīng),會在后面的版本導(dǎo)致混亂甚至?xí)绊懰械墓ぷ骺截悺22]
找回刪除的項目
SVN分支與合并介紹一下如何找回刪除的項目。版本控制系統(tǒng)非常重要的一個特性就是它的信息從不丟失,即使當(dāng)你刪除了文件或目錄,它也許從HEAD版本消失了,但這個對象依然存在于歷史的早期版本,一個新手經(jīng)常問到的問題是“怎樣找回我的文件和目錄?”。
***步首先要知道需要拯救的項目是什么,這里有個很有用的比喻:你可以認為任何存在于版本庫的對象生活在一個二維的坐標(biāo)系統(tǒng)里,***維是一個特定的版本樹,第二維是在樹中的路徑,所以你的文件或目錄的任何版本可以通過這樣一對坐標(biāo)定義。(記住常見的“peg修訂版本”語法—foo.c@224—在前面的“Peg和實施修訂版本”一節(jié)提到過。)
首先,你需要svnlog來察看你需要找回的坐標(biāo)對,一個好的策略是使用svnlog--verbose來察看包含刪除項目的目錄,--verbose選項顯示所有改變的項目的每一個版本,你只需要找出你刪除文件或目錄的那一個版本。你可以通過目測找出這個版本,也可以使用另一種工具來檢查日志的輸出(通過grep或是在編輯器里增量查找)。
$cdparent-dir
$svnlog-v…
------------------------------------------------------------------------
r808|joe|2003-12-2614:29:40-0600(Fri,26Dec2003)|3lines
Changedpaths:
D/calc/trunk/real.c
M/calc/trunk/integer.c
Addedfastfouriertransformfunctionstointeger.c.
Removedreal.cbecausecodenowindouble.c.…
在這個例子里,你可以假定你正在找已經(jīng)刪除了的文件real.c,通過查找父目錄的歷史,你知道這個文件在808版本被刪除,所以存在這個對象的版本在此之前。結(jié)論:你想從版本807找回/calc/trunk/real.c。
以上是最重要的部分—重新找到你需要恢復(fù)的對象。現(xiàn)在你已經(jīng)知道該恢復(fù)的文件,而你有兩種選擇。
一種是對版本反向使用svnmerge到808(我們已經(jīng)學(xué)會了如何取消修改,見“取消修改”一節(jié)),這樣會重新添加real.c,這個文件會列入增加的計劃,經(jīng)過一次提交,這個文件重新回到HEAD。
在這個例子里,這不是一個好的策略,這樣做不僅把real.c加入添加到計劃,也取消了對integer.c的修改,而這不是你期望的。確實,你可以恢復(fù)到版本808,然后對integer.c執(zhí)行取消svnrevert操作,但這樣的操作無法擴大使用,因為如果從版本808修改了90個文件怎么辦?
所以第二個方法不是使用svnmerge,而是使用svncopy命令,精確的拷貝版本和路徑“坐標(biāo)對”到你的工作拷貝:
$svncopy-r807\
http://svn.example.com/repos/calc/trunk/real.c./real.c
$svnstatus
A+real.c
$svncommit-m"Resurrectedreal.cfromrevision807,/calc/trunk/real.c."
Addingreal.c
Transmittingfiledata.
Committedrevision1390.
加號標(biāo)志表明這個項目不僅僅是計劃增加中,而且還包含了歷史,SVN記住了它是從哪個拷貝過來的。在將來,對這個文件運行svnlog會看到這個文件在版本807之前的歷史,換句話說,real.c不是新的,而是原先刪除的那一個的后代。盡管我們的例子告訴我們?nèi)绾握一匚募瑢τ诨謴?fù)刪除的目錄也是一樣的。本節(jié)關(guān)于SVN分支與合并問題介紹完畢。
【編輯推薦】