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

2023-12-07

我的问题是关于 Git 处理分支的方式:每当您从提交分支时,该分支都不会收到来自父分支的更改,除非您force合并它。

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

在 Accurev 中,您也有一个类似的机制,让流接收来自上层分支的更改(流如何称呼它们),而无需在分支上合并或创建新的提交。

使用 Git 的时候你不会错过这一点吗?你能列举一下这样的场景吗遗产是必须的?

Thanks

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


要理解为什么 Git 不提供某种您所说的“继承机制”(不涉及提交),您必须首先了解其中一个核心概念这些 SCM(例如 Git 与 ClearCase)

  • ClearCase 使用线性版本存储:元素(文件或目录)的每个版本都直接链接linear与同一元素的先前版本的关系。

  • Git 使用一个DAG - 有向无环图:文件的每个“版本”实际上是树中全局更改集的一部分,树本身也是提交的一部分。之前的版本必须在之前的提交中找到,可以通过单个有向非循环图路径访问。

在线性系统中,配置规范可以指定几个规则来实现您所看到的“继承”(对于给定文件,首先选择某个版本,如果不存在,则选择另一个版本,如果不存在,则选择一个第三,依此类推)。

该分支机构是一个fork in a linear历史记录给定选择规则的给定版本(该规则之前的所有其他选择规则仍然适用,因此具有“继承”效果)

在 DAG 中,一次提交代表您将获得的所有“继承”;没有“累积”版本选择。该图中只有一条路径可以选择您在此时(提交)将看到的所有文件。
分支只是该图中的一条新路径。

要在 Git 中应用某些其他版本,您必须:

  • 将一些其他提交合并到您的分支中(例如在 git pull 中提到的)st小队的回答) or
  • 重新调整你的分支的基础(如格雷格提到)

但由于 Git 是基于 DAG 的 SCM,因此它总是会产生新的提交。

使用 Git “丢失”的是某种“组合”(当您使用不同的连续选择规则选择不同版本时),但这在DVCS(如“分布式”):当您使用 Git 创建分支时,您需要从一个起点开始和一个内容定义明确并易于复制到其他存储库。

在纯粹的中央 VCS 中,您可以使用您想要的任何规则来定义您的工作区(在 ClearCase 中,您的“视图”,快照或动态)。


未知的谷歌在评论中添加(以及在上面的问题中):

因此,一旦我们看到这两个模型可以实现不同的目标(线性与 DAG),我的问题是:在现实生活中哪些场景(特别是对于 OSS 以外的公司)线性可以完成 DAG 无法完成的事情?他们值得吗?

当谈到选择规则的“现实场景”时,您可以在线性模型中做的是several评选规则对于同一组文件.

考虑这个“配置规范”(即使用 ClearCase 的选择规则的“配置规范”):

element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... aLabel2 -mkbranch myNewBranch

它选择所有标记为 'aLabel2' (并从那里分支),除了那些标记为 'aLabel3' - 并从那里分支 - (因为该规则先于提到 'aLabel2').

这值得么?

No.

实际上,ClearCase 的 UCM 风格(“统一配置管理“ClearCase 产品中包含的方法,代表从基本 ClearCase 使用中推导出来的所有“最佳实践”)不允许这样做,原因是简单性。一组文件称为“组件”,如果您想针对给定标签(称为“基线”)进行分支,则可以像以下配置规范一样进行翻译:

element /aPath/... .../myNewBranch
element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... /main/0 -mkbranch myNewBranch

你必须选择one起点(这里,'aLabel3')然后从那里开始。 如果您还想要来自 'aLabel2',您将对所有 ' 进行合并aLabel2' 文件到 'myNewBranch' 中的文件。

这是您不必使用 DAG 进行的“简化”,其中图形的每个节点都代表分支的唯一定义的“起点”,无论涉及的文件集是什么。

合并和变基足以将该起点与给定文件集的其他版本结合起来,以实现所需的“组合”,同时保留特定的历史记录隔离中在一个分支机构。

总体目标是推理“coherent版本控制操作应用于coherent成分”。 一组“一致”的文件是处于明确定义的一致状态的文件:

  • 如果有标签,all它的文件被标记
  • 如果有分支,all它的文件将从同样独特初始点

这在 DAG 系统中很容易完成;在线性系统中这可能会更加困难(特别是对于“Base ClearCase”,其中“配置规范”可能很棘手),但它是通过同一基于线性的工具的 UCM 方法来强制执行的。

您不是通过“私有选择规则技巧”(使用 ClearCase,一些选择规则顺序)来实现“组合”,而是仅通过 VCS 操作(变基或合并)来实现它,这会留下清晰的痕迹供每个人遵循(与开发人员私有的配置规范,或在一些但不是所有开发人员之间共享的配置规范)。 再次,它强化了一种感觉连贯性, 与“动态灵活性”相反,您以后可能很难重现这种灵活性.

这可以让你离开这个领域VCS(版本控制系统)并进入领域SCM(软件配置管理),主要涉及“再现性”。并且(SCM 功能)可以通过基于线性或基于 DAG 的 VCS 来实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

