Git 中的 commit-ish 和 tree-ish 是什么?

2023-11-27

问题

Git 中 commit-ish 和 tree-ish 的具体例子有哪些?

堆栈溢出问题“git 中的 tree-ish 是什么意思?”交易 特别是树型,但我想了解更多both.

背景

文档中的用法

Git 文档多次提到“commit-ish”并且 “树状”。例如,如果您正在检查Git 源代码:

$ git grep --files-with-matches --extended-regexp "commit(-)*ish"
config.txt
git-describe.txt
git-fast-import.txt
git-name-rev.txt
git-push.txt
git-rebase.txt
git-rev-parse.txt
git.txt
gitcli.txt
glossary-content.txt
howto/revert-branch-rebase.txt
revisions.txt

and

$ git grep --files-with-matches --extended-regexp "tree(-)*ish" | \
$ grep --invert-match RelNotes
diff-format.txt
diff-generate-patch.txt
git-archive.txt
git-cat-file.txt
git-checkout.txt
git-diff-index.txt
git-diff-tree.txt
git-ls-files.txt
git-ls-tree.txt
git-merge-tree.txt
git-read-tree.txt
git-reset.txt
git-svn.txt
git.txt
gitcli.txt
gittutorial-2.txt
glossary-content.txt
revisions.txt

定义

Git 文档定义什么是“commit-ish”和“tree-ish”:

<tree>

表示树对象名称。

<commit>

表示提交对象名称。

<tree-ish>

指示树、提交或标记对象名称。一个命令需要一个<tree-ish>论证最终想要在一个<tree>对象但自动 取消引用<commit> and <tag>指向 a 的对象<tree>.

<commit-ish>

表示提交或标记对象名称。一个命令需要一个<commit-ish>论证最终想要在一个<commit>对象但自动 取消引用<tag>指向 a 的对象<commit>.

文档不够清晰

尽管上面的文档定义了“commit-ish”和“tree-ish”是什么, 我仍然觉得它太模糊和不明确。

“commit-ish”和“tree-ish”的具体示例是什么?它们是如何实现的 彼此不同?


简短回答(TL;DR)

这是提交式和树式标识符的完整列表(来自吉特 修订文档):

----------------------------------------------------------------------
|    Commit-ish/Tree-ish    |                Examples
----------------------------------------------------------------------
|  1. <sha1>                | dae86e1950b1277e545cee180551750029cfe735
|  2. <describeOutput>      | v1.7.4.2-679-g3bee7fb
|  3. <refname>             | master, heads/master, refs/heads/master
|  4. <refname>@{<date>}    | master@{yesterday}, HEAD@{5 minutes ago}
|  5. <refname>@{<n>}       | master@{1}
|  6. @{<n>}                | @{1}
|  7. @{-<n>}               | @{-1}
|  8. <refname>@{upstream}  | master@{upstream}, @{u}
|  9. <rev>^                | HEAD^, v1.5.1^0
| 10. <rev>~<n>             | master~3
| 11. <rev>^{<type>}        | v0.99.8^{commit}
| 12. <rev>^{}              | v0.99.8^{}
| 13. <rev>^{/<text>}       | HEAD^{/fix nasty bug}
| 14. :/<text>              | :/fix nasty bug
----------------------------------------------------------------------
|       Tree-ish only       |                Examples
----------------------------------------------------------------------
| 15. <rev>:<path>          | HEAD:README.txt, master:sub-directory/
----------------------------------------------------------------------
|         Tree-ish?         |                Examples
----------------------------------------------------------------------
| 16. :<n>:<path>           | :0:README, :README
----------------------------------------------------------------------

标识符 #1-14 都是“commit-ish”,因为它们都会导致提交,但是 因为提交也指向目录树,所以它们最终都会导致 (子)目录树对象,因此也可以用作“tree-ish”。

#15 当引用(子)目录时也可以用作树形目录,但它 也可用于识别特定文件。当它提到文件时,我不是 确定它是否仍然被认为是“tree-ish”,或者是否更像“blob-ish”(Git 将文件称为“blob”)。

