简体中文 ▾ 主题 ▾ 最新版本 ▾ gitglossary 上次更新于 2.51.0

名称

gitglossary - Git 术语表

概要

*

描述

备用对象数据库

通过 alternates 机制,一个 仓库 可以从另一个称为“备用”的对象数据库继承部分 对象数据库

裸仓库

裸仓库通常是一个以 .git 后缀命名的适当命名的 目录,其中没有本地签出的任何受版本控制的文件副本。也就是说,通常存在于隐藏的 .git 子目录中的所有 Git 管理和控制文件都直接存在于 repository.git 目录中,而没有其他文件存在和签出。通常,公共仓库的发布者会提供裸仓库。

blob 对象

无类型 对象,例如文件的内容。

分支

“分支”是一条开发线。分支上最新的 提交 被称为该分支的尖端。分支的尖端由一个分支 head 引用,该 head 随着分支上进行的额外开发而向前移动。单个 Git 仓库 可以跟踪任意数量的分支,但您的 工作树 只与其中一个(“当前”或“已签出”的分支)相关联,而 HEAD 指向该分支。

缓存

已废弃:索引

一个对象列表,列表中的每个 对象 都包含对其后继者的引用(例如,提交 的后继者可能是其 父项 之一)。

更改集

BitKeeper/cvsps 对“提交”的说法。由于 Git 不存储更改,而是存储状态,因此使用“更改集”一词对 Git 来说确实没有意义。

签出

使用 对象数据库 中的 树对象blob 更新所有或部分 工作树 的操作,并在整个工作树指向新 分支 时更新 索引HEAD

挑选提交

SCM 术语中,“cherry pick”意味着从一系列更改(通常是提交)中选择一部分更改,并将它们记录为不同代码库之上的新一系列更改。在 Git 中,这通过“git cherry-pick”命令来完成,以提取现有 提交 引入的更改,并将其记录在当前 分支 的尖端之上,作为一个新提交。

干净

如果 工作树 与当前 head 引用的 修订 相对应,则该工作树是干净的。另请参阅“”。

提交

作为名词:Git 历史中的一个单一节点;项目的整个历史表示为一组相互关联的提交。Git 在其他版本控制系统使用“修订”或“版本”的地方,通常也使用“提交”一词。也用作 提交对象 的简写。

作为动词:通过创建一个代表当前 索引 状态的新提交并使 HEAD 指向新提交来将项目状态的新快照存储在 Git 历史中的操作。

提交图概念、表示和用法

对象数据库中提交形成的 DAG 结构的同义词,由分支尖端 引用,并使用它们链接提交的 。此结构是确定的提交图。该图可以以其他方式表示,例如 “提交图文件”

提交图文件

“提交图”(通常用连字符)文件是 提交图 的补充表示,用于加速提交图遍历。“提交图”文件存储在 .git/objects/info 目录或备用对象数据库的 info 目录中。

提交对象

一个 对象,包含有关特定 修订 的信息,例如 父项、提交者、作者、日期以及与存储的修订的顶层 目录 相对应的 树对象

commit-ish(也叫 committish)

一个 提交对象 或一个可以递归 解引用 到提交对象的 对象。以下都是 commit-ish:提交对象、指向提交对象的 标签对象、指向指向提交对象的标签对象的标签对象等。

核心 Git

Git 的基本数据结构和实用程序。只暴露有限的源代码管理工具。

DAG

有向无环图。 提交对象 形成一个有向无环图,因为它们有父项(有向),并且提交对象的图是无环的(没有 以相同的 对象 开头和结尾)。

悬空对象

一个 不可达对象,即使从其他不可达对象也无法 到达;悬空对象没有来自 仓库 中任何引用或 对象 的引用。

解引用

指代 符号引用:访问符号引用所指向的 引用 的操作。递归解引用涉及对结果引用重复上述过程,直到找到非符号引用为止。

指代 标签对象:访问标签指向的 对象 的操作。标签通过对结果对象重复操作来递归解引用,直到结果具有指定的 对象类型(如果适用)或任何非“标签”对象类型。在标签的上下文中,“递归解引用”的同义词是“剥离”。

指代 提交对象:访问提交的树对象的操作。提交不能递归解引用。

除非另有说明,否则在 Git 命令或协议的上下文中,“解引用”是隐式递归的。

分离 HEAD

通常 HEAD 存储一个 分支 的名称,而对 HEAD 代表的历史进行操作的命令则操作指向分支尖端的历史。但是,Git 也允许您 签出 一个任意的 提交,该提交不一定是任何特定分支的尖端。处于这种状态的 HEAD 被称为“分离”。

