灵活与静态分支(Git vs Clearcase / Accurev)

时间:2009-04-18 07:45:40

标签: git version-control clearcase accurev

我的问题是关于Git处理分支的方式:每当你从一个提交分支时,这个分支将永远不会从父分支接收更改,除非你强制它的合并。 / p>

但是在我们的Clearcase或Accurev等其他系统中,您可以指定分支如何填充某种继承机制:我的意思是,使用Clearcase,使用config_spec,您可以说“全部获取”在branch / main / issue001上修改的文件,然后继续使用/ main或具有此特定基线的文件“。

在Accurev中,您还有一个类似的机制,让流可以从上层分支(流如何调用它们)接收更改,而无需在分支上合并或创建新的提交。

使用Git时不要错过这个吗?你能枚举这个继承是必须的场景吗?

由于

更新请阅读下面的VonC回答以实际关注我的问题。一旦我们同意“线性存储”和基于DAG的SCM具有不同的功能,我的问题是:哪些是现实生活场景(特别是对于OSS以外的公司)线性可以做DAG无法做到的事情?它们值得吗?

9 个答案:

答案 0 :(得分:30)

答案 1 :(得分:3)

听起来你正在寻找的可能是git rebase。重新分支分支在概念上将其从其原始分支点分离并在其他点重新分配。 (实际上,通过将分支的每个补丁按顺序应用到新分支点来实现rebase,创建一组新的补丁。)在您的示例中,您可以将分支重新绑定到上部分支的当前尖端,将基本上“继承”对其他分支所做的所有更改。

答案 2 :(得分:3)

我不清楚你的要求是什么,但听起来像是git的 跟踪语义是你想要的。当你从起源分支 你可以这样做:

git -t -b my_branch origin / master

然后未来的“git pull”将自动合并origin / master到你的 工作分支。然后你可以使用“git cherry -v origin / master”来查看 有什么区别。您可以在发布之前使用“git rebase” 更改以清除历史记录,但不应使用rebase一次 您的历史是公开的(即其他人正在关注该分支)。

答案 3 :(得分:2)

关于accurev使用的继承方案:GIT用户在查看git-flow时可能会“获取”整个内容(另请参阅:http://github.com/nvie/gitflowhttp://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/

这个GIT分支模型或多或少(手动/借助git-flow工具)自动开箱即用,并且支持很棒的 GUI。

所以它出现 GIT可以做accurev所做的事情。因为我从来没有真正使用过git / git-flow,所以我不能真正说出它是如何工作的,但看起来确实很有前景。 (减去适当的GUI支持: - )

答案 4 :(得分:2)

答案 5 :(得分:2)

您是否注意到您也可以使用GIT查看特定文件版本?

请使用:

git checkout [< tree-ish >] [--] < paths >

与配置规范一样,任何现有版本的文件(路径)都可以加载到工作树中。引自git-checkout docs:

以下序列检出主分支,将Makefile恢复为两个修订版本,错误地删除hello.c,并从索引中取回它:

$ git checkout master             
$ git checkout master~2 Makefile             
$ rm -f hello.c            
$ git checkout hello.c            

答案 6 :(得分:2)

除了理论之外,从我在商业生产环境中使用AccuRev多年的观点来看,这是一种明显的实际需要:只要子流没有过多分歧,继承模型就能很好地发挥作用。仍处于发展阶段的祖先。当继承流太不同时,它会崩溃。

继承(作为早期版本的子代的更高版本)允许祖先流中的更改在子流中处于活动状态,而无需任何人做任何事情(除非需要合并,在这种情况下它显示为深度重叠,这很好能够看到)。

这听起来很棒,而且在实践中,当涉及的所有流相对相似时。我们将该模型用于给定生产版本下的修补程序和服务包级别流。 (这实际上比我们复杂一点,但这是一般的想法。)

生产版本是并行的,没有继承,每个版本下面都有这些修补程序和服务包子代。启动新版本意味着创建新的发行版级别流,并手动将先前版本的最新维护流中的所有内容推送到其中。在此之后,必须手动将对应用于后续版本的早期版本的更改手动推送到每个版本中,这需要更多工作,但允许更好的控制。

我们最初在所有版本中都使用了继承模型,后来的版本是早期版本的子代。这种方法运作良好一段时间,但随着时间的推移变得难以管理。跨版本的主要架构差异不可避免地继承了一个坏主意。是的,您可以在它们之间放置一个快照来阻止继承,但是所有更改都必须手动推送,而parent-snapshot-child和并行非继承流之间唯一真正的区别在于整个图形流视图不断推送在右边,这是一个PITA。

AccuRev的一个非常好的事情是你总是有这个选择。这不是SCM程序架构的固有约束。

答案 7 :(得分:1)

ClearCase,没有MultiSite,是一个单一的存储库,但Git是分布式的。 ClearCase在文件级别提交,但Git在存储库级别提交。 (这最后的差异意味着原始问题是基于误解,正如这里的其他帖子所指出的那样。)

如果这些是我们所讨论的差异,那么我认为“线性”与“DAG”是区分这些SCM系统的一种令人困惑的方式。在ClearCase中,文件的所有版本都被称为文件的版本“树”,但实际上它是一个有向无环图!与Git的真正区别在于ClearCase的DAG存在于每个文件中。因此,我认为将ClearCase称为非DAG,将Git称为DAG是误导。

(BTW ClearCase以与文件类似的方式对其目录进行版本化 - 但这是另一个故事。)

答案 8 :(得分:0)

我不确定你是否在问什么,但你证明Accurev流是与Git(或SVN)分支不同的工具。 (我不知道Clearcase。)

例如,对于Accurev,您强制,正如您所说,使用某些工作流程,这为您提供了Git不支持的可更改的可审计历史记录。 Accurev的继承使某些工作流程更有效,而其他工作流程则不可能。

使用Git,您可以在本地存储库或功能分支中分离探索性编码,Accurev不会很好地支持这些编码。

不同的工具适用于不同的目的;询问每个人