作者adrianshum (Alien)
看板Programming
標題Re: [問題] SVN的衝突解決
時間Tue Jul 12 18:23:23 2011
※ 引述《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
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.238.156.185
推 johnlinvc:重點就在svn merge sucks!!!git rock!!! 114.32.24.155 07/12 22:51
→ adrianshum:我兩者都有用,git 所謂merge 比較好, 183.179.61.91 07/13 00:44
→ adrianshum:並不是這篇文章中提到的情況。這類 183.179.61.91 07/13 00:44
→ adrianshum:conflict 在 git 底下一樣會出現. 183.179.61.91 07/13 00:44
→ adrianshum:git 所謂merge 比較好是指 branching 183.179.61.91 07/13 00:45
→ adrianshum:的情形底下,不同 branch 之間的 merge 183.179.61.91 07/13 00:45
→ adrianshum:而所謂比較好,只是 git 簡化了整個 183.179.61.91 07/13 00:45
→ adrianshum:branch/merge 的 model 183.179.61.91 07/13 00:46
→ adrianshum:現在發生的事,類同 git pull 了後再 183.179.61.91 07/13 00:49
→ adrianshum:rebase. 由於往往在local 的 changes 183.179.61.91 07/13 00:49
→ adrianshum:已經有很多,和pull 下來的修改有 183.179.61.91 07/13 00:50
→ adrianshum:conflict 的話,rebase過程中的conflict 183.179.61.91 07/13 00:50
→ adrianshum:resolving 可以更麻煩 183.179.61.91 07/13 00:51
→ bigbite:用tortoise svn的話, merge不會比較難=) 211.76.57.160 07/19 22:49
→ bigbite:在cmd line下git merge >>>>>> svn merge 211.76.57.160 07/19 22:49
推 Luba:樓上的一直沒搞懂 在這種情況下 svn >> git 59.104.108.86 07/30 02:32