为什么 Git 不将分支名称存储为提交的一部分?

2023-11-26

请注意:我并不是想重新争论 Mercurial 还是 Git 哪个更好,我只是有一个技术问题,作为 Mercurial 用户,我不明白。我也不确定 SO 是否是问这样的问题的正确地方,但它is编程相关。

从用户的角度来看,关于 Git 和 Mercurial 这两个版本控制系统之间的区别已经有很多讨论了(例如Mercurial 和 Git 有什么区别? and http://felipec.wordpress.com/2011/01/16/mercurial-vs-git-its-all-in-the-branches/),主要区别在于分支的处理。我读过很多这样的讨论,但我不断问自己这个问题:

为什么 Git 不将分支名称存储为提交的一部分?

我实在看不出有什么理由不这样做。这意味着数据不能因为没有指向它的引用(标签、分支等)而简单地消失。

我认为将分支存储在提交中对于 Mercurial 来说是一个很大的优势,因为这使得丢失数据变得更加困难。

支持 Git 分支模型的 Git 人群的主要观点是,您可以简单地删除分支,但这并不妨碍 Git 将分支名称存储为每次提交的一部分:如果删除了某个分支的提交,那么该分支的提交也会被删除。对该分支的引用。它也不会干扰“廉价分支”的论点:分支的管理成本不会更高。而且我认为不需要担心所需的额外存储:每次提交只需几个字节。


关于 Git 和 Mercurial 分支的权威来源之一是 SO 问题:

"Git 和 Mercurial - 比较和对比"

在 Git 中,引用(分支、远程跟踪分支和标签)位于提交的 DAG 之外。

(这允许管理本地和远程分支的有关分支的不同命名空间)

Mercurial 与书签分支(可以推/拉)有类似的概念。

请注意,在 Git 中,数据不会“消失”,因为没有引用:您仍然拥有reflog检索那些未引用的提交。

为什么 Git 不将分支名称存储为提交的一部分?
我实在找不到不这样做的充分理由

想法是分开what已更改(提交)自whym 即来自更改的上下文(分支的名称)。
既然你可以快进合并一个分支,来自一个分支的提交可以随时成为另一个分支的一部分。

因此雅库布·纳伦布斯基质疑 Mercurial“命名分支”(分支名称嵌入变更集元数据中)的设计,尤其是global命名空间,不太适合分散式版本控制系统。

您创建一个分支来隔离开发工作(请参阅“你什么时候应该分支?"),但是对于 DVCS,开发工作(提交集)应该在任何分支名称下发布。一旦发布到另一个 Git 存储库,您定义的本地上下文(分支名称)可能无效。

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

为什么 Git 不将分支名称存储为提交的一部分? 的相关文章

  • 如何 git grep 仅一组文件扩展名

    如何执行 git grep 并将检查的文件限制为一组文件 我希望能够 grep cpp 和 h 文件的内容来查找 MyFunc 例如 git grep MyFunc hc 但是 这也匹配 c 文件和 cs 文件 Use git grep M
  • 为什么我无法创建/签出该分支?

    我正在尝试创建本地 Git 分支 但它不起作用 以下是我正在使用的命令 tablet edit11 git checkout b edit 11 Switched to a new branch edit 11 tablet edit11
  • 有没有办法让 git flow 显示它在幕后执行的命令?

    有什么方法可以让 git flow 提前告诉我当我执行 flow 命令时它将执行的确切 git 命令吗 或者告诉我它是东吗 我只能看到输出和摘要吗 你可以使用Git的GIT TRACE 环境变量 http git scm com docs
  • `git ls-files -s` 输出中不同字段的含义是什么?

    在 Git 中 命令返回的典型结果行git ls files s好像 100755 be2c2e9b0966253096472d4b482c458bc892e493 0 gitignore 这些字段是什么意思 不用再犹豫了git ls fi
  • Composer 用于下载私有 GitHub 存储库

    我无法使用 Composer 下载 github 私人存储库 php composer phar update 我收到以下错误 The https api github com repos company private1 https ap
  • 格里特:! [远程拒绝] HEAD -> refs/publish/master (没有新的更改)

    我做了一些更改 提交了它们并将分支推送到 Gerrit git push gerrit 现在我的更改没有出现在 Gerrit 中 我认为这是因为我手动推送更改而不是使用git 审查 https github com openstack in
  • .gitconfig 别名函数调用

    我在 gitconfig 中定义了以下别名 alias teamcity tc tc是我在我的中定义的一个shell函数 bashrc文件 由于某种原因 我收到以下错误 aafghani 03 git workday amirafghani
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • VS 2015 + Bower:在防火墙后面不起作用

    Problem 在 Visual Studio 2015 中 使用 Bower 我的包在防火墙后面时恢复失败 并出现类似以下内容的错误 ECMDERR 无法执行 git ls remote tags heads git github com
  • 我可以直接从我的谷歌云端硬盘在线推送/拉取吗?

    有一些方法可以通过谷歌驱动器同步 Windows 应用程序将我的本地 git 存储库同步到我的谷歌驱动器 但我想知道我是否可以完全绕过它的需要 Fro eg git remote add origin https drive google
  • 在 Azure DevOps 项目之间移动存储库时保留拉取请求

    我在同一帐户内有两个 Azure DevOps 项目 我想将存储库从一个项目移动到另一个项目 这一页探索如何在具有完全保真历史记录的团队项目之间移动 git 存储库 https learn microsoft com en us azure
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • 如何将工作树与提交进行比较?

    我在用着 git diff mycommit 用于比较我的工作树mycommit 但它似乎忽略当前索引中不存在的文件 您可以按如下方式重现它 git init echo A gt A txt git add git commit m A g
  • 如何使用 AWS Lambda 安装 Git?

    我在代码提交存储库中有代码 我正在编写一个 lambda 函数来为代码提交存储库的每个签入 事件 构建代码 我无法安装 git 因此无法克隆存储库 我该怎么办呢 正如其他人提到的 在 lambda 上安装 git 要么非常困难 要么完全不可
  • Git 将一个分支合并到所有其他分支中

    我知道这个问题已经在这里被问过 https stackoverflow com questions 2329716 merging changes from master into all branches using git https
  • 如何让 Aptana Studio 记住 git ssh 密码

    我找不到任何有关如何获得 Aptana Studio 的内置 git 支持来记住执行推 拉操作的 ssh 密码的指南 信息 有人有什么想法吗 Aptana Studio 实际上是内置的 GIT 程序 它将在 Windows 上的 C Use
  • 使当前提交成为 Git 存储库中唯一(初始)提交?

    我目前有一个本地 Git 存储库 我将其推送到 Github 存储库 本地存储库有约 10 次提交 Github 存储库是其同步副本 我想要做的是从本地 Git 存储库中删除所有版本历史记录 以便存储库的当前内容显示为唯一提交 因此存储库中
  • 除非我在项目目录中,否则 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仓库

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

随机推荐