简体中文 ▾ 主题 ▾ 最新版本 ▾ gitglossary 最后更新于 2.53.0

名称

gitglossary - Git 术语表

概要

*

描述

备用对象数据库 (alternate object database)

通过备用 (alternates) 机制,一个版本库可以从另一个对象数据库继承其部分对象数据库,后者被称为“备用”。

裸版本库 (bare repository)

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

数据对象 (blob object)

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

分支 (branch)

“分支”是一条开发线。分支上最近的一次提交被称为该分支的顶端 (tip)。分支的顶端由一个分支头部 (head) 引用,随着在分支上进行额外的开发,该头部会向前移动。单个 Git 版本库可以跟踪任意数量的分支,但您的工作区仅与其中一个(“当前”或“已检出”的分支)相关联,并且 HEAD 指向该分支。

缓存 (cache)

索引 (index) 的过时术语。

链 (chain)

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

变更集 (changeset)

BitKeeper/cvsps 术语,对应 Git 中的“提交”。由于 Git 不存储变更,而是存储状态,因此在 Git 中使用“变更集”一词并不恰当。

检出 (checkout)

使用来自对象数据库树对象数据对象更新全部或部分工作区的操作,如果整个工作区已指向一个新分支,则还会更新索引HEAD

拣选 (cherry-picking)

SCM 术语中,“拣选”意味着从一系列变更(通常是提交)中选择一个变更子集,并将它们作为一组新的变更记录在不同的代码库之上。在 Git 中,这是通过 "git cherry-pick" 命令执行的,该命令提取现有提交引入的变更,并基于当前分支的顶端将其记录为一次新提交。

干净 (clean)

如果工作区与当前头部引用的修订版本一致,则它是干净的。另见“脏 (dirty)”。

提交 (commit)

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

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

提交图概念、表示和用法

由对象数据库中的提交形成的 DAG 结构的同义词,通过分支顶端引用,使用它们链接提交的。这个结构是最终的提交图。该图也可以用其他方式表示,例如 "commit-graph" 文件

commit-graph 文件

"commit-graph"(通常带连字符)文件是提交图的一种补充表示,它可以加速提交图的遍历。"commit-graph" 文件存储在 .git/objects/info 目录或备用对象数据库的 info 目录中。

提交对象 (commit object)

一种包含特定修订版本信息的对象,例如父提交、提交者、作者、日期,以及对应于所存储修订版本顶层目录树对象

提交类 (commit-ish,也称 committish)

一个提交对象,或者一个可以被递归解引用为提交对象的对象。以下内容都是提交类:提交对象、指向提交对象的标签对象、指向“指向提交对象的标签对象”的标签对象,等等。

核心 Git (core Git)

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

DAG

有向无环图。提交对象构成了一个有向无环图,因为它们有父提交(有向),且提交对象图是无环的(没有以同一个对象开始并结束的)。

悬空对象 (dangling object)

一个甚至无法从其他不可达对象到达不可达对象;悬空对象在版本库中没有被任何引用或对象引用。

解引用 (dereference)

指代符号引用 (symbolic ref):访问该符号引用所指向的引用的操作。递归解引用涉及对生成的引用重复上述过程,直到找到一个非符号引用。

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

指代提交对象 (commit object):访问该提交的树对象的操作。提交不能被递归解引用。

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

游离 HEAD (detached HEAD)

通常 HEAD 存储的是分支的名称,而对 HEAD 所代表的历史记录进行操作的命令,实际上是对指向该分支顶端的历史记录进行操作。然而,Git 也允许您检出一个不一定是任何特定分支顶端的任意提交。处于这种状态下的 HEAD 被称为“游离”状态。

请注意,在 HEAD 处于游离状态时,对当前分支历史记录进行操作的命令(例如,git commit 在其基础上构建新历史记录)仍然有效。它们会更新 HEAD 以指向更新后历史记录的顶端,而不影响任何分支。而更新或查询关于当前分支信息的命令(例如,git branch --set-upstream-to 设置当前分支与哪个远程跟踪分支合并)显然不起作用,因为在这种状态下没有(真实的)当前分支可供查询。

目录 (directory)

你用 "ls" 命令看到的列表 :-)

脏 (dirty)

