作者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
1F:推 johnlinvc:重点就在svn merge sucks!!!git rock!!! 114.32.24.155 07/12 22:51
2F:→ adrianshum:我两者都有用,git 所谓merge 比较好, 183.179.61.91 07/13 00:44
3F:→ adrianshum:并不是这篇文章中提到的情况。这类 183.179.61.91 07/13 00:44
4F:→ adrianshum:conflict 在 git 底下一样会出现. 183.179.61.91 07/13 00:44
5F:→ adrianshum:git 所谓merge 比较好是指 branching 183.179.61.91 07/13 00:45
6F:→ adrianshum:的情形底下,不同 branch 之间的 merge 183.179.61.91 07/13 00:45
7F:→ adrianshum:而所谓比较好,只是 git 简化了整个 183.179.61.91 07/13 00:45
8F:→ adrianshum:branch/merge 的 model 183.179.61.91 07/13 00:46
9F:→ adrianshum:现在发生的事,类同 git pull 了後再 183.179.61.91 07/13 00:49
10F:→ adrianshum:rebase. 由於往往在local 的 changes 183.179.61.91 07/13 00:49
11F:→ adrianshum:已经有很多,和pull 下来的修改有 183.179.61.91 07/13 00:50
12F:→ adrianshum:conflict 的话,rebase过程中的conflict 183.179.61.91 07/13 00:50
13F:→ adrianshum:resolving 可以更麻烦 183.179.61.91 07/13 00:51
14F:→ bigbite:用tortoise svn的话, merge不会比较难=) 211.76.57.160 07/19 22:49
15F:→ bigbite:在cmd line下git merge >>>>>> svn merge 211.76.57.160 07/19 22:49
16F:推 Luba:楼上的一直没搞懂 在这种情况下 svn >> git 59.104.108.86 07/30 02:32