我经常读到Hg(和Git和......)在合并方面比SVN更好但是我从未见过Hg/Git可以合并SVN失败的地方(或者SVN需要人工干预的地方)的实际例子.您可以发布一些分支/修改/提交/ ....-操作的逐步列表,显示SVN在Hg/Git愉快地移动时会失败的位置吗?实用,非常特殊的情况请...
一些背景:我们有几十个开发人员在使用SVN进行项目,每个项目(或一组类似项目)都在自己的存储库中.我们知道如何应用发布和功能分支,所以我们不会经常遇到问题(即,我们一直在那里,但我们已经学会克服Joel的问题 "一个程序员给整个团队造成创伤"或"需要六个开发人员两周才能重新整合分支机构").我们的发布分支非常稳定,仅用于应用错误修正.我们的中继线应该足够稳定,能够在一周内创建发布.我们还有一些开发人员或开发人员可以使用的功能分支.是的,它们在重新集成后被删除,因此它们不会使存储库混乱.;)
所以我仍然试图找到Hg/Git优于SVN的优势.我很想获得一些实践经验,但目前还没有任何我们可以移动到汞/ GIT中还没有更大的项目,所以我坚持用只含有少量由文件小型人工玩的项目.而且我正在寻找一些你可以感受到Hg/Git令人印象深刻的力量的案例,因为到目前为止我经常读到它们但却未能自己找到它们.
Stack Overflow问题如何和/或为什么在Git中合并比在SVN中更好?是一个很好的问题,有一些很好的答案.然而,它们都没有显示一个简单的例子,其中Git中的合并比SVN更好.
关于这个问题将被重复关闭的可能性是什么
几点:
我在Joel的软件上读到:
使用分布式版本控制,分布式部分实际上不是最有趣的部分.
有趣的是,这些系统考虑的是变化,而不是版本.
在HgInit:
当我们必须合并时,Subversion会尝试查看两个版本 - 我的修改后的代码和修改过的代码 - 它会尝试猜测如何在一个大的邪恶混乱中将它们粉碎在一起.它通常会失败,产生并非真正冲突的"合并冲突"的页面和页面,只是Subversion无法弄清楚我们做了什么的地方.
相比之下,当我们在Mercurial中单独工作时,Mercurial正忙着保留一系列变更集.因此,当我们想要将我们的代码合并在一起时,Mercurial实际上有更多的信息:它知道我们每个人都改变了什么并且可以重新应用这些更改,而不仅仅是查看最终产品并试图猜测如何放置它一起.
通过查看SVN的存储库文件夹,我的印象是Subversion将每个修订版维护为变更集.据我所知,Hg正在使用变更集和快照,而Git纯粹使用快照来存储数据.
如果我的假设是正确的,那么必须有其他方法使DVCS中的合并变得容易.那些是什么?
*更新:
这是我们在故事板介绍之前从未处理过的问题 - 只要UI中存在冲突的可能性,我们就确保没有2个开发人员同时处理同一个XIB文件.我们避免解决XIB冲突的原因是可能存在有问题的副作用(XIB以XML格式表示,因此没有合并2个版本的"好"方法).
现在我们面临这个问题,因为我们所有的UI元素都在同一个.storyboard文件中 - 防止同时处理项目中的任何2个UI元素使得并行工作变得非常困难.
有关如何解决这个问题的任何建议?在此先感谢您的努力.
正如标题所暗示的那样,我很好奇为什么有这么多人吹捧Git作为分支/合并SVN的优秀替代品.我主要是好奇,因为SVN合并很糟糕,我想要一个替代解决方案.
Git如何更好地处理合并?它是如何工作的?
例如,在SVN中,如果我有以下行:
你好,世界!
然后user1将其更改为:
Hello World!1
然后user2将其更改为:
Hello World!12
然后user2提交,然后user1提交,SVN会给你一个冲突.Git可以解决这个简单的问题吗?
我正在寻找可以在git中工作的具体示例合并,但会导致SVN中的冲突.除此之外,您在Git中从未尝试过的艰难/痛苦的SVN合并样本也没问题.
我可以识别出与我的问题相关的四类合并:
我在这里错过了任何场景吗?
找到1-3的样本是微不足道的(在评论中找到2的样本,3作为我的答案的一部分,1几乎是任何rebase).有没有人为一个成功的纵横交叉合并提供样本(看起来不是学术上的),这会在SVN中失败?
我喜欢从版本控制系统(VCS)中区分出三种不同类型的冲突:
一个文本的冲突是一个由合并或更新过程中检测到.这是由系统标记的.在冲突解决之前,VCS不允许提交结果.
一个句法冲突不是由VCS标记,但结果将无法编译.因此,即使是一个稍微小心的程序员也应该这样做.(一个简单的例子可能是左边的变量重命名和一些使用右边的变量添加的行.合并可能有一个未解析的符号.或者,这可能会通过变量隐藏引入语义冲突.)
最后,VCS不会标记语义冲突,结果会编译,但代码可能会出现问题.在轻微的情况下,会产生不正确的结果.在严重的情况下,可能会引发崩溃.即使是这些也应该在非常谨慎的程序员提交之前通过代码审查或单元测试来检测.
我的语义冲突的例子使用SVN(Subversion)和C++,但这些选择与问题的本质并不相关.
基本代码是:
int i = 0;
int odds = 0;
while (i < 10)
{
if ((i & 1) != 0)
{
odds *= 10;
odds += i;
}
// next
++ i;
}
assert (odds == 13579)
Run Code Online (Sandbox Code Playgroud)
Left(L
)和Right(R
)更改如下.
左 ''优化'(改变循环变量的值):
int i = 1; // L
int odds = 0;
while (i < 10)
{
if …
Run Code Online (Sandbox Code Playgroud) 我有一个如下所示的git树:
由于我们使用的审核工具,我们选择改变而不是合并它们.这给我们留下了一些逻辑重复,我的分支只是删除.例如,在dev中也可以看到ssl_tests"Modification:Changing name ..."下面的更改.
现在,也许这是我对樱桃选择缺乏了解,但是那些提交有不同的哈希值,所以不同的提交是对的吗?即使它们在逻辑上是相同的.
然而,当我去修改devs ssl_tests到dev时,git设法弄清楚那些樱桃挑选的提交是上游的,然后只从ssl_tests重新定义"新功能:单元测试......"提交.
按照惯例,使用git,这太棒了!这正是我想要的!我的问题是,git如何确定如果它们有不同的哈希值,它不需要重新设置其他提交?
谢谢!斯蒂芬
我听说过,例如将分支与git或mercurial合并比使用svn更容易.
在软件博客上阅读Joel的最后一篇,我并没有明白为什么.你能提供一个具体的例子,与svn相比,与git/mercurial合并导致更少的合并冲突吗?
3年前我问过一个问题:如何和/或为什么在Git中合并比在SVN中更好?
当时我认为我们在SVN 1.6上,但现在我们已经达到了1.8,看起来合并是他们已经做了大量工作的一个领域.
那么鉴于这些变化,SVN 1.8是否赶上了像git这样的DVCS中更好的合并和分支支持?
在阅读了如何和/或为什么在Git中合并比在SVN中更好? 我还是不明白.假设我有多个版本我正在维护(我需要维护所有版本,所有版本都在生产中):
现在我提交了一个错误修复到v1.0(我需要在所有下一个版本中修复此错误).
现在在git和svn中我必须执行以下逻辑操作
使用git(或gerrit)的主要好处是什么?合并到下一个分支,提交,测试的逻辑操作是一样的!那有什么不同呢?(如果它只是次要的合并算法改进,对我来说并不重要.我在Subversion中有一个相当不错的自动合并解决冲突.另外我不介意检查分支v1.1在subversion中进行合并因为我有一些实用程序可以帮助我这样做,所以我没有时间投入其中).