灵活分支与静态分支(Git 与 Clearcase/Accurev) 的相关文章

  • 按时间顺序将多个文件夹提交到 git 中

    我有数百个网站备份 每个文件夹一个 我想将它们放入 git 存储库中 每个备份作为一个版本 这些变化主要涉及图像文件和每天 2 个数据库备份 大小约为 25 GB 并且不断增加 有没有办法告诉 git 获取其中一个文件夹并将其提交到存储库中
  • 如何签出仅在“git ls-remote”中列出的分支?

    我遇到了无法切换到仅列出的分支的情况git ls remote 这是详细信息 我分叉了一个 github repoA 作为 repoB 创建了自己的分支并将其推送到 ComputerA 中的 repoB 在 ComputerB 中 我将分叉
  • 您的分支比“origin/master”领先 3 个提交

    我在运行时收到以下信息git status Your branch is ahead of origin master by 3 commits 我读过其他一些帖子 解决这个问题的方法是运行git pull rebase但是 rebase
  • git 如何查找分支源自的提交哈希

    假设我从主分支分支到主题分支 然后在主题分支上进行了一些提交 是否有命令告诉我主题分支源自的主分支上的提交哈希 理想情况下 我不必知道我做了多少次提交 试图避免 HEAD 5 我已经用谷歌搜索过 但似乎无法找到答案 谢谢 use git m
  • 清理远程 Git 分支

    我已经将 SVN 存储库移至 Git 可能由于多次克隆 我现在只剩下一堆看起来像这样的分支 BranchA origin BranchA remotes BranchA remotes origin BranchA remotes orig
  • git-svn 如何知道要提交到哪个分支?

    我的存储库是 SVN 我使用 git 进行所有开发 我们有一个标准布局 我用以下命令初始化了我的本地存储库git svn init s
  • 为别名命令添加“git help”?

    我已经实现了一个 Git 命令并使用 git 别名将其连接到 Git 但是有没有办法连接 Git 帮助 我在 Windows 上运行 如果我发出git help mycmd我收到一个弹出窗口 告诉我 Git 找不到 git mycmnd h
  • TortoiseGit - 更改默认合并消息

    系统描述 Windows 7的 git版本2 10 1 windows 1 乌龟Git 2 3 0 0 I want 合并提交消息在不同的情况下有所不同fully自动方式 no manual amend Summary 在windows上
  • 尝试配置 GIT 时 Eclipse 没有响应

    Windows 10 专业版 64 位SSD金士顿 i5 4690Eclipse 版本 全部工作空间 空问题 每次我尝试配置 TEAM gt GIT gt 配置或尝试导入 创建本地 远程 git 时 Eclipse 都会冻结 直到我强制用任
  • http.h:6:23: 致命错误:curl/curl.h:没有该文件/目录

    我在 CentOS 7 中下载 git 包 wget https www kernel org pub software scm git git 2 0 1 tar gz tar xzf git 2 0 1 tar gz 当我编译git时
  • 如何让 git 显示作者日期指定日期范围内的提交?

    显然this https stackoverflow com a 11189286 281545 git log all after
  • Heroku 应用程序上的 Nodejs Express EACCES 0.0.0.0:80

    我正在尝试在他们的网站上新创建的 Heroku 应用程序上运行 Node 应用程序 我按照他们的步骤操作 但在显示应用程序状态时仍然遇到错误 我跟着Node js 入门 https devcenter heroku com articles
  • GitPython 检查 git pull 是否更改了本地文件

    使用 GitPython 我只想在拉取后本地文件发生更改时才调用函数 例如 如果我在一台单独的计算机上进行推送 然后拉第一台计算机 它按预期工作 但不提供任何输出 理想的输出是已更改的文件列表 或者只是告诉我拉动是否有错误 没有拉动 因为分
  • 删除 Xcode 项目的源代码控制

    我在 Xcode 项目上使用源代码控制已经有一段时间了 但现在我不想使用源代码控制 如何从 Xcode 中的项目中删除源代码控制 有三种方法 方法 1 将禁用所有项目的源代码管理 方法 2 将删除所有项目的单个存储库的链接 方法 3 将删除
  • 在种子项目上构建时如何组织 git 存储库

    我正在基于从 github 克隆的种子项目 MEAN io 构建一个网站 如何将这些文件与我自己的文件分开 由于该种子提供了广泛的文件框架 因此我自己的文件分布在整个项目中 我希望能够从种子中提取更新 但不能将其与我添加的文件混合 我知道我
  • git am 和 git apply 有什么区别?

    Both git am https git scm com docs git am and git apply https git scm com docs git apply可用于应用补丁 看起来git am自动提交 而git apply
  • 在 python 中找不到 git 可执行文件

    我试图使用访问密钥克隆 git 存储库 但是当我尝试运行它时 它抛出一个异常 说找不到 git 可执行文件 但我已经安装了 git 并且 in it py 显示了正确的路径 C Program Files Git bin 我还安装了 git
  • 如何在现有裸存储库中创建引用日志信息

    您可能已经知道 默认情况下 git 不会为新的裸存储库启用引用日志更新 问题是 我有一个很长的历史存储库 但它是在我设置 logAllRefUpdates 标志之前创建的 现在我希望其他应用程序可以使用该信息 如何通过对现有存储库进行最少的
  • 我如何才能看到 Github 风格的东西,例如 git -repo 的打孔卡和时间线?

    我正在寻找一个可以可视化 git repo 工作的软件 我喜欢 Github 的一些功能和 Bitbucket 的一些功能 所以我不想使用它们 因为它们并不完美 我正在寻找创建类似视觉特征的方法 下面你可以找到一些部分 但仍然缺少很多谜题
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