SVN:分支问题
SVN: branch issue
我刚开始使用 SVN。
我只为自己创建了一个开发分支,这样我就可以在将我的更改合并到主干之前做任何我想做的事情。
不幸的是,当我不得不合并时,这是一场噩梦。
我的树看起来像这样:
trunk : A-B
\
dev : C-D-E
我只是想将我的更改 E
带回主干。
在 E
上一切都在编译并且运行良好。
但是当我合并时,我无法再编译了。
我有无法理解的冲突:
- 一些函数添加了它们的主体,但参数列表仍然是旧的。
例如:
void func(int paramA) // from rev B
{
paramB++; // from rev E and causing compilation error
}
- 添加了一些新文件,但没有添加一些新文件。 SVN 抱怨文件冲突,因为它们不存在于主干中。但是我不明白如何创建一些文件,而另一些则不能。
我用 Tortoise SVN 尝试了很多不同的选项(我恢复了很多次)。
我还阅读了很多关于使用 SVN 进行分支的文章。但是我找不到解决我的简单问题的方法。而且大多数答案都非常古老(超过 5 年)。
我习惯于 Git 分支。一切似乎都是合乎逻辑的。但是现在有了 SVN,我完全迷路了!
有人能给我一些建议吗?
我的意思是关于分支机构的日常使用,而不是关于整个项目的分支机构策略。
我只是在寻找建议,以避免在不应该发生合并冲突时的痛苦!
非常感谢任何帮助!
谢谢:)
对于您的第一个问题,显然在 B 中修改了参数行。如果您没有在您的分支上修改该行,SVN 不会将其视为冲突。顺便说一下,Git 也看不到。
通常这是一件好事。如果在主干上发生了某些变化但在您的分支中没有发生变化,通常您希望合并将主干上发生的事情与您的分支上发生的事情结合起来。但是在你的情况下,trunk 上的更改与你的分支有 semantic 冲突(不是逐行文本冲突)。您将始终需要手动解决此类语义冲突;我听说过的每个版本控制系统都使用的基于行的文本差异无法自动检测或解决此类冲突。
如果您确实也修改了您分支上的那一行,svn 应该将该文件标记为冲突。当您解决该冲突时(例如,通过双击 TortoiseSVN 的 "check for modifications" 对话框中的 "conflicted" 状态),您有机会选择需要的行版本,或手动修改行。
对于您的第二个问题,新 文件在分支上引入,而不存在于主干上,应该总是在没有冲突的情况下添加。但是,如果文件以前存在于 trunk 上并在你启动分支后的某个时间被删除,你将得到一个 "tree conflict"。如果有人在主干上添加了一个与您的新分支文件同名的文件,或者您更改了某人从主干中删除的文件,您也会遇到“树冲突”。
处理树冲突很痛苦;我不是 100℅ 清楚这些但我认为你只需要将它标记为已解决并且 svn copy
你想要的文件与完整文件 URL.
我刚开始使用 SVN。 我只为自己创建了一个开发分支,这样我就可以在将我的更改合并到主干之前做任何我想做的事情。
不幸的是,当我不得不合并时,这是一场噩梦。 我的树看起来像这样:
trunk : A-B
\
dev : C-D-E
我只是想将我的更改 E
带回主干。
在 E
上一切都在编译并且运行良好。
但是当我合并时,我无法再编译了。
我有无法理解的冲突:
- 一些函数添加了它们的主体,但参数列表仍然是旧的。
例如:
void func(int paramA) // from rev B
{
paramB++; // from rev E and causing compilation error
}
- 添加了一些新文件,但没有添加一些新文件。 SVN 抱怨文件冲突,因为它们不存在于主干中。但是我不明白如何创建一些文件,而另一些则不能。
我用 Tortoise SVN 尝试了很多不同的选项(我恢复了很多次)。 我还阅读了很多关于使用 SVN 进行分支的文章。但是我找不到解决我的简单问题的方法。而且大多数答案都非常古老(超过 5 年)。
我习惯于 Git 分支。一切似乎都是合乎逻辑的。但是现在有了 SVN,我完全迷路了! 有人能给我一些建议吗? 我的意思是关于分支机构的日常使用,而不是关于整个项目的分支机构策略。 我只是在寻找建议,以避免在不应该发生合并冲突时的痛苦!
非常感谢任何帮助! 谢谢:)
对于您的第一个问题,显然在 B 中修改了参数行。如果您没有在您的分支上修改该行,SVN 不会将其视为冲突。顺便说一下,Git 也看不到。
通常这是一件好事。如果在主干上发生了某些变化但在您的分支中没有发生变化,通常您希望合并将主干上发生的事情与您的分支上发生的事情结合起来。但是在你的情况下,trunk 上的更改与你的分支有 semantic 冲突(不是逐行文本冲突)。您将始终需要手动解决此类语义冲突;我听说过的每个版本控制系统都使用的基于行的文本差异无法自动检测或解决此类冲突。
如果您确实也修改了您分支上的那一行,svn 应该将该文件标记为冲突。当您解决该冲突时(例如,通过双击 TortoiseSVN 的 "check for modifications" 对话框中的 "conflicted" 状态),您有机会选择需要的行版本,或手动修改行。
对于您的第二个问题,新 文件在分支上引入,而不存在于主干上,应该总是在没有冲突的情况下添加。但是,如果文件以前存在于 trunk 上并在你启动分支后的某个时间被删除,你将得到一个 "tree conflict"。如果有人在主干上添加了一个与您的新分支文件同名的文件,或者您更改了某人从主干中删除的文件,您也会遇到“树冲突”。
处理树冲突很痛苦;我不是 100℅ 清楚这些但我认为你只需要将它标记为已解决并且 svn copy
你想要的文件与完整文件 URL.