Re: [問題] SVN的衝突解決
※ 引述《adrianshum.bbs@ptt.cc (Alien)》之銘言:
> ※ 引述《knives ()》之銘言:
> : 我現在在學著用ToroiseSVN
> : 可是常常會發生
> : 錯誤: 送交失敗 (細節隨附):
> : 錯誤: File or directory 'user.php' is out of date; try updating
> : 錯誤: resource out of date; try updating
> : 這樣的衝突,而不能更新
> : 有一種我覺得很爛的解決方法就是先把本地的檔案刪了再重新SVN更新
> : 如果用更新到某個版本的話
> : 程式碼會被追加這樣的字串
> : <<<<<<< .mine
> : =======
> : 不知道大家是怎麼解決衝突
> : 謝謝
> 你應該去看一看 svn 的書 (官方的免費書),
> 理解一下發生什麼事, 我感覺你好像不太清楚這部份的理念.
> 這裡發生的一切事都是始於協同工作的時候有衝突.
> 假設 A, B 二人都在用 svn, 大家協同修改某檔. (假設叫 x.txt)
> 原本 svn 的 revision 是 100
> A, B 都各自 checkout 了 x.txt
> B 先修改完, commit 了. svn 的 revision 變為 101
> 當 A commit 的時候, svn client 作檢查 (其實 B 也有發生這檢查, 只是
> 他平安過渡而已), 發覺 A 的 working copy 的修改是 基於 rev 100 的
> x.txt, 可是 server 上的檔案已經在 rev 101 修改過了, 那麼 svn client
> 當然不可以卯然把 A 的 x.txt 丟上去, 不然的話, B 的修改不就消失了嗎?
> 所以才會有說: x.txt out of date; try updating 的訊息出現.
> 這訊息是叫 A 去做 update, 而 update 就會把 server 上新的 x.txt
> 拿下來. 然後 svn client 會把 A 之前基於 rev 100 的修改部份, 自動
> 在 rev 101 的 x.txt 嘗試照樣的修改. 一般來說, 要 A 和 B 修改的部
> 份沒有重疊, 這個自動 merge 的動作就已經幫你搞定了.
> 可是萬一 A 和 B 都修改了同一行, svn 又怎麼知道誰改的才對? 這個時
> 候就會出現 merge conflict, 然後在 conflict 的部份用 <<<<< mine
> etc 來指出, 用意只是叫A 修改為 A 認為正確的結果.
> 所以你要問, 怎麼 resolve conflict 才對, 根本沒有人可以答你,
> 因為每一次的衝突都不同, 你要自己去判斷才行呀. 有時候, 可能剛
> 巧另一個同事和你都修改了一樣的東西, 那麼你就可以用他的版本取代,
> 有時候只是修改的位置重疊, 而修改的內容是不同的, 那麼你當然要
> 把兩部份都保留下來嘍.
> Alien
個人經驗:
1. 若很確定這個 file 自己沒修改過, 的確砍掉後再 svn up 最簡單
2. 若自己有動過這個 file, 那就如同 Alien 說的, svn up 後有機會看到 conflict,
同時間會幫你產生 xxx.mine, xxx.OldVersion, xxx.NewVersion 分別代表:
xxx.mine: 你下 svn up 之前的檔案內容, 包含你修改過的
xxx.OldVersion: 你下 svn up 之前的檔案內容, "不"包含你修改過的
xxx.NewVersion: 目前 server 上最新的檔案內容
由以上 3 個 file, 你可以決定怎麼更新 xxx file,
修改好後, 你可以使用 svn resolved xxx, 代表你已經修正好了,
此時那幾個多出的 file 也會自動被砍掉了,
接者也就能 svn commit 回去
--
※ Origin: 交大次世代(bs2.to)
◆ From: 220-133-198-183.HINET-IP.hinet.net
討論串 (同標題文章)
Programming 近期熱門文章
PTT數位生活區 即時熱門文章
7
20