请注意,在 HEAD 分离状态下,对当前分支历史进行操作的命令(例如,git commit 在其之上构建新历史)仍然有效。它们会更新 HEAD 以指向更新历史的尖端,而不会影响任何分支。显然,更新或查询有关当前分支的信息的命令(例如,设置当前分支与哪个远程跟踪分支集成(git branch --set-upstream-to))无效,因为在这种状态下没有(真正的)当前分支可以查询。

目录

使用“ls”命令获得的列表 :-)

工作树 包含尚未 提交 到当前 分支 的修改时,该工作树被称为“脏”的。

恶意合并

恶意合并是指引入在任何 父项 中都不存在的更改的 合并

快进

快进是一种特殊的 合并 类型,当您有一个 修订 并且正在“合并”另一个 分支 的更改,而这些更改恰好是您现有分支的后代。在这种情况下,您不会创建一个新的 合并 提交,而是仅将您的分支更新为指向与您正在合并的分支相同的修订。这在远程 仓库远程跟踪分支 上会经常发生。

抓取

抓取一个 分支 意味着从远程 仓库 获取该分支的 head ref,找出本地 对象数据库 中缺少哪些对象,并将它们也获取过来。另请参阅 git-fetch[1]

文件系统

Linus Torvalds 最初设计 Git 是作为一个用户空间文件系统,即用于保存文件和目录的基础设施。这确保了 Git 的效率和速度。

Git 存档

(面向存档人员)仓库 的同义词。

gitfile

工作树根目录下放置的普通文件 .git,它指向实际仓库的目录。有关正确使用,请参阅 git-worktree[1]git-submodule[1]。有关语法,请参阅 gitrepository-layout[5]

嫁接

嫁接通过记录提交的虚假祖先信息,使两个原本不同的开发线得以连接起来。这样,您可以让 Git 假装一个 提交 所拥有的 父项 列表与创建提交时记录的列表不同。通过 .git/info/grafts 文件进行配置。

请注意,嫁接机制已过时,可能导致仓库间对象传输出现问题;请参阅git-replace[1]以获取更灵活和健壮的实现相同功能的系统。

哈希

在 Git 的上下文中,与 对象名称 同义。

head

指向 分支 尖端 提交命名引用。Head 存储在 $GIT_DIR/refs/heads/ 目录下的文件中,除非使用打包引用。 (参见 git-pack-refs[1]。)

HEAD

当前 分支。更详细地说:您的 工作树 通常来源于 HEAD 引用的树的状态。HEAD 是对您仓库中某个 head 的引用,除非使用 分离 HEAD,在这种情况下,它直接引用任意提交。

head ref

head 的同义词。

钩子

在多个 Git 命令的正常执行过程中,会调用可选脚本,允许开发人员添加功能或检查。通常,钩子允许在命令执行前进行验证并可能中止,并在操作完成后进行事后通知。钩子脚本位于 $GIT_DIR/hooks/ 目录中,通过简单地删除文件名中的 .sample 后缀即可启用。在 Git 的早期版本中,您必须使其可执行。

索引

一组具有状态信息的文件,其内容存储为对象。索引是您 工作树 的存储版本。事实上,它还可以包含工作树的第二个甚至第三个版本,这些版本在 合并 时使用。

索引项

存储在 索引 中关于特定文件的信息。如果 合并 已启动但尚未完成(即,如果索引包含该文件的多个版本),则索引项可能未合并。

主分支

默认的开发 分支。每当您创建一个 Git 仓库 时,都会创建一个名为“master”的分支,并使其成为活动分支。在大多数情况下,这包含本地开发,但这纯粹是约定俗成,并非强制要求。

合并

作为动词:将另一个 分支(可能来自外部 仓库)的内容合并到当前分支。如果合并进来的分支来自不同的仓库,则首先通过 抓取 远程分支,然后将结果合并到当前分支。这种抓取和合并操作的组合称为 拉取。合并通过一个自动过程来识别分支分叉以来所做的更改,然后将所有这些更改一起应用。在更改发生冲突的情况下,可能需要手动干预来完成合并。

作为名词:除非是 快进,否则成功的合并将创建一个代表合并结果的新 提交,并将其 父项 设置为被合并 分支 的尖端。此提交被称为“合并提交”,有时也简称为“合并”。

对象

Git 中的存储单元。它由其内容的 SHA-1 唯一标识。因此,对象无法更改。

对象数据库

存储一组“对象”,单个 对象 由其 对象名称 标识。对象通常位于 $GIT_DIR/objects/

对象标识符 (oid)