如果工作区包含尚未提交到当前分支的修改,则称该工作区为“脏”的。

恶意合并 (evil merge)

恶意合并是指引入了在任何父提交中都未出现过的变更的合并

快进 (fast-forward)

快进是一种特殊的合并。当你拥有一个修订版本,并且正在“合并”另一个分支的变更,而该分支恰好是你当前版本的后代。在这种情况下,你不需要创建一个新的合并提交,而只需将你的分支更新为指向与你要合并的分支相同的修订版本。这在远程版本库远程跟踪分支上经常发生。

获取 (fetch)

获取一个分支意味着从远程版本库获取该分支的头部引用,找出本地对象数据库中缺失的对象,并将它们也取回。另见 git-fetch[1]

文件系统 (file system)

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

Git 归档 (Git archive)

版本库的同义词(针对使用 Arch 的人)。

gitfile

工作区根目录下的一个普通文件 .git,它指向作为真实版本库的目录。关于其正确用法,请参见 git-worktree[1]git-submodule[1]。关于语法,请参见 gitrepository-layout[5]

嫁接 (grafts)

嫁接通过为提交记录虚假的祖先信息,使得两条本来不同的开发线能够连接在一起。通过这种方式,你可以让 Git 假装一个提交所拥有的父提交集与该提交创建时记录的不同。通过 .git/info/grafts 文件进行配置。

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

哈希 (hash)

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

头部 (head)

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

HEAD

当前分支。更详细地说:您的工作区通常衍生自 HEAD 所引用的树状态。HEAD 是对您版本库中某个头部的引用,除非使用游离 HEAD,在这种情况下,它直接引用一个任意的提交。

头部引用 (head ref)

头部 (head) 的同义词。

钩子 (hook)

在几个 Git 命令的正常执行期间,会调用可选的脚本,允许开发人员添加功能或检查。通常,钩子允许在命令执行前进行验证并可能中止,并允许在操作完成后进行后置通知。钩子脚本位于 $GIT_DIR/hooks/ 目录中,只需删除文件名的 .sample 后缀即可启用。在早期版本的 Git 中,你必须让它们具有可执行权限。

索引 (index)

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

索引项 (index entry)

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

master

默认的开发分支。每当你创建一个 Git 版本库时,都会创建一个名为 "master" 的分支,并成为当前活动分支。在大多数情况下,它包含本地开发内容,但这纯粹是惯例,并非强制要求。

合并 (merge)

作为动词:将另一个分支(可能来自外部版本库)的内容带入当前分支。如果合并的分支来自不同的版本库,则先通过获取远程分支,然后将结果合并到当前分支。这种获取和合并操作的结合被称为拉取 (pull)。合并由一个自动过程执行,该过程识别自各分支分叉以来所做的更改,然后将所有这些更改应用在一起。如果发生更改冲突,可能需要人工干预才能完成合并。

作为名词:除非是快进,否则成功的合并会创建一个新的提交,该提交代表合并的结果,并将被合并分支的顶端作为其父提交。这个提交被称为“合并提交”,或者有时简称为“合并”。

对象 (object)

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

对象数据库 (object database)

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

对象标识符、对象 ID、oid

对象名称的同义词。

对象名称 (object name)

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

对象类型 (object type)

描述对象类型的标识符之一:“commit”(提交)、“tree”(树)、“tag”(标签)或“blob”(数据)。

章鱼合并 (octopus)

合并两个以上的分支

孤立 (orphan)

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

origin

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

覆盖 (overlay)

仅在工作目录中更新和添加文件,但不删除它们,类似于 cp -R 更新目标目录内容的方式。这是从索引或某个树类对象进行检出文件时的默认模式。相比之下,非覆盖 (no-overlay) 模式还会删除源中不存在的已跟踪文件,类似于 rsync --delete

包 (pack)

一组已被压缩到一个文件中的对象(为了节省空间或进行高效传输)。

包索引 (pack index)

中对象的标识符列表及其他信息,用于协助高效访问包内容。

路径规范 (pathspec)

用于在 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 将模式视为适合 fnmatch(3) 使用 FNM_PATHNAME 标志处理的 shell 通配符:模式中的通配符不会匹配路径名中的 /。例如,"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 魔法与 literal 魔法不兼容。