长答案

Git 中的提交和目录树

在最低级别,Git 使用四个基本功能来跟踪源代码 对象:

  1. 带注释的标签,指向提交。
  2. 提交,它指向项目的根目录树。
  3. 树,是目录和子目录。
  4. Blob,即文件。

每个对象都有自己的 sha1 哈希 ID,因为 Linus Torvalds 设计了 Git 就像内容可寻址文件系统,即可以检索文件 基于其内容(sha1 ID 由文件内容生成)。专业 Git 书给了这个示例图:

Figure 9-3 from Pro Git book

提交式 vs 树式

许多 Git 命令可以接受提交和(子)目录的特殊标识符 树木:

  • “Commit-ish”是最终导致提交对象的标识符。例如,

    tag -> commit

  • “Tree-ish”是最终导致树(即目录)对象的标识符。

    tag -> commit -> project-root-directory

因为提交对象总是指向目录树对象(根 项目的目录),任何“commit-ish”的标识符都是 定义,也“树状”。换句话说,任何导致的标识符 commit 对象也可用于指向(子)目录树对象.

但由于目录树对象从不指向 Git 版本控制中的提交 系统中,并非每个指向(子)目录树的标识符都可以 用于指向提交。换句话说,一组“commit-ish”标识符 是“树状”标识符集的严格子集。

树状标识符的集合不能用作 commit-ish are

  1. <rev>:<path>, 这导致directly到目录树,而不是提交 对象。例如,HEAD:subdirectory.

  2. Sha1 标识符目录树对象。

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