对象名称 的同义词。

对象名称

一个 对象 的唯一标识符。对象名称通常表示为 40 个字符的十六进制字符串。也俗称 SHA-1

对象类型

标识符“commit”、“tree”、“tag”或“blob”之一,用于描述 对象 的类型。

章鱼合并

合并两个以上的 分支

孤立

进入一个尚不存在的 分支(即一个 未出生 的分支)的操作。在此操作之后,首次创建的提交将成为一个没有父项的提交,从而开始一个新的历史。

origin

默认的上游 仓库。大多数项目至少有一个它们跟踪的上游项目。默认情况下,origin 用于此目的。新的上游更新将被抓取到名为 origin/name-of-upstream-branch 的 远程跟踪分支 中,您可以使用 git branch -r 查看它们。

覆盖

仅更新和添加文件到工作目录,但不删除它们,类似于 cp -R 会更新目标目录中的内容。这是从 索引tree-ish 签出文件时,签出 中的默认模式。相反,无覆盖模式也会删除源中不存在的跟踪文件,类似于 rsync --delete

打包

一组被压缩成一个文件(以节省空间或高效传输)的对象。

打包索引

用于帮助高效访问打包文件内容的 打包 文件中对象的标识符列表和其他信息。

路径规范

用于限制 Git 命令中路径的模式。

路径规范用于“git ls-files”、“git ls-tree”、“git add”、“git grep”、“git diff”、“git checkout”等许多命令的命令行,以将操作范围限制在树或工作树的某些子集中。请参阅每个命令的文档,了解路径是相对于当前目录还是顶层目录。路径规范的语法如下:

  • 任何路径都匹配自身

  • 路径规范直到最后一个斜杠表示一个目录前缀。该路径规范的范围仅限于该子树。

  • 路径规范的其余部分是匹配路径剩余部分的模式。相对于目录前缀的路径将使用 fnmatch(3) 与该模式匹配;特别是,*? 可以 匹配目录分隔符。

例如,Documentation/*.jpg 将匹配 Documentation 子树中的所有 .jpg 文件,包括 Documentation/chapter_1/figure_1.jpg。

以冒号 : 开头的路径规范具有特殊含义。在短格式中,开头的冒号 : 后面跟着零个或多个“魔术签名”字母(可以选择以另一个冒号 : 结束),其余部分是要与路径匹配的模式。“魔术签名”由既不是字母数字、通配符、正则表达式特殊字符也不是冒号的 ASCII 符号组成。如果模式以不属于“魔术签名”符号集且不是冒号的字符开头,则可以省略终止“魔术签名”的可选冒号。

在长格式中,开头的冒号 : 后面跟着一个开括号 (、一个由零个或多个“魔术单词”组成的逗号分隔列表和一个闭括号 ),其余部分是要与路径匹配的模式。

仅包含冒号的路径规范表示“没有路径规范”。此形式不应与其他路径规范结合使用。

top

魔术单词 top(魔术签名:/)使模式从工作树的根目录开始匹配,即使您正在从子目录中运行命令。

literal

模式中的通配符,例如 *?,被视为字面字符。

icase

不区分大小写的匹配。

glob

Git 将模式视为 shell glob,适合使用 FNM_PATHNAME 标志传递给 fnmatch(3):模式中的通配符将不会匹配路径名中的 /。例如,“Documentation/*.html”匹配“Documentation/git.html”,但不匹配“Documentation/ppc/ppc.html”或“tools/perf/Documentation/perf.html”。

与完整路径名匹配的模式中,两个连续的星号(**)可能具有特殊含义:

  • 开头的“**”后面跟着一个斜杠表示在所有目录中匹配。例如,“**/foo”在任何地方匹配文件或目录“foo”。“**/foo/bar”匹配目录“foo”下任何位置的文件或目录“bar”。

  • 末尾的“/**”匹配其中的所有内容。例如,“abc/**”匹配目录“abc”下的所有文件,相对于 .gitignore 文件的位置,深度无限。

  • 斜杠后跟两个连续的星号,然后是斜杠,匹配零个或多个目录。例如,“a/**/b”匹配“a/b”、“a/x/b”、“a/x/y/b”等等。

  • 其他连续的星号被视为无效。

    Glob 魔术与字面魔术不兼容。

attr

attr: 之后是一个空格分隔的“属性要求”列表,所有这些要求都必须满足,路径才会被视为匹配;这是对通常的非魔术路径规范模式匹配的补充。参见 gitattributes[5]