attr

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

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

  • "ATTR" 要求设置了属性 ATTR

  • "-ATTR" 要求未设置属性 ATTR

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

  • "!ATTR" 要求未指定属性 ATTR

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

exclude

在路径匹配任何非排除路径规范后,它将通过所有排除路径规范(魔法签名:! 或其同义词 ^)进行运行。如果匹配,则该路径将被忽略。当没有非排除路径规范时,排除将应用于结果集,就像调用时没有任何路径规范一样。

父提交 (parent)

一个提交对象包含一个在该开发线上的逻辑前任列表(可能为空),即它的父提交。

剥离 (peel)

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

鹤嘴锄 (pickaxe)

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

底层命令 (plumbing)

核心 Git 的别称。

上层命令 (porcelain)

依赖于核心 Git 的程序及程序集的别称,提供对核心 Git 的高级访问。与底层命令相比,上层命令更多地暴露了 SCM 界面。

单工作树引用 (per-worktree ref)

属于单个工作树而非全局的引用。目前仅包含 HEAD 以及任何以 refs/bisect/ 开头的引用,但以后可能包含其他特殊引用。

伪引用 (pseudoref)

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

Git 已知的伪引用包括:

  • FETCH_HEADgit-fetch[1]git-pull[1] 写入。它可能引用多个对象 ID。每个对象 ID 都带有关联的元数据,指示它是从哪里获取的以及获取状态。

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

拉取 (pull)

拉取一个分支意味着对其进行获取合并。另见 git-pull[1]

推送 (push)

推送一个分支意味着从远程版本库获取该分支的头部引用,找出它是否是本地分支头部引用的祖先,如果是,则将所有从本地头部引用可达且远程版本库中缺失的对象放入远程对象数据库,并更新远程头部引用。如果远程头部不是本地头部的祖先,则推送失败。

可达的 (reachable)

给定提交的所有祖先都被称为从该提交“可达”。更一般地,如果我们可以通过一个从一个对象到达另一个对象,那么这个对象就是可达的。该链遵循标签指向的任何内容,提交指向其父提交或树,以及指向它们包含的树或数据对象

可达性位图 (reachability bitmaps)

可达性位图存储有关包文件或多包索引 (MIDX) 中一组选定提交的可达性信息,以加快对象搜索。位图存储在 ".bitmap" 文件中。一个版本库最多只能使用一个位图文件。位图文件可以属于一个包,也可以属于版本库的多包索引(如果存在)。

变基 (rebase)

将一个分支的一系列更改重新应用到不同的基底上,并将该分支的头部重置为结果。

引用 (ref)

指向对象名称或其他引用的名称(后者称为符号引用)。为方便起见,在用作 Git 命令的参数时,引用有时可以简写;详见 gitrevisions[7]。引用存储在版本库中。

引用命名空间是分层的。引用名称必须以 refs/ 开头或位于层级的根部。对于后者,它们的名称必须遵循以下规则:

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

  • 名称以 "_HEAD" 结尾或等于 "HEAD"。

    在层级的根部有一些不符合这些规则的不规则引用。以下列表是详尽的,将来不应再扩展:

  • AUTO_MERGE

  • BISECT_EXPECTED_REV

  • NOTES_MERGE_PARTIAL

  • NOTES_MERGE_REF

  • MERGE_AUTOSTASH

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

引用日志 (reflog)

引用日志显示引用的本地“历史”。换句话说,它可以告诉你*这个*版本库中的倒数第三个修订版本是什么,以及昨天晚上 9:14 时*这个*版本库中的当前状态是什么。详见 git-reflog[1]

引用规范 (refspec)

“引用规范”被 获取推送 用于描述远程引用和本地引用之间的映射。详见 git-fetch[1]git-push[1]

远程版本库 (remote repository)

用于跟踪同一个项目但驻留在其他地方的版本库。要与远程进行通信,请参见 获取推送

远程跟踪分支 (remote-tracking branch)

用于关注另一个版本库更改的引用。它通常看起来像 refs/remotes/foo/bar(表示它跟踪名为 foo 的远程版本库中名为 bar 的分支),并匹配配置的获取 引用规范 的右侧。远程跟踪分支不应包含直接修改,也不应在其上进行本地提交。

版本库 (repository)

