我知道有数千个相似的话题浮出水面.我在这里读了至少5个线程但是为什么我仍然不相信DVCS?
我只有以下问题(注意我只是自私地担心Java项目)
推我!
在它出现之前,我已经看过这个主题的几个主题,包括:
我正在寻找为我们的开发小组切换到Mercurial(来自Subversion).在我这样做之前,我正在做通常的利弊列表.
我的"优点"之一是Mercurial的合并优势,但到目前为止,我没有找到令人信服的证据.也就是说,在HgInit.com上发表声明,我无法核实:
例如,如果我稍微更改一个函数,然后将其移动到其他地方,Subversion就不会真正记住这些步骤,所以当合并的时候,它可能会认为一个新的函数只是出现了蓝色.Mercurial将分别记住这些事情:功能已更改,功能已移动,这意味着如果您稍微更改了该功能,则Mercurial更有可能成功合并我们的更改.
这将是非常引人注目的功能,但据我所知,这只是热空气.我一直无法验证上述声明.
我创建了一个Mercurial存储库,做了一个Hello World,然后克隆了它.在一个我修改了函数,提交它然后移动它,然后提交它.在另一个中,我只是在函数中添加了另一个输出行并提交了.
当我合并时,我得到的基本相同的合并冲突我将使用Subversion.
我知道mercurial可以更好地跟踪文件重命名,除了合并之外DVCS还有其他优点,但我对这个例子很感兴趣.乔尔斯波尔斯基在这里偏离基地,还是我错过了什么?
我在这方面没有经验,但看起来确实如此,因为Mercurial保留了更多的信息,理论上它可以更好地合并(如果开发人员也经常进行签名).例如,我认为Mercurial可以通过比较多个更改来获取上下文更改,例如,我修改函数,签入,移动函数,签入,以及Mercurial将这两个部分关联起来.
但是,Mercurial的合并似乎并没有真正利用添加的信息,并且似乎与Subversion的操作方式相同.它是否正确?
我刚刚阅读了Spolsky关于分布式与非分布式版本控制系统的最后一篇文章http://www.joelonsoftware.com/items/2010/03/17.html.这两者有什么区别?我们公司使用TFS.这个阵营到底是什么阵营?
我正在寻找可以在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
合并冲突解决方案本身是否比其他SCM(CVS,Subversion等)以及独立的合并工具更有效率?如果是这样,为什么?
澄清:这里我对算法本身更感兴趣 - 它与普通的diff3方法有什么不同?
一些工具声称更聪明(例如Guiffy),是否值得插入作为git合并工具?git是否更聪明地找出在文件内或跨文件移动的文本?(而不是报告嘈杂的冲突..我对Linus的谈话有一种模糊的印象).
背景:刚刚做了一个巨大的合并使用git-svn
,导致了一半的冲突比我得到的普通svn merge
(第一次合并没有跟踪)..所以我想了解原因.
类似的Qs/As周围,但它们更多的是关于过程的大局,以及合并如何更自然地适应.为此,git
"优化合并"(而不仅仅是分支),它实际上意味着:
?现在,我最感兴趣的是1和2.
我已经听说过Git如何重新设计分支如何工作,以及SVN的分支模型是如何被搞砸的.
我没有使用太多的SVN,所以我对分支应该是什么样子没有先入之见.我首先看了git branches,然后"得到"它.
SVN分支的实际缺点是什么?
鼓励来自POV的工作流,分支策略和分支性能(在提交/结账/切换时间方面)的答案.
谢谢,jrh
可能重复:
合并:hg/git与svn
我听说/读过Git和DVCS一般比Subversion和集中版本控制系统好.我听到的原因之一是DVCS中的合并比集中式系统好得多.
合并时两者有什么区别?例如,当您重新集成分支时,是什么让Git比Subversion更好?
我们有几个开发团队,每个团队开发多个项目(通常为10个以上).我们目前正在使用CVS并评估是否转向SVN或GIT.我倾向于GIT,但我不确定如何有效地管理权限.例如.
我们有Dev Team A,Dev Team B,Dev Team C.每个都有12个开发人员.每个开发团队至少有10个独立的项目.A队可以看到每个人的代码,B队和C队只能看到他们的代码.此外,一些开发人员只具有只读访问权限,而其他人具有完全访
所以在CVS中我们有三个存储库,每个团队一个.所以它就像:
/cvsroot/TeamARepos/project1
/cvsroot/TeamARepos/project2
/cvsroot/TeamBRepos/project1
/cvsroot/TeamBRepos/project2
/cvsroot/TeamCRepos/project1
/cvsroot/TeamCRepos/project2
Run Code Online (Sandbox Code Playgroud)
等等.我可以管理整个存储库,并说John Doe只读访问A但写入访问权限B并且无法访问C - 因此我不必让他明确访问每个项目(并且它们经常被添加,所以我不必每次都将每个人添加到每个新项目中.
我对GIT的理解是每个项目都有一个存储库.因此,没有一种真正合乎逻辑的方式可以说'团队A的所有代码都在这里并且这些用户可以写入'并且'团队B的所有代码都在这里,这些用户可以阅读它'并保持它的分离.
我不确定我是否知道如何正确地提出这个问题 - 但我认为转向GIT是一场行政噩梦.
我们还使用ant脚本来检查CVS中的代码,执行构建并部署到服务器.我刚开始看,但我希望蚂蚁在这个意义上与GIT打得很好.
我听说过,例如将分支与git或mercurial合并比使用svn更容易.
在软件博客上阅读Joel的最后一篇,我并没有明白为什么.你能提供一个具体的例子,与svn相比,与git/mercurial合并导致更少的合并冲突吗?
可能重复:
合并:hg/git与svn
嗨,
我是SVN的长期用户,并且在一般的mercurial和分散版本控制系统方面已经听到了很多关于我的事情.我所知道的主要功能是Mercurial中的合并更容易,因为它记录了每个合并的信息,因此每个连续的合并都知道以前的合并.
现在正如红皮书中所述,在与合并有关的部分中,SVN已经通过mergeinfo支持了这一点.现在我还没有真正使用过这个功能(虽然我想,我们的repo版本不够新)但是这个SVN功能与Mercurial提供的特别不同吗?
对于那些不知道svn中历史合并的建议工作流程的人是这样的:
从开发主干分支做自己的事情.
定期将更改从主干合并到您的分支以保持最新.
完成mergeinfo后合并以平滑过程.
没有历史数据合并这是一场噩梦,因为比较严格依赖于文件中的差异,并没有考虑到路上采取的步骤.因此,当您合并回来时,开发主干中的每个更改都会使您进一步陷入冲突.
现在我想知道的是:
与SVN中的mergeinfo相比,使用Mercurial合并是否提供了显着的优势,或者这只是一些关于什么的热点?
有没有人在SVN中使用了mergeinfo功能,实际上它有多好?
一般来说,有很多关于SVN与Hg的文章.我想只关注表现.
真实体验首选.
这是我的设置:
(未来设置)带有IIS的Windows的Hg
(当前设置)在Windows下的apache之上的SVN 1.3.2
我想有统计数据的大多数公共操作(提交,统计数据,本地/远程拉,推,等...).我不确定Hg最常见的操作是什么.
绩效并不是我们唯一重要的事情,但它具有很高的重要性,可能是转向Hg的关键决策点.
但是,我想看一些统计数据.如何克隆5 gb的回购需要日志?或类似的东西.