今天在提交項目文件到本地SVN時提示錯誤以下:php
過時:」global.php「在事務」21-1「,
You have to update your working copy first.服務器
運行update更新後再次提交又出現以下錯誤:編輯器
svn: Commit failed (details follow):svn: Aborting commit: 'global.php' remains in conflict查了一下SVN的手冊才知道原來是多個版本之間遇到衝突。此時你須要解決衝突(合併別人的修改)。
--------------------------------------------------------------------------------svn
舉一個例子,Sally修改了sandwich.txt,Harry剛剛改變了他的本地拷貝中的這個文件而且提交到服務器,Sally在提交以前更新它的工做拷貝獲得了衝突:工具
$ svn update C sandwich.txt Updated to revision 2. $ ls -1 sandwich.txt sandwich.txt.mine sandwich.txt.r1 sandwich.txt.r2命令行
在這種狀況下,Subversion不會容許你提交sandwich.txt,直到你的三個臨時文件被刪掉。日誌
$ svn commit --message "Add a few more things" svn: Commit failed (details follow): svn: Aborting commit: '/home/sally/svn-work/sandwich.txt' remains in conflict事務
若是你遇到衝突,三件事你能夠選擇:ci
「手動」合併衝突文本(檢查和修改文件中的衝突標誌)。rem
用某一個臨時文件覆蓋你的工做文件。
運行svn revert <filename>來放棄全部的修改。
一旦你解決了衝突,你須要經過命令svn resolved讓Subversion知道,這樣就會刪除三個臨時文件,Subversion就不會認爲這個文件是在衝突狀態了。
$ svn resolved sandwich.txt Resolved conflicted state of 'sandwich.txt'
手工合併衝突
第一次嘗試解決衝突讓人感受很懼怕,但通過一點訓練,它簡單的像是騎着車子下坡。
這裏一個簡單的例子,因爲不良的交流,你和同事Sally,同時編輯了sandwich.txt。Sally提交了修改,當你準備更新你的版本,衝突發生了,咱們不得不去修改sandwich.txt來解決這個問題。首先,看一下這個文件:
$ cat sandwich.txtTop piece of breadMayonnaiseLettuceTomatoProvolone<<<<<<< .mineSalamiMortadellaProsciutto=======SauerkrautGrilled Chicken>>>>>>> .r2Creole MustardBottom piece of bread小於號、等於號和大於號串是衝突標記,並非衝突的數據,你必定要肯定這些內容在下次提交以前獲得刪除,前兩組標誌中間的內容是你在衝突區所作 的修改:
<<<<<<< .mineSalamiMortadellaProsciutto=======後兩組之間的是Sally提交的修改衝突:
=======SauerkrautGrilled Chicken>>>>>>> .r2一般你並不但願只是刪除衝突標誌和Sally的修改—當她收到三明治時,會很是的吃驚。因此你應該走到她的辦公室或是拿起電話告訴Sally,你沒 辦法從從意大利熟食店獲得想要的泡菜。一旦大家確認了提交內容後,修改文件而且刪除衝突標誌。
Top piece of breadMayonnaiseLettuceTomatoProvoloneSalamiMortadellaProsciuttoCreole MustardBottom piece of bread如今運行svn resolved,你已經準備好提交了:
$ svn resolved sandwich.txt$ svn commit -m "Go ahead and use my sandwich, discarding Sally's edits."記住,若是你修改衝突時感到混亂,你能夠參考subversion生成的三個文件—包括你未做更新的文件。你也可使用第三方的合併工具檢 驗這三個文件。
拷貝覆蓋你的工做文件
若是你只是但願取消你的修改,你能夠僅僅拷貝Subversion爲你生成的文件替換你的工做拷貝:
$ svn updateC sandwich.txtUpdated to revision 2.$ ls sandwich.*sandwich.txt sandwich.txt.mine sandwich.txt.r2 sandwich.txt.r1$ cp sandwich.txt.r2 sandwich.txt$ svn resolved sandwich.txt下注:使用svn revert
若是你獲得衝突,通過檢查你決定取消本身的修改而且從新編輯,你能夠恢復你的修改:
$ svn revert sandwich.txtReverted 'sandwich.txt'$ ls sandwich.*sandwich.txt注意,當你恢復一個衝突的文件時,不須要再運行svn resolved。
如今咱們準備好提交修改了,注意svn resolved不像咱們本章學過的其餘命令同樣須要參數,在任何你認爲解決了衝突的時候,只須要當心運行svn resolved,—一旦刪除了臨時文件,Subversion會讓你提交這文件,即便文件中還存在衝突標記。
提交你得修改
最後!你的修改結束了,你合併了服務器上全部的修改,你準備好提交修改到版本庫。
svn commit命令發送全部的修改到版本庫,當你提交修改時,你須要提供一些描述修改的日誌信息,你的信息會附到這個修訂版本上,若是信息很簡短,你能夠在命令行中使用--message(-m)選項:
$ svn commit --message "Corrected number of cheese slices." Sending sandwich.txt Transmitting file data . Committed revision 3.
然而,若是你把寫日誌信息看成工做的一部分,你也許會但願經過告訴Subversion一個文件名獲得日誌信息,使用--file選項:
$ svn commit --file logmsg Sending sandwich.txt Transmitting file data . Committed revision 4.
若是你沒有指定--message或者--file選項,Subversion會自動地啓動你最喜歡的編輯器來編輯日誌信息。
版本庫不知道也不關心你的修改做爲一個總體是否有意義,它只檢查是否有其餘人修改了同一個文件,若是別人已經這樣作了,你的整個提交會失敗,而且提示你一個或多個文件已通過時了:
$ svn commit --message "Add another rule" Sending rules.txt svn: Commit failed (details follow): svn: Out of date: 'rules.txt' in transaction 'g'
此刻,你須要運行svn update來處理全部的合併和衝突,而後再嘗試提交。
咱們已經覆蓋了Subversion基本的工做週期,還有許多其它特性能夠管理你得版本庫和工做拷貝,可是隻使用前面介紹的命令你就能夠很輕鬆的工做了。