引用集合,以及包含所有从引用可达对象的对象数据库,可能还附带来自一个或多个上层命令的元数据。版本库可以通过备用机制与其他版本库共享对象数据库。

解决 (resolve)

手动修复失败的自动合并留下的问题的操作。

修订版本 (revision)

提交(名词)的同义词。

回滚 (rewind)

丢弃一部分开发内容,即把头部分配给较早的修订版本

SCM

源代码管理(工具)。

SHA-1

“安全哈希算法 1”;一种加密哈希函数。在 Git 上下文中用作对象名称的同义词。

浅克隆 (shallow clone)

主要作为浅版本库的同义词,但该短语更明确地表示它是通过运行 git clone --depth=... 命令创建的。

浅版本库 (shallow repository)

版本库具有不完整的历史记录,其中一些提交父提交被切除了(换句话说,Git 被告知假装这些提交没有父提交,尽管它们记录在提交对象中)。当你只对项目的近期历史感兴趣,而上游记录的真实历史要大得多时,这有时很有用。浅版本库是通过给 git-clone[1] 传递 --depth 选项创建的,其历史记录稍后可以使用 git-fetch[1] 加深。

贮藏项 (stash entry)

一种用于临时存储工作目录和索引内容以备将来重用的对象

子模块 (submodule)

在一个版本库内部持有另一个独立项目历史记录的版本库(后者被称为父项目)。

父项目 (superproject)

在其工作区中将其他项目的版本库作为子模块引用的版本库。父项目知道所包含子模块提交对象的名称(但不持有其副本)。

符号引用 (symref)

符号引用:它不包含 SHA-1 ID 本身,而是采用 ref: refs/some/thing 格式,当引用它时,它会递归解引用到该引用。HEAD 是符号引用的典型例子。符号引用可以通过 git-symbolic-ref[1] 命令进行操作。

标签 (tag)

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

标签对象 (tag object)

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

主题分支 (topic branch)

开发人员用来标识某个概念性开发线的常规 Git 分支。由于分支非常容易且廉价,因此拥有多个小型分支通常是可取的,每个分支包含定义明确的概念或微小但相关的增量更改。

尾注 (trailer)

键值对元数据。尾注可以有选择地放在提交消息的末尾。在其他社区中可能被称为“页脚”或“标签”。参见 git-interpret-trailers[1]

树 (tree)

工作区,或者是树对象连同依赖的数据对象和树对象(即工作区的存储表示)。

树对象 (tree object)

一种包含文件名和模式列表以及指向关联数据对象和/或树对象的引用的对象。一个相当于一个目录

树类 (tree-ish,也称 treeish)

一个树对象,或者一个可以被递归解引用为树对象的对象。解引用一个提交对象会产生对应于该修订版本顶层目录的树对象。以下内容都是树类:一个提交类、一个树对象、一个指向树对象的标签对象、一个指向“指向树对象的标签对象”的标签对象,等等。

未出生的 (unborn)

HEAD 可以指向一个尚不存在且尚未有任何提交的分支,这样的分支被称为未出生的分支。用户遇到未出生分支最典型的方式是创建一个全新的版本库而非从别处克隆。此时 HEAD 将指向尚未出生的 main(或 master,取决于您的配置)分支。此外,某些操作通过其 孤立 (orphan) 选项也可以让您进入未出生的分支。

未合并索引 (unmerged index)

包含未合并索引项索引

不可达对象 (unreachable object)

无法从任何分支标签或任何其他引用到达对象

上游分支 (upstream branch)

合并到相关分支(或相关分支变基到)的默认分支。它通过 branch.<名称>.remote 和 branch.<名称>.merge 进行配置。如果 A 的上游分支是 origin/B,有时我们会说“A 正在跟踪 origin/B”。

工作区 (working tree)

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

工作树 (worktree)

一个版本库可以拥有零个(即裸版本库)或一个或多个与之关联的工作树。一个“工作树”由一个“工作区”和版本库元数据组成,其中大部分元数据在单个版本库的其他工作树之间共享,而其中一些元数据则是每个工作树独立维护的(例如索引、HEAD 以及像 MERGE_HEAD 这样的伪引用、单工作树引用和单工作树配置文件)。

GIT

Git[1] 套件的一部分