Git 中的 commit-ish 和 tree-ish 是什么? 的相关文章

  • 如何损坏 Git 存储库?

    创建损坏的 git 存储库有哪些方法 有没有有趣的方法可以永久损坏 git 存储库 你能否削弱一个 git 存储库 使其行为有些正常 但会做一些奇怪的事情 我的兴趣来自于当有人担心他们是否真的创建了不可恢复的状态时 它通常很容易修复或至少可
  • 如何获取第一次提交的 Git diff?

    我创建了一个存储库 在其中创建了一个文件 在文件中放入了一些内容 然后提交了该文件 现在 我想查看该提交的差异 理想情况下应该显示添加的文件以及添加到其中的行 然而 git diff HEAD HEAD回报fatal ambiguous a
  • 有关多个远程存储库的 Git 状态

    我有一个脚本 如果我忘记在 40 多个存储库中提交或推送一些代码 它会通过电子邮件向我发送提醒 在我的两个项目中 我遵循了这些帖子中的答案 其中我设置了 git push 来推送到多个存储库 从多个远程位置拉 推 https stackov
  • web2py git 集成 - localhost 和 pythonanywhere

    我完全不知道如何将 Github 集成到 web2py 中 我在 USB 上安装了 web2py任何地方的Python http www pythonanywhere com web2py概述文档chapter3http web2py co
  • 主存储库和本地存储库在同一台机器上

    我是 Git 新手 我已经在 Linux 服务器中创建了一个主存储库 同一个服务器将由 5 组 每组 3 个用户 使用 我想为每个组创建一个本地存储库 小组成员又应该为每个人创建一个本地存储库 使用内容并将修改提交到小组的本地存储库 我该怎
  • Git refs/remotes/origin/master 没有指向有效的对象

    在上次合并到 Git 存储库的 master 分支后 我失去了克隆存储库的能力 Cloning into test repository remote Counting objects 126084 done remote Compress
  • 无法将 git add origin git@anything 与新的 git 目录一起使用

    我有一个项目 我正在生成许多提交 因此它占用的空间正在快速增长 由于我有一个 gitlab 页面来推送提交 因此我决定最好删除本地 git 目录中的这些旧提交 因为我始终可以从 gitlab 获取它们 为此 我只需删除本地 git 目录 然
  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • 合并之间的 git rebase 会导致完全不相关的文件发生冲突

    我有一个大型 Git 存储库 几个月前引入了一个错误 我想bisect它 首先引入一个过去的提交 存储库 然后重播合并 做rebase到新的 commit 如下图所示 据我了解 由于合并 Git 似乎无法正常工作 预期的 但我想更好地了解为
  • 如何将普通的 Git 存储库转换为裸存储库?

    如何将 普通 Git 存储库转换为裸存储库 主要区别似乎是 在普通的 Git 存储库中 你有一个 git存储库内的文件夹 包含构成工作副本的所有相关数据和所有其他文件 在裸露的 Git 存储库中 没有工作副本和文件夹 我们称之为repo g
  • 当出现错误时如何删除远程分支?

    我尝试过以下命令 但失败了 git push origin next remote error denying ref deletion for refs heads next To blah git remote rejected nex
  • 无法从我的电脑上使用 traefik 后面的 gitlab 进行 git 克隆

    这是我的 gitlab 和 traefik 配置 version 3 7 services gitlab web image gitlab gitlab ce latest restart always hostname gitlab ro
  • 如何在Windows上分离“Git bash”中启动的“git gui”?

    例如 我开始 git bash 我导航到某个目录 I start git gui 我关闭控制台窗口或按 Ctrl C Git gui 的窗口消失了 即使我用过git gui disown 即使当我按 Ctrl C 时它不在前台 如何正确分离
  • 自动生成/删除詹金斯工作

    我正在寻找一种自动创建一组詹金斯作业的方法 通常在创建新的 git 分支之后 我已经为maven尝试过这个插件 http evgeny goldin com wiki Maven jenkins plugin http evgeny gol
  • 致命:无法将 HEAD 解析为有效引用

    我正进入 状态fatal Failed to resolve HEAD as a valid ref 每当我尝试承诺时 我努力了 echo ref refs heads master gt git HEAD 但它不起作用 也尝试过 git
  • 未能将一些参考推送至 [email protected]

    当我尝试推送到 Heroku 存储库时收到此错误 我已经设置了autocrlf false在gitconfig中 但这个问题仍然存在 我也尝试过这个解决方案here https stackoverflow com questions 566
  • 如何签出仅在“git ls-remote”中列出的分支?

    我遇到了无法切换到仅列出的分支的情况git ls remote 这是详细信息 我分叉了一个 github repoA 作为 repoB 创建了自己的分支并将其推送到 ComputerA 中的 repoB 在 ComputerB 中 我将分叉
  • git 如何查找分支源自的提交哈希

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

    是否有一些程序 或者我错过的一些神奇的 git 插件 可以从 git 存储库获取影响图或类似的东西 而无需通过 github 就数据收集而言 我可以生成图表 我不确定从哪里开始编写自己的代码 我假设有一些标志我可以传递给 git log 来
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下

