A. windows 怎麼用svn命令
1、Windows下命令行工具:
發現原來安裝的tortoisesvn已經集成到shell中,不能在命令行下使用。
下載Apache Subversion command line tools,這是一個可以在cmd下使用的命令行工具,解壓後把裡面bin目錄這個路徑添加到環境變數的path,這樣在cmd下就可以使用了,和linux下使用svn的習慣一樣了。
目錄約定:
/trunck:開發主線
/branches:支線副本
/tags:標簽副本(一旦創建,不允許修改)
1)使用trunk作為主要的開發目錄
一般的,我們的所有的開發都是基於trunk進行開發,當一個版本(release)開發告一段落(開發、測試、文檔、製作安裝程序、打包等結束後),代碼處於凍結狀態(人為規定,可以通過hook來進行管理)。此時應該基於當前凍結的代碼庫,打tag。
當下一個版本/階段的開發任務開始時,繼續在trunk進行開發。此時,如果發現了上一個已發行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在開發的版本(Developing Version)無法滿足時間要求,這時候就需要在上一個版本上進行修改了。解決方法是基於發行版對應的tag,做相應的分支(branch)進行開發。
2)下圖為struts2的SVN倉庫目錄:
3、常用命令
svn help
svn --version
svn --version --quiet 只顯示版本號
svn checkout 地址
svn add 文件或者文件夾 增加本地數據到伺服器
svn commit / svn ci -m 「注釋」 文件名 提交代碼,要先add才commit
svn update / svn up不必跟特定的文件或目錄,也可以自己指定需要更新的文件或目錄。每次commit或者改動之前最好更新一下。
svn log
svn delete 文件名
svn resolve 路徑 --accept working 解決沖突
http://zccst.iteye.com/blog/1765519
svn switch 遠程路徑 版本切換
svn list路徑/svn ls 列出版本庫下的文件和目錄
svn merge -r m:n 路徑 合並文件,從版本號m到版本號n的遠程分支都合並到當前分支中
svn info 確認工作目錄的svn信息
svn diff -r m:n 路徑 對版本m和版本n比較差異
svn cleanup 為失敗的失誤清場
svn status -v 在本地進行代碼修改,檢查修改狀態
svn import 遠程路徑 --message 「message」 將當前路徑下文件導入到版本庫中
svn export 遠程路徑 導出一份干凈的項目
svn move/ svn mv 原文件名 新文件名 重命名
svn mkdir 文件名
svn / svn cp 源文件路徑 新文件路徑
svn revert 文件名 只能恢復未提交之前的操作
若要還原已提交的改動:只能用舊文件覆蓋新文件。操作如下:
1)sun up 讓本地工作拷貝更新到最新狀態
2)svn log your_file_path 查看文件日誌,這時候提交時填寫的說明信息就派上用場了
3)svn diff -r 舊修訂版序號:新修訂版序號 your_file_path 查看兩個修訂版之間的不同。
4)決定用哪個舊的修訂版號後,用舊的修訂版號文件覆蓋新的修訂版號文件。svn merge -r 新修訂版序號:舊修訂版序號 your_file_path
5)svn commit -m "恢復到某修訂版(某修訂版作廢)"
本地的版本叫做working
4、關於merge
branch主要用於新功能的開發
合並發生在本地working ,只要你不提交就不會影響到repository
合並前一定要先update、commit,保證不會out of day,並將本地的修改保存到repository
branch和trunk並行開發的過程中,要經常同步,將trunk的修改合並到branch,合並時選擇"Merge a range of revision"
branch最後合並回trunk時,merge type選擇"Reintegrate a branch"
不管是從trunk合並到branch還是最終從branch合並回trunk,在每次合並前最好先update,然後將本地的修改先全部commit,保護好現場,萬一合並不理想隨時都可以reverthttp://blog.csdn.net/eggcalm/article/details/6606520
http://zhengkun.readthedocs.org/zh_CN/latest/2014/02/07/svn-usage/
5、關於解決沖突
發生沖突之後會出現三個臨時文件:
XXX.mine XXX.r1 XXX.r2
一旦解決了沖突,需用svn resolved讓subversion知道,這樣就會刪除這三個臨時文件,沖突狀態解決。
三種解決方式:
手工合並沖突:需要將沖突標志刪除
用某一個臨時文件覆蓋自己的工作文件
用svn revert 放棄本地修改,不需要執行resolved
B. svn 命令行怎麼解決沖突
工程師A修改了a.txt的第一行,提交了。
工程師B也修改了a.txt的第一行,然後執行svn up,這時SVN提示了:(以下,你開始扮演工程師B的角色了)
$ svn up
在 「a.txt」 中發現沖突。
選擇: (p) 推遲,(df) 顯示全部差異,(e) 編輯,
(mc) 我的版本, (tc) 他人的版本,
(s) 顯示全部選項:
我一般選擇p(推遲),即引入沖突到本地,不過不會影響到SVN伺服器端,可以放心。
OK,開始解決沖突了。
這時,會生成幾個文件:
a.txt a.txt.mine a.txt.r6328 a.txt.r6336
其中a.txt中包含了工程師A、B的所有修改,以<<<<<<<、=======、>>>>>>>分隔。
a.txt.mine是工程師B的修改,也就是未update前的a.txt。
a.txt.r6328 是工程師A提交前的版本,即未導致沖突的版本。
a.txt.r6336是工程師A提交後的版本,即導致沖突的版本。
一般,查看a.txt就可以看到沖突的詳情了:
[yicheng@chengyi svntest]$ cat a.txt
<<<<<<< .mine
i also modify ,agndagnagasdg;
=======
i modify this line;
>>>>>>> .r6336
以上,<<<<<<< .mine和=======之間是工程師B(當前的「你」)修改的內容,=======與>>>>>>> .r6336之間是工程師A修改的內容。這時,最好的辦法是,叫上工程師A,你們一起確定這些修改是否都需要,是否相互兼容,然後留下需要的部分,刪 除<<<<<<< .mine、=======和>>>>>>> .r6336。
然後,測試,測試!確定沒問題之後,就可以告訴SVN,你解決沖突了:
svn resolve –accept working a.txt (該命令會刪除a.txt.mine a.txt.r6328 a.txt.r6336)
svn ci -m 』some comment』 a.txt
這里需要注意的是,a.txt.mine a.txt.r6328 a.txt.r6336這幾個文件的存在代表著有沖突產生。如果不解決沖突,就手工刪除它們,SVN伺服器也會很傻的認為你解決了沖突,允許你繼續之後 的工作。但是,沖突依舊存在,你的a.txt中不但有別人的修改,還有那些討厭的<=>符號。
在沖突未解決前,試圖提交代碼是肯定會失敗的:
$ svn ci -m 」
svn: 提交失敗(細節如下):
svn: 提交終止: 「/path/to/svntest/a.txt」 處於沖突狀態
在使用svn update 的時候,會出現如下一些信息:
$ svn update
U INSTALL
G README
C bar.c
Updated to revision 46.
那麼,U 開頭的信息提示你,這個文件在你本地沒有修改過,文件已經根據版本庫的新版本更新了。G 開頭的信息提示你,這個文件在你本地已經修改過,但是和版本庫中對應的版本並沒有沖突的地方,svn已經合並更新了。而C 開頭的信息提示你,這個文件有點麻煩,你在本地的修改和版本庫中的版本修改的地方重疊了,也就是說,你修改了某一行,你的同事也修改了同一行。這個就需要你自己手工去解決了。當沖突發生時,要注意到有三件事情可以幫助你解決問題。
C. svn eclipce怎麼解決沖突
在項目上右鍵選擇team-與資源庫同步
打開如下的界面,team synchronizing模式下的synchronize界面下,如果有紅色的標示,標明內容沖突了
雙擊打開紅色標示的文件,左邊為你本機的版本,右邊為最新的版本。如果內容沒有紅色的標示,就是內容不沖突,可以先更新,後提交。但是有紅色的時候就是內容有沖突,根據紅色提示先還原本機的紅色的部分,更新後再提交
紅色的部分處理完之後,藍色的為需要更新的內容,右鍵更新就可以了,也可以雙擊查看內容
灰色的為需要提交的內容,右鍵提交就可以了
提交的內容中有些文件時不用提交的,是本機的環境配置的文件,提交了會影響其他同事
D. 同步svn,xib有沖突怎麼解決
很簡單,先把文件拷貝到本地,然後右鍵點沖突的文件,找到svn中的還原,然後再把你本地剛剛拷貝的那個文件和svn上的文件對比,然後看你修改了那些地方,然後再svn上最新版本的基礎上進行修改,然後提交。
如果你不想別人也修改你正在修改的文件,你可以在修改前直接鎖定那個文件,直到你提交以後再解鎖。這就不會沖突了
E. svn出現黃色感嘆號怎麼辦
如果您是指電腦寬頻網路連接圖標出現黃色嘆號導致無法上網,一般是由於IP地址沖突導致,建議您可打開【網路共享中心】,選擇【更改適配器設置】,右鍵本地連接屬性,雙擊ipv4,選擇自動獲取ip,然後打開【運行】,輸入CMD,在命令提示符下輸入【ipconfig\new】重新獲取ip地址嘗試。
F. svn 命令行怎麼解決沖突
1.svn ci -m "update"
svn: Commit failed (details follow):
svn: Aborting commit: 'test.log' remains in conflict
2.使用svn resolved test.log
3.svn ci -m "update"
這個時候應該可以提交了
4.svn rm test.log
刪除掉這個文件
5.svn ci -m "update"
再次提交
這個時候伺服器上就沒有這個文件了。
在其他的伺服器終端上如果遇到這個問題的時候重復這個操作。
G. 更新本地文件到SVN中時有沖突如何解決
有沖突一般是可能本地與主SVN伺服器都修改了同一處地方。
解決方法,可先把本地的沖突文件刪除掉,再重新從SVN更新下來到本地。然後你再修改提交,應該就沒有問題了。
所以SVN協同工作時 一定要養成先更新 再提交的好習慣。希望可以幫到你。
H. svn 詳解
1、檢出
svncohttp://路徑(目錄或文件的全路徑)[本地目錄全路徑]
--username 用戶名 --password 密碼svncosvn://路徑(目錄或文件的全路徑)[本地目錄全路徑]--username 用戶名 --password 密碼
svncheckouthttp://路徑(目錄或文件的全路徑)[本地目錄全路徑] --username用戶名
svncheckoutsvn://路徑(目錄或文件的全路徑)[本地目錄全路徑]--username用戶名
註:如果不帶--password 參數傳輸密碼的話,會提示輸入密碼,建議不要用明文的--password 選項。
其中 username 與 password前是兩個短線,不是一個。
不指定本地目錄全路徑,則檢出到當前目錄下。
例子:
svn co svn://localhost/測試工具/home/testtools--usernamewzhnsc
svn co http://localhost/test/testapp--usernamewzhnsc
svn checkout svn://localhost/測試工具/home/testtools--usernamewzhnsc
svncheckouthttp://localhost/test/testapp--usernamewzhnsc
2 、 導出(導出一個干凈的不帶.svn文件夾的目錄樹 )
svnexport[-r 版本號]http://路徑(目錄或文件的全路徑) [本地目錄全路徑]--username用戶名
svnexport[-r 版本號]svn://路徑(目錄或文件的全路徑) [本地目錄全路徑]--username用戶名
svnexport本地檢出的(即帶有.svn文件夾的)目錄全路徑要導出的本地目錄全路徑
註:第一種從版本庫導出干凈工作目錄樹的形式是指定URL,
如果指定了修訂版本號,會導出相應的版本,
如果沒有指定修訂版本,則會導出最新的,導出到指定位置。
如果省略本地目錄全路徑,URL的最後一部分會作為本地目錄的名字。
第二種形式是指定 本地檢出的目錄全路徑 到 要導出的本地目錄全路徑,所有的本地修改將會保留,
但是不在版本控制下(即沒提交的新文件,因為.svn文件夾里沒有與之相關的信息記錄)的文件不會拷貝。
例子:
svn export svn://localhost/測試工具/home/testtools--usernamewzhnsc
svn export svn://localhost/test/testapp--usernamewzhnsc
svn export /home/testapp/home/testtools
3、添加新文件
svnadd文件名
註:告訴SVN伺服器要添加文件了,還要用svn commint -m真實的上傳上去!
例子:
svn addtest.php<-添加test.php
svn commit -m「添加我的測試用test.php「 test.php
svn add*.php<-添加當前目錄下所有的php文件
svn commit -m「添加我的測試用全部php文件「 *.php
4、提交
svncommit-m「提交備注信息文本「[-N][--no-unlock]文件名
svnci-m「提交備注信息文本「[-N][--no-unlock]文件名
必須帶上-m參數,參數可以為空,但是必須寫上-m
例子:
svn commit -m「提交當前目錄下的全部在版本控制下的文件「 *<-注意這個*表示全部文件
svn commit -m「提交我的測試用test.php「 test.php
svn commit -m「提交我的測試用test.php「-N --no-unlocktest.php<-保持鎖就用–no-unlock開關
svn ci -m「提交當前目錄下的全部在版本控制下的文件「 *<-注意這個*表示全部文件
svn ci -m「提交我的測試用test.php「 test.php
svn ci -m「提交我的測試用test.php「-N --no-unlocktest.php<-保持鎖就用–no-unlock開關
5、更新文件
svnupdate
svnupdate-r修正版本文件名
svnupdate文件名
例子:
svn update<- 後面沒有目錄,默認將當前目錄以及子目錄下的所有文件都更新到最新版本
svn update -r200 test.cpp<-將版本庫中的文件 test.cpp 還原到修正版本(revision)200
svn updatetest.php<-更新與版本庫同步。
提交的時候提示過期沖突,需要先 update 修改文件,
然後清除svn resolved,最後再提交commit。
6、刪除文件
svndeletesvn://路徑(目錄或文件的全路徑) -m 「刪除備注信息文本」
推薦如下操作:
svndelete文件名
svnci-m「刪除備注信息文本」
例子:
svn delete svn://localhost/testapp/test.php-m「刪除測試文件test.php」
推薦如下操作:
svn deletetest.php
svn ci -m「刪除測試文件test.php」
7、加鎖/解鎖
svnlock-m「加鎖備注信息文本「[--force]文件名
svnunlock文件名
例子:
svn lock -m「鎖信測試用test.php文件「 test.php
svn unlocktest.php
8、比較差異
svndiff文件名
svndiff-r修正版本號m:修正版本號n文件名
例子:
svn difftest.php<-將修改的文件與基礎版本比較
svn diff -r200:201 test.php<-對 修正版本號200 和 修正版本號201 比較差異
9、查看文件或者目錄狀態
svn st目錄路徑/名
svn status 目錄路徑/名<-目錄下的文件和子目錄的狀態,正常狀態不顯示
【?:不在svn的控制中;M:內容被修改;C:發生沖突;
A:預定加入到版本庫;K:被鎖定】
svn-v 目錄路徑/名
svn status -v 目錄路徑/名<-顯示文件和子目錄狀態
【第一列保持相同,第二列顯示工作版本號,
第三和第四列顯示最後一次修改的版本號和修改人】
註:svn status、svn diff和 svn revert這三條命令在沒有網路的情況下也可以執行的,
原因是svn在本地的.svn中保留了本地版本的原始拷貝。
10、查看日誌
svnlog文件名
例子:
svn logtest.php<-顯示這個文件的所有修改記錄,及其版本號的變化
11、查看文件詳細信息
svninfo文件名
例子:
svn infotest.php
12、SVN 幫助
svnhelp<-全部功能選項
svnhelpci<- 具體功能的說明
13、查看版本庫下的文件和目錄列表
svnlistsvn://路徑(目錄或文件的全路徑)
svnlssvn://路徑(目錄或文件的全路徑)
例子:
svn list svn://localhost/test
svn ls svn://localhost/test<-顯示svn://localhost/test目錄下的所有屬於版本庫的文件和目錄
14、創建納入版本控制下的新目錄
svnmkdir目錄名
svnmkdir-m"新增目錄備注文本"http://目錄全路徑
例子:
svn mkdirnewdir
svn mkdir -m"Making a new dir."svn://localhost/test/newdir
註:添加完子目錄後,一定要回到根目錄更新一下,不然在該目錄下提交文件會提示「提交失敗」
svn update
註:如果手工在checkout出來的目錄里創建了一個新文件夾newsubdir,
再用svn mkdirnewsubdir命令後,SVN會提示:
svn: 嘗試用 「svn add」或 「svn add --non-recursive」代替?
svn: 無法創建目錄「hello」: 文件已經存在
此時,用如下命令解決:
svn add --non-recursivenewsubdir
在進入這個newsubdir文件夾,用ls -a查看它下面的全部目錄與文件,會發現多了:.svn目錄
再用 svn mkdir -m "添hello功能模塊文件" svn://localhost/test/newdir/newsubdir 命令,
SVN提示:
svn: File already exists: filesystem '/data/svnroot/test/db', transaction '4541-1',
path '/newdir/newsubdir '
15、恢復本地修改
svnrevert[--recursive]文件名
注意: 本子命令不會存取網路,並且會解除沖突的狀況。但是它不會恢復被刪除的目錄。
例子:
svn revertfoo.c<-丟棄對一個文件的修改
svn revert --recursive.<-恢復一整個目錄的文件,. 為當前目錄
16、把工作拷貝更新到別的URL
svnswitchhttp://目錄全路徑本地目錄全路徑
例子:
svn switch http://localhost/test/456 .<- (原為123的分支)當前所在目錄分支到localhost/test/456
17、解決沖突
svnresolved[本地目錄全路徑]
例子:
$ svn update
C foo.c
Updated to revision 31.
如果你在更新時得到沖突,你的工作拷貝會產生三個新的文件:
$ ls
foo.c
foo.c.mine
foo.c.r30
foo.c.r31
當你解決了foo.c的沖突,並且准備提交,運行svn resolved讓你的工作拷貝知道你已經完成了所有事情。
你可以僅僅刪除沖突的文件並且提交,但是svn resolved除了刪除沖突文件,還修正了一些記錄在工作拷貝管理區域的記錄數據,所以我們推薦你使用這個命令。
18、不checkout而查看輸出特定文件或URL的內容
svncathttp://文件全路徑
例子:
svn cat http://localhost/test/readme.txt
19、新建一個分支
svn branchA branchB-m "make B branch" // 從branchA拷貝出一個新分支branchB
20、合並內容到分支merge
svn mergebranchA branchB// 把對branchA的修改合並到分支branchB
I. svn如何解決分支沖突
1、 如何產生沖突
當開發人員A和開發人員B從版本庫同時檢出文檔1.txt,而A和B同時修改了1.txt的同一地方,後提交的一方會在拷貝副本中產生沖突。
兩個工作拷貝,A拷貝中文件1.txt內容為
dfqerq
123dfwre
B拷貝中文件1.txt內容為
dfqerq
123erwrq
在B版本提交之前版本庫上的1.txt(base版本)內容為
dfqerq
B拷貝先提交版本到版本庫中,以至於最新版本內容變為
dfqerq
123erwrq
此時A版本也提交則會產生沖突,無法提交,需要先svn
update,此時會在A拷貝中產生三個臨時文件1.txt.rNew\1.txt.rOld\1.txt.mine,其中1.txt.rNew是最新版
本,1.txt.rOld是base版本,1.txt.mine是A作者修改後的版本,在此例中內容為
dfqerq
123dfwre
而update之後A拷貝中的1.txt內容為
<<<<<<< .mine
dfqerq
123dfwre=======
dfqerq
123erwrq>>>>>>> .r18
其中<<<<<<< .mine與=======之間表示A修改後的內容,=======與>>>>>>> .r18之間是版本伺服器上的版本
2、解決沖突
第一種,利用update的選項進行沖突解決,也就是說不管當前拷貝副本是否是最新版本,都使用—accept參數作為沖突處理方式
–accept ARG : specify automatic conflict resolution action
(『postpone』, 『base』, 『mine-conflict』,
『theirs-conflict』, 『mine-full』, 『theirs-full』,
『edit』, 『launch』)
(p) postpone – mark the conflict to be resolved later //讓文件在更新完成之後保持沖突狀態。
(df) diff-full – show all changes made to merged file //使用標准區別格式顯示base修訂版本和沖突文件本身的區別。
(e) edit – change merged file in an editor //用你喜歡的編輯器打開沖突的文件,編輯器是環境變數EDITOR設置的。
(r) resolved – accept merged version of file //完成文件編輯之後,通知svn你已經解決了文件的沖突,它必須接受當前的內容—從本質上講就是你已經「解決了」沖突。
(mf) mine-full – accept my version of entire file (ignore their change//丟棄新從伺服器接收的變更,並只使用你查看文件的本地修改。
(tf) theirs-full – accept their version of entire file (lose my changes)//丟棄你對查看文件的本地修改,只使用從伺服器新接收的變更。
(l) launch – launch external tool to resolve conflict//啟動一個外置程序來執行沖突解決,這需要一些預先的准備。
(h) help – show this list //顯示所有在沖突解決時可能使用的命令。
第二種,在update時並不處理沖突,利用svn resolve解決沖突
1、利用svn resolve –accept base選擇base版本,即1.txt.rOld作為最後提交的版本
–accept ARG : specify automatic conflict resolution source
(『base』, 『working』, 『mine-conflict』,
『theirs-conflict』, 『mine-full』, 『theirs-full』)
2、手工修改1.txt文件,然後將當前拷貝即1.txt作為最後提交的版本
svn resolve –accept working 1.txt
3、svn resolve –accept theirs-full 1.txt 使用1.txt.rNew作為最後提交的版本
4、svn resolve –accept mine-full 1.txt 使用1.txt.mine作為最後提交的版本
5、svn resolve –accept mine-conflict 1.txt 使用1.txt.mine的沖突部分作為最後提交的版本
5、svn resolve –accept theirs-conflict 1.txt 使用1.txt.rNew的沖突部分作為最後提交的版本
第三種,使用svn revert取消變更
(以上文章來源:http://blog.sina.com.cn/s/blog_65fd4c1e0100h2cg.html)
-----
前兩天在解決沖突時用到了svn resolve這個命令,找到這篇文章主要是因為他對–accept參數的說明比較全
比官方的文檔更詳細。
svn文件沖突,樹沖突詳解
解決沖突
偶爾,當你從版本庫更新、合並文件時,或者切換工作副本至一個不同的 URL 時你會遇到沖突。有兩種沖突:
文件沖突
當兩名(或更多)開發人員修改了同一個文件中相鄰或相同的行時就會發生文件沖突。
樹沖突
當一名開發人員移動、重命名、刪除一個文件或文件夾,而另一名開發人員也對它們進行了移動、重命名、刪除或者僅僅是修改時就會發生樹沖突。
文件沖突
當兩名或更多開發人員修改了同一個文件中相鄰或相同的行時就會發生文件沖突。由於 Subversion 不知道你的項目的具體情況,它把解決沖突的工作留給了開發人員。一旦出現沖突,你就應該打開有問題的文件,查找以字元串<<<<<<<開頭的行。有沖突的區域用如下的方式標記:
<<<<<<< 文件名
你的修改
=======
合並自版本庫中的代碼
>>>>>>> 版本
對於每個沖突的文件 Subversion 在你的目錄下放置了三個文件:
文件名.ext.mine
這是你的文件,在你更新你的工作副本之前存在於你的的工作副本中——也就是說,沒有沖突標志。這個文件除了你的最新修改外沒有別的東西。
文件名.ext.r舊版本
這是在你更新你的工作副本之前的基礎版本(BASE revision)文件。也就是說,它是在你做最後修改之前所檢出的文件。
文件名.ext.r新版本
這個文件是當你更新你的工作副本時,你的 Subversion 客戶端從伺服器接收到的。這個文件對應於版本庫中的最新版本。
你可以通過TortoiseSVN → 編輯沖突運行外部合並工具/沖突編輯器,或者你可以使用任何別的編輯器手動解決沖突。你需要沖定哪些代碼是需要的,做一些必要的修改然後保存。
然後,執行命令TortoiseSVN → 已解決並提交人的修改到版本庫。需要注意的是已解決命令並不是真正的解決了沖突,它只是刪除了filename.ext.mine和filename.ext.r*兩個文件,允許你提交修改。
如果你的二進制文件有沖突,Subversion不會試圖合並文件。本地文件保持不變(完全是你最後修改時的樣子),但你會看到filename.ext.r*文件。如果你要撤消你的修改,保留版本庫中的版本,請使用還原(Revert)命令。如果你要保持你的版本覆蓋版本庫中的版本,使用已解決命令,然後提交你的版本。
你可以右擊父文件夾,選擇TortoiseSVN → 已解決...,使用「已解決」命令來解決多個文件。這個操作會出現一個對話框,列出文件夾下所有有沖突的文件,你可以選擇將哪些標記成已解決。
樹沖突
當一名開發人員移動、重命名、刪除一個文件或文件夾,而另一名開發人員也對它們進行了移動、重命名、刪除或者僅僅是修改時就會發生樹沖突。有很多種不同的情形可以導致樹沖突,而且不同的情形需要不同的步驟來解決沖突。
當一個文件通過 Subversion 在本機刪除後,文件也從本機文件系統中刪除。因此即使它是樹沖突的一部分,卻既不能顯示沖突的疊加圖標也不能通過右鍵單擊來解決沖突。使用檢查修改對話框來獲得編輯沖突選項。
TortoiseSVN 能夠協助找到合並更改的正確位置,但是需要作一些額外的工作來整理沖突。請牢記: 當進行一次更新操作後,工作副本的基礎文件將會包括每一個項目在執行更新操作時版本庫中的版本。如果你在進行更新後再撤銷更改,工作副本將返回到版本庫的 狀態,而不是你開始進行更改前的狀態。
本地刪除,當更新時有更改進入
開發人員 A 修改 Foo.c 並將其提交至版本庫中
開發人員 B 同時在他的工作副本中將文件 Foo.c 改名為 Bar.c,或者僅僅是刪除了 Foo.c 或它的父文件夾。
更新開發人員 B 的工作副本會導致樹沖突:
在工作副本中,Foo.c 被刪除了,但是被標記為樹沖突。
如果沖突是由於更改文件名引起的而不是刪除文件引起的,那麼 Bar.c 被標記為添加,但是其中卻不包括開發人員 A 修改的內容。
開發人員 B 現在必須做出選擇是否保留開發人員 A 的更改。在更改文件名的案例中,他可以將 Foo.c 的更改合並到改名後的文件 Bar.c 中去。對於刪除文件或文件夾的案例中,他可以選擇保留包含開發人員 A 更改內容的項目並放棄刪除操作。或什麼也不做而直接將沖突標記為已解決,那樣他實際上丟棄了開發人員 A 的更改。
如果 TortoiseSVN 能夠找到被改名為 Bar.c 的原始文件,沖突編輯對話框將可以合並更改。這取決於在什麼地方調用更新操作,它也許不能找到原始文件。
本地更改,當更新時有刪除進入
開發人員 A 將文件 Foo.c 改名為 Bar.c 並將其提交至版本庫中。
開發人員 B 在他的工作副本中修改文件 Foo.c。
或者在一個文件夾改名的案例中...
開發人員 A 將父文件夾 FooFolder 改名為 BarFolder 並將其提交至版本庫中。
開發人員 B 在他的工作副本中修改文件 Foo.c。
更新開發人員 B 的工作副本會導致樹沖突。對於一個簡單的文件沖突:
Bar.c 被當作一個正常文件添加到工作副本中。
Foo.c 被標記為添加(包括其歷史記錄)並且產生樹沖突。
對於一個文件夾沖突:
BarFolder 被當作一個正常文件夾添加到工作副本中。
FooFolder 被標記為添加(包括其歷史記錄)並且產生樹沖突。
Foo.c 被標記為已修改。
開發人員 B 現在需要做出決定是否接受開發人員 A 作出的結構改變並且合並她的更改到新結構下適當的文件中,或者直接放棄開發人員 A 的更改並保留本地文件。
要合並她的本機更改到新布局中,開發人員 B 必須先找出沖突的文件 Foo.c 經過改名/移動後在版本庫中的新文件名是什麼。可以使用日誌對話框來完成這個任務。更改必須要手工合並,因為沒有辦法自動的或者簡單的完成此操作。一旦更改移植完畢,沖突的路徑就是多餘的並且可以刪除。在此案例中,使用沖突編輯對話框中的刪除按鈕進行清理並將沖突標記為已解決。
如果開發人員 B 認為 A 的更改是錯誤的,那麼在沖突編輯對話框中她必須選擇保留按鈕。這樣就會標記沖突的文件/文件夾為已解決,但是需要手工刪除開發人員 A 的更改。又是通過日誌對話框幫助追蹤哪些文件移動了。
本地刪除,當更新時有刪除進入
開發人員 A 將文件 Foo.c 改名為 Bar.c 並將其提交至版本庫中。
開發人員 B 將文件 Foo.c 改名為 Bix.c
更新開發人員 B 的工作副本會導致樹沖突:
Bix.c 被標記為添加(包括其歷史記錄)。
Bar.c 被添加到工作副本中,其狀態為『正常』。
Foo.c 被標記為刪除並且產生一個樹沖突。
要解決這個沖突,開發人員 B 必須找出沖突的文件 Foo.c 經過改名/移動後在版本庫中的新文件名是什麼。可以使用日誌對話框來完成這個任務。
然後,開發人員 B 需要決定 Foo.c 的新文件名中的哪一個需要保留 - 開發人員 A 改的那個還是他自己改的那個。
在開發人員 B 手工解決沖突後,使用沖突編輯對話框中的按鈕將樹沖突標記為已解決。
本地缺少,當合並時有更改進入
開發人員 A 在主幹上工作,修改 Foo.c 並將其提交至版本庫中
開發人員 B 在分支上工作,將 Foo.c 改名為 Bar.c 並將其提交至版本庫中
合並開發人員 A 的主幹更改到開發人員 B 的分支工作副本會導致樹沖突:
Bar.c 已經存在於工作副本中,其狀態為『正常』。
Foo.c 被標記為缺少並產生樹沖突。
要解決這個沖突,開發人員 B 要在沖突編輯對話框中標記文件為已解決,這樣就會將其從沖突列表中刪除。她接下來需要決定是否將缺少的文件 Foo.c 從版本庫中復制到工作副本中,是否將開發人員 A 的對 Foo.c 的更改和合並到改名後的 Bar.c 或者是否通過標記沖突為已解決來忽略更改什麼事也不做。
注意,如果你將缺少的文件從版本庫中復制到工作副本中然後再標記為已解決,你復制下來的文件將被再次刪除。你必須先解決沖突。
本地更改,當合並時有刪除進入
開發人員 A 在主幹上工作,將 Foo.c 改名為 Bar.c 並將其提交至版本庫中
開發人員 B 在分支上工作,修改 Foo.c 並將其提交至版本庫中
當文件夾改名時有類似的案例,但是在 Subversion 1.6 中還未被識別...
開發人員 A 在主幹上工作,將父文件夾 FooFolder 改名為 BarFolder 並將其提交至版本庫中。
開發人員 B 在分支上工作,在她的工作副本中修改 Foo.c 。
合並開發人員 A 的主幹更改到開發人員 B 的分支工作副本會導致樹沖突:
Bar.c 被標記為添加。
Foo.c 被標記為修改並產生樹沖突。
開發人員 B 現在需要做出決定是否接受開發人員 A 作出的結構改變並且合並她的更改到新結構下適當的文件中,或者直接放棄開發人員 A 的更改並保留本地文件。
要合並她的本機更改到新布局中,開發人員 B 必須先找出沖突的文件 Foo.c 經過改名/移動後在版本庫中的新文件名是什麼。可以通過適用於合並源碼的日誌對話框來完成這個任務。沖突編輯器僅顯示工作副本的日誌因為它不知道將哪個路 徑的更改合並進來,所以你需要自己找到它。更改必須要手工合並,因為沒有辦法自動的或者簡單的完成此操作。一旦更改移植完畢,沖突的路徑就是多餘的並且可 以刪除。在此案例中,使用沖突編輯對話框中的刪除按鈕進行清理並將沖突標記為已解決。
如果開發人員 B 認為 A 的更改是錯誤的,那麼在沖突編輯對話框中她必須選擇保留按鈕。這樣就會標記沖突的文件/文件夾為已解決,但是需要手工刪除開發人員 A 的更改。又是通過日誌對話框幫助追蹤哪些文件移動了。
本地刪除,當合並時有刪除進入
開發人員 A 在主幹上工作,將 Foo.c 改名為 Bar.c 並將其提交至版本庫中
開發人員 B 工作在分之上,將 Foo.c 改名為 Bix.c 並將其提交至版本庫中
合並開發人員 A 的主幹更改到開發人員 B 的分支工作副本會導致樹沖突:
Bix.c 被標記為正常(未修改)狀態。
Bar.c 被標記為添加(包括其歷史記錄)。
Foo.c 被標記為缺少並且產生樹沖突。
要解決這個沖突,開發人員 B 必須先找出沖突的文件 Foo.c 經過改名/移動後在版本庫中的新文件名是什麼。可以通過適用於合並源碼的日誌對話框來完成這個任務。沖突編輯器僅顯示工作副本的日誌因為它不知道將哪個路徑的更改合並進來,所以你需要自己找到它。
然後,開發人員 B 需要決定 Foo.c 的新文件名中的哪一個需要保留 - 開發人員 A 改的那個還是他自己改的那個。
在開發人員 B 手工解決沖突後,使用沖突編輯對話框中的按鈕將樹沖突標記為已解決。