灵活分支与静态分支(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 push heroku master 权限被拒绝

    我正在关注 ruby railstutorial 我运行命令 git push heroku master 它吐出了这个错误 Permission denied publickey fatal Could not read from rem
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • 有没有办法让 git flow 显示它在幕后执行的命令?

    有什么方法可以让 git flow 提前告诉我当我执行 flow 命令时它将执行的确切 git 命令吗 或者告诉我它是东吗 我只能看到输出和摘要吗 你可以使用Git的GIT TRACE 环境变量 http git scm com docs
  • 如何正确使用“mvn release:prepare”?

    我尝试了这个命令 用dryrun在我的 Maven 项目上进行测试 mvn release clean release prepare DdryRun true DgenerateBackupPoms false Dtag solocal
  • git 显示已添加到 gitignore 的文件中的更改?

    我已经将 log2 文件夹和 main js 文件添加到 gitignore 如屏幕截图所示 但即使执行后git rm cached r我仍然可以看到 git 正在检测 main js 和 log2 文件夹内文件的更改 怎么会 这些的常见问
  • 如何合并两个连续的 git 存储库

    我有一个相当独特的情况 我有一个名为 Project1 的存储库 我在其中工作了一些时间 几个月 一年后 我创建了存储库 Project1 Again 从 Project1 停止的地方开始 现在 我希望修订历史记录是连续的 因此我希望它们合
  • 如何克隆特定的 Git 标签

    From git clone 1 手册页 http git scm com docs git clone branch还可以在结果存储库中的该提交处获取标签并分离 HEAD 我试过 git clone branch
  • git 提交错误:检测到大文件

    您好 我正在为 ios 8 1 开发一个应用程序 xcode 我已经使用 googleMaps 框架来实现自动完成功能 当我尝试在 Git 中推送我的项目时 我收到大文件检测错误 后来尝试使用 git lfs 并跟踪 git 检测到的文件
  • 如何使用 Git 跟踪目录而不是文件?

    我最近开始使用 Git 但只有一件事遇到了麻烦 如何在不跟踪目录内容的情况下跟踪目录 例如 我正在开发的网站允许上传 我想跟踪上传目录 以便在分支等时创建它 但显然不是其中的文件 在开发分支中的测试文件或主控中的真实文件 在我的 gitig
  • Git 2.2.x 无缘无故更新旧包文件的时间戳

    Git 2 2 0 和 2 2 1 似乎修改了旧的时间戳 git objects pack pack pack偶尔会无缘无故地文件 它只是改变时间戳 内容是相同的 调试这一点很困难 因为它似乎很少进行更改 我在 2 2 0 之前的任何 Gi
  • Git 在哪里存储标签?

    Git 在哪里存储标签 我执行 git tag v0 1 0 v0 10 0 v0 11 0 但目录 git refs tags是空的 Git 将这些标签存储在哪里 谢谢 它们也可以存储在 git packed refs
  • 使当前提交成为 Git 存储库中唯一(初始)提交?

    我目前有一个本地 Git 存储库 我将其推送到 Github 存储库 本地存储库有约 10 次提交 Github 存储库是其同步副本 我想要做的是从本地 Git 存储库中删除所有版本历史记录 以便存储库的当前内容显示为唯一提交 因此存储库中
  • 如何提取 Mercurial 中变更集的所有已更改文件?

    直到最近 我们一直在网络工作室的所有项目中使用 SVN 并且 Subversive 和 TortoiseSVN 等多个客户端中存在一个非常方便的功能 可以提取在某个版本中更改的所有文件 Mercurial 有没有办法做到这一点 我不在乎它是
  • 除非我在项目目录中,否则 Git 不会显示日志

    我正在尝试打电话git log当我在不同的目录中时 我经过的位置 git is git log Users Leica proj1 但它说 不是 git repo 如果我cd进入这个目录 就可以正常工作了 cd Users Leica Pr
  • 如何在不在存储库中的情况下执行 Git 命令?

    有没有一种方法可以在不位于存储库的情况下对存储库执行 Git 命令 例如这样的事情 git home repo log 请不要告诉我cd到它 我正在通过一个exec call Use C作为 git 的第一个参数 git C home re
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Git 的企业采用率?

    最近一些同事之间进行了一场讨论 在当今的软件行业中 如何存在两个不同的世界 面向自由软件 公司的 Question Git 在企业环境中的使用情况如何 您在企业环境中使用 Git 的体验如何 无论如何 我们在工作场所使用 git 每个人都对
  • 部分共享git仓库

    我是 git 新手 我想知道是否支持以下场景 如果支持的话如何支持 即用于设置和更新的 git 命令 可以从三个不同的地方获取存储库 本地 镜像 和 github mirror 完全镜像 local github 镜像 local 但 受版
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 有没有一个简单的命令可以将分支转换为标签?

    我即将完成将 哑快照 转换为 git 的繁琐过程 这个过程进展得非常顺利 感谢这个重命名过程 https stackoverflow com questions 6628539 how to tell git that its the sa

随机推荐