随机推荐

  • 如何检测用户鼠标移动的距离?

    我正在尝试检测鼠标移动的距离 以像素为单位 我目前正在使用 document mousemove function event var startingTop 10 startingLeft 22 math Math abs startin
  • 我的虚拟主机上的 Apache 500 内部服务器错误 [已关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我的 Web 应用程序项目位于 media disk1 Projects 中的文件夹中 我想使用 Apache 虚拟主机为他们提供服务http lab 这就是我设置虚拟主机的方式 1
  • java 字符串排列组合查找

    我正在写一个Android单词应用程序 我的代码包含一个方法 该方法可以查找字符串和最小长度为 3 的 7 个字母字符串的子字符串的所有组合 然后将所有可用组合与字典中的每个单词进行比较 以找到所有有效单词 我正在使用递归方法 这是代码 G
  • 在具有 500e6 行的 hdf5 pytable 中查找重复项

    Problem 我有一个大型 gt 500e6 行 数据集 已放入 pytables 数据库中 假设第一列是 ID 第二列是每个 ID 的计数器 每个 ID 计数器组合必须是唯一的 我在尝试查找的 500e6 行中有一个非唯一行 作为初学者
  • 设置脚本以在电子邮件通知中包含 Google 文档表单数据

    我已经使用 googledocs 设置了一个表单 我只想将输入到表单中的实际数据通过电子邮件发送给我 而不是建议表单已完成的一般回复 我没有代码等方面的技能或经验 但确信我可以解决这个问题 我花了几个小时 但没有任何运气 我的表格非常基本
  • 如何对无序 std::pair 进行 std::hash

    我希望能够使用std pair作为 unordered container 中的键 我知道我可以通过以下方式做到这一点 template
  • IOS:在 xcode 中为我的应用程序设置默认语言

    我启动了我的 xcode 项目 并进行了以下设置 在 xcode 5 中它添加了这种 基本 语言 但我不明白它是如何工作的 我想将默认语言设置为英语而不是意大利语 例如 如果用户将其设备设置为西班牙语或法语 则它必须看到英语版应用程序 而不
  • 计算 C# 中 XmlNode 的总数

    我试图找到一种方法来递归地从 XmlNode 获取子节点的总数 这就是说我想计算所有的孩子 孙子等 我认为它就像 node SelectNodes
  • 带有域字段的 CORS cookie 仅在 Firefox 中使用 jQuery AJAX 设置

    我无法设置 cookiedomain使用跨站点请求添加归档 我试图通过 jquery ajax 调用 request 来实现这一点 是否可以在除 Firefox 之外的其他浏览器中使用它 一些请求标头 Accept application
  • 从 JSON 字符串创建 Hashmap

    从java中的json字符串创建hashmap 我有 json 字符串 例如 phonetype N95 cat WP 并想转换成标准的Hashmap 我该怎么做 解析 JSONObject 并创建 HashMap public stati
  • Android 按钮背景选择器

    我想使用以下按钮选择器
  • 在 Angular JS 中动态应用 CSS 样式属性

    这应该是一个简单的问题 但我似乎找不到解决方案 我有以下标记 div style width 20px height 20px margin top 10px border solid 1px black background color
  • 如何将按钮添加到settings.bundle?

    我正在开发一个 iPhone 应用程序 默认情况下用户保持登录状态 如果他想注销 他应该打开 设置 并单击 注销 按钮 这将删除他的数据并在下次打开应用程序时要求登录 如何添加这样的按钮 就像 Twitter 设置中一样 正如 CodaFi
  • vb.net 从创建它的线程以外的线程访问

    我正在尝试将文本设置为标签Label caller Text phone number我收到此错误 System InvalidOperationException 跨线程操作无效 从创建它的线程以外的线程访问控制 Label caller
  • 如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法

    我用 Spring Boot 开发了一个应用程序 运行良好 有一个安静的控制器 我尝试向某些页面添加 spring security 其余控制器的端点是 api greetings 我在下面的类中配置了安全设置 Configuration
  • 解析 xml 时出错:与 Facebook SDK 未绑定前缀

    我的项目无法识别 xml 中的 com facebook widget ProfilePictureView 或其他小部件 我导入了 facebook sdk 甚至用它来登录并与 open graph 交互 这一切都有效 我只是想添加一个个
  • 如何用D3添加简单的圆弧

    我想在图表部分添加一个简单的弧线 如圆 vis append circle style stroke gray style fill white attr r 40 attr cx 50 attr cy 50 所提供的D3的例子正在处理数据
  • 如何在for循环中使用setInterval函数

    我正在尝试在给定可变项目列表的情况下运行多个计时器 代码看起来像这样 var list Array for var x in list setInterval function list x 10 console log x gt list
  • 在堆栈跟踪中获取 VB.NET 行号

    我有一个 VB NET 2010 Winforms 应用程序 我想在堆栈跟踪中包含行号 我已阅读以下问题和答案 如何在VB net中运行应用程序时打印行号 其中提到 您始终需要在代码中包含 PDB 文件 其中包含在此类情况下使用的调试信息
  • Git 中的 commit-ish 和 tree-ish 是什么?

    问题 Git 中 commit ish 和 tree ish 的具体例子有哪些 堆栈溢出问题 git 中的 tree ish 是什么意思 交易 特别是树型 但我想了解更多both 背景 文档中的用法 Git 文档多次提到 commit is