看板Programming
标 题Re: [问题] SVN的冲突解决
发信站交大资讯次世代BS2 (Sat Aug 13 15:41:03 2011)
转信站ptt!news.ntu!ctu-gate!ctu-peer!news.nctu!csnews.cs.nctu!news.cs.nctu!B
※ 引述《[email protected] (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