svn update 沒有效果 孕似; svn update 無法覆蓋本地文件
一般情況下公司里的所有人都會叫你在別人修改完成時户敬,使用update來將版本庫的代碼同步進(jìn)來。這沒有錯射富。但是用過github的人都不是很理解這個命令费变,因為在git中有commit + push
和checkout + pull
來分別提交和下拉版本庫,而自己的文檔一般都是在分支下完成漆撞。
殴泰!此時如果初學(xué)者,例如我浮驳,單純地把update
理解為checkout
的話(實際上用法很類似:费础!)抹恳,你將付出一定的代價。解釋在下文署驻,伸手黨直接跳轉(zhuǎn) 結(jié)論奋献。
假設(shè)在電腦1提交一個文件如下:
test
abc
svn commit -m 'first commit'
#假設(shè)此時版本為 1
當(dāng)你在另外一臺電腦2上,co 進(jìn)來時文件內(nèi)容應(yīng)當(dāng)是一樣的
此時電腦1上做修改:
test
abc
computer1 add
并且同時在電腦2上做修改:
test
computer2 add
abc
ok, 萬事妥當(dāng)旺上,當(dāng)電腦1提交commit -m 'second commit #假設(shè)此時版本為 2'
此時瓶蚂,電腦2上 進(jìn)行update
會出現(xiàn)一個 G 表示版本庫文件與本地文件有沖突,但是svn已經(jīng)幫你解決
電腦2的文件是這個樣子的:
test
computer2 add
abc
computer1 add
也就是說宣吱,update
并不會覆蓋你本地的工作目錄窃这,此時電腦上的結(jié)果是svn 還有 diff 但是版本已經(jīng)成為 2 ,這就是很多人update了但沒有效果的實際例子征候。
那么經(jīng)過查看文檔和多方驗證得出以下結(jié)論杭攻。
<a id="jump" name="jump">結(jié)論</a>
svn update
是這樣計算的
- 當(dāng)你的文件處于最新版本,且文件內(nèi)的修改 新于 版本時間疤坝,那么
update
將無效(沒有任何效果) - 當(dāng)你的文件處于非最新版本兆解,且有修改內(nèi)容 與 版本庫不沖突(或者
svn
可以解決的沖突)update
能夠正常使用,而且保留你的修改內(nèi)容跑揉,并使得版本庫的修改也更新進(jìn)來锅睛〔壕蓿回到 1 狀態(tài) - 當(dāng)你的文件處于非最新版本,且沖突無法解決现拒,
svn
返回 C 也就是沖突狀態(tài)辣垒,那么你就默默解決沖突吧
可見事實上,svn update
的其實是為了保護(hù)你本地修改而做的先一步merge印蔬,這個是用git的同學(xué)無法簡單理解的(就像我一樣)勋桶,因為其實svn事實上沒有分支的概念,分支也只是另開一個文件夾扛点,可以理解為輔主分支哥遮,所有人都是在輔主分支上干活,所以每次update的是別人的代碼陵究,自己的工作區(qū)一定不能被覆蓋或者拋棄眠饮。
但git 的思路其實是不一樣的,每個人都有自己的分支(真分支)做完以后merge到主干(無論是輔主干還是真主干)所以每次我們需要做的僅僅是把自己的分支內(nèi)容 checkout 到自己的工作區(qū)铜邮,沒有svn 那種問題仪召。并且我會在本地做一些log 或者簡單的測試代碼,用完即刪的那種松蒜,測完了扔茅,就可以checkout,so happy秸苗。保證自己的工作區(qū)或者版本庫是干凈的召娜。但是svn 用久了就會發(fā)現(xiàn)本地工作區(qū)很亂,有時候commit的時候都會把一些奇怪的測試代碼(提交前你沒仔細(xì)diff的話)一并交上去惊楼。要扯到 ignore 和 ci 方式上去了玖瘸,打住。
結(jié)束語
那么如果真的你需要覆蓋本地文件的話怎么辦呢檀咙?一種是刪除再 update
雅倒,另一種是revert
命令』】桑可以將本地文件和版本庫文件真正同步成一模一樣蔑匣。