路径的每个属性要求都采取以下形式之一:

  • ATTR”要求设置属性 ATTR

  • -ATTR”要求取消设置属性 ATTR

  • ATTR=VALUE”要求将属性 ATTR 设置为字符串 VALUE

  • !ATTR”要求属性 ATTR 未指定。

    请注意,在匹配树对象时,属性仍然从工作树获取,而不是从给定的树对象获取。

exclude

在路径匹配任何非排除路径规范后,它将通过所有排除路径规范(魔术签名:! 或其同义词 ^)进行处理。如果匹配,则忽略该路径。当没有非排除路径规范时,将按调用时未指定任何路径规范的方式将排除应用于结果集。

父项

一个 提交对象 包含一个(可能为空的)开发线中的逻辑前驱列表,即其父项。

剥离

递归 解引用 标签对象 的操作。

拾取器

术语 拾取器 指的是 diffcore 例程的一个选项,该选项有助于选择添加或删除给定文本字符串的更改。使用 --pickaxe-all 选项,可以用来查看引入或删除特定文本行(例如)的完整 更改集。参见 git-diff[1]

底层命令

核心 Git 的一个有趣的称呼。

上层命令

依赖于 核心 Git 的程序和程序套件的有趣称呼,它们提供了对核心 Git 的高级访问。上层命令比 底层命令 暴露了更多的 SCM 接口。

每个工作树的引用

每个 工作树 的引用,而不是全局的。目前只有 HEAD 和任何以 refs/bisect/ 开头的引用,但将来可能包括其他不寻常的引用。

伪引用

具有不同于普通引用的语义的引用。这些引用可以通过常规 Git 命令读取,但不能通过 git-update-ref[1] 等命令写入。

Git 已知的伪引用如下:

  • FETCH_HEADgit-fetch[1]git-pull[1] 写入。它可能指向多个对象 ID。每个对象 ID 都用元数据进行注释,指示其从何处抓取以及抓取状态。

  • MERGE_HEADgit-merge[1] 在解决合并冲突时写入。它包含所有正在合并的提交 ID。

拉取

拉取一个 分支 意味着 抓取 它并 合并 它。另请参阅 git-pull[1]

推送

推送一个 分支 意味着从远程 仓库 获取该分支的 head ref,检查它是否是本地 head ref 的祖先,如果是,则将所有 可达 自本地 head ref 的对象,且这些对象在远程仓库中缺失,放入远程 对象数据库,并更新远程 head ref。如果远程 head 不是本地 head 的祖先,则推送失败。

可达

给定 提交 的所有祖先被认为是“可达”自该提交。更普遍地说,一个 对象 可达自另一个对象,如果我们可以通过一个遵循 标签 到它们所标记的内容、提交 到它们的父项或树、以及 到它们包含的树或 blob 来从一个对象到达另一个对象。

可达性位图

可达性位图存储了打包文件或多打包索引(MIDX)中选定提交的可达性信息,以加快对象搜索速度。位图存储在“.bitmap”文件中。一个仓库最多可以使用一个位图文件。位图文件可以属于一个打包文件,或属于仓库的多打包索引(如果存在)。

变基

将一系列来自 分支 的更改重新应用到不同的基准上,并将该分支的 head 重置为结果。

引用

指向对象名或另一个引用的名称(后者称为符号引用)。为方便起见,在用作Git命令的参数时,引用有时可以缩写;有关详细信息,请参阅gitrevisions[7]。引用存储在仓库中。

引用命名空间是分层的。引用名称必须以refs/开头,或位于层次结构的根目录中。对于后者,其名称必须遵循以下规则:

  • 名称仅由大写字符或下划线组成。

  • 名称以“_HEAD”结尾,或等于“HEAD”。

    在不符合这些规则的层次结构根目录中存在一些不规则引用。以下列表是详尽的,将来不会扩展:

  • AUTO_MERGE

  • BISECT_EXPECTED_REV

  • NOTES_MERGE_PARTIAL

  • NOTES_MERGE_REF

  • MERGE_AUTOSTASH

    不同的子层次结构用于不同的目的。例如,refs/heads/层次结构用于表示本地分支,而refs/tags/层次结构用于表示本地标签。

reflog

reflog显示引用的本地“历史”。换句话说,它可以告诉您仓库中倒数第三个修订版是什么,以及仓库昨天下午9:14的当前状态是什么。有关详细信息,请参阅git-reflog[1]

refspec

“refspec”由fetchpush用于描述远程引用和本地引用之间的映射。有关详细信息,请参阅git-fetch[1]git-push[1]

远程仓库

用于跟踪同一项目但位于其他地方的仓库。要与远程仓库通信,请参阅fetchpush

远程跟踪分支

用于跟踪另一个仓库的更改的引用。它通常看起来像refs/remotes/foo/bar(表示它跟踪远程foo中的一个名为bar的分支),并且匹配已配置的fetch refspec的右侧。远程跟踪分支不应包含直接修改或对其进行本地提交。

仓库

一组引用以及一个对象数据库,其中包含从引用可达的所有对象,可能还附带一个或多个porcelains的元数据。仓库可以通过alternates机制与其他仓库共享对象数据库。

解决

手动修复失败的自动合并遗留问题。

修订

(名词)提交的同义词。

回退

丢弃一部分开发工作,即head指向更早的修订

SCM

源代码管理(工具)。

SHA-1

“安全散列算法1”(Secure Hash Algorithm 1);一种加密散列函数。在Git的上下文中用作对象名的同义词。

浅层克隆

很大程度上是浅层仓库的同义词,但该短语更明确地表示它是通过运行git clone --depth=...命令创建的。

浅层仓库

浅层仓库具有不完整的历史,其中一些提交父提交已被“烧蚀”(换句话说,Git被告知假装这些提交没有父提交,即使它们已记录在提交对象中)。这有时在您只对项目的近期历史感兴趣但上游记录的实际历史要大得多时很有用。通过给git-clone[1]提供--depth选项来创建浅层仓库,并且其历史以后可以用git-fetch[1]加深。

stash条目

一个对象,用于临时存储工作目录和索引的内容,以便将来重用。

子模块

一个仓库,它在另一个仓库(后者称为超项目)内部保存单独项目的历史。

超项目

一个仓库,它在其工作树中将其他项目的仓库引用为子模块。超项目知道(但并不拥有)所包含子模块的提交对象的名称。

符号引用

符号引用:它不包含SHA-1 ID本身,而是采用ref: refs/some/thing的格式,当被引用时,它会递归地解引用到该引用。HEAD是符号引用的主要示例。可以使用git-symbolic-ref[1]命令来操作符号引用。

标签

位于refs/tags/命名空间下的引用,指向一个任意类型的对象(通常标签指向标签提交对象)。与head相反,标签不会被commit命令更新。Git标签与Lisp标签(在Git的上下文中称为对象类型)无关。标签最常用于标记提交祖先中的特定点。

标签对象

一个对象,包含一个指向另一个对象的引用,该对象可以像提交对象一样包含消息。它还可以包含(PGP)签名,在这种情况下称为“签名标签对象”。

主题分支

一个常规的Git分支,开发人员用它来识别概念性的开发线。由于分支非常容易创建且成本低廉,因此通常希望有几个小的分支,每个分支都包含非常明确的概念或小的增量但相关的更改。

尾注

键值元数据。尾注有时会出现在提交消息的末尾。在其他社区中可能称为“页脚”或“标签”。请参阅git-interpret-trailers[1]

可以是工作树,也可以是树对象以及相关的blob和树对象(即工作树的存储表示)。

树对象

一个对象,包含一个文件名称和模式列表,以及指向相关blob和/或树对象的引用。等同于目录

tree-ish(也称为treeish)

一个树对象或一个可以递归解引用为树对象的对象。解引用提交对象会产生与修订的顶级目录对应的树对象。以下都是tree-ishes:一个commit-ish,一个树对象,一个指向树对象的标签对象,一个指向指向树对象的标签对象的标签对象,依此类推。

未出生

HEAD可以指向一个尚不存在且尚未包含任何提交的分支,这样的分支称为未出生分支。用户最常遇到未出生分支的情况是创建一个新仓库而未从别处克隆。HEAD将指向尚未“诞生”的main(或master,取决于您的配置)分支。某些操作还可能使用其孤立选项将您带到未出生分支。

未合并索引

包含未合并索引条目索引

不可达对象

一个对象,它不能从分支标签或任何其他引用可达

上游分支

合并到给定分支的默认分支(或者给定分支是基于它rebase的)。它通过branch..remote和branch..merge进行配置。如果A的上游分支是origin/B,有时我们会说“A正在跟踪origin/B”。

工作树

实际检出的文件树。工作树通常包含HEAD提交的树的内容,加上您已做的但尚未提交的任何本地更改。

工作树

一个仓库可以有零个(即裸仓库)或一个或多个附加的工作树。一个“工作树”由一个“工作目录”和仓库元数据组成,其中大部分由单个仓库的其他工作树共享,而有些则按工作树单独维护(例如,索引、HEAD和伪引用如MERGE_HEAD,每个工作树的引用和每个工作树的配置文件)。

GIT

Git[1] 套件的一部分