设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.48.1 → 2.50.1 无更改
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.3 无更改
-
2.46.0
2024-07-29
- 2.44.1 → 2.45.4 无更改
-
2.44.0
2024-02-23
- 2.43.2 → 2.43.7 无变更
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.39.1 → 2.42.4 无更改
-
2.39.0
2022-12-12
- 2.36.1 → 2.38.5 无更改
-
2.36.0
2022-04-18
- 2.33.1 → 2.35.8 无更改
-
2.33.0
2021-08-16
- 2.30.1 → 2.32.7 无更改
-
2.30.0
2020-12-27
- 2.23.1 → 2.29.3 无更改
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 无更改
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 无更改
-
2.21.0
2019-02-24
- 2.19.1 → 2.20.5 无更改
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 无更改
-
2.18.0
2018-06-21
- 2.15.4 → 2.17.6 无更改
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.9.5 → 2.11.4 无更改
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
-
2.6.7
2017-05-05
- 2.5.6 无更改
-
2.4.12
2017-05-05
- 2.3.10 无更改
-
2.2.3
2015-09-04
- 2.1.4 无更改
-
2.0.5
2014-12-17
描述
- 备用对象数据库
- 裸仓库
-
裸仓库通常是一个名称带有
.git
后缀的适当命名的目录,其中不包含任何版本控制文件的本地检出副本。也就是说,所有通常存在于隐藏的.git
子目录中的 Git 管理和控制文件都直接存在于repository.git
目录中,而没有其他文件存在或被检出。通常,公共仓库的发布者会提供裸仓库。 - blob 对象
-
无类型对象,例如文件的内容。
- 分支
-
“分支”是开发线。分支上最新的提交被称为该分支的“尖端”。分支的尖端由分支头引用,随着在该分支上进行额外的开发,该头会向前移动。一个 Git 仓库可以跟踪任意数量的分支,但你的工作区只与其中一个(“当前”或“已检出”分支)相关联,并且HEAD指向该分支。
- 缓存
-
索引的废弃术语。
- 链
- 变更集
-
BitKeeper/cvsps 中“提交”的说法。由于 Git 不存储变更,而是存储状态,因此在 Git 中使用“变更集”一词并不合理。
- 检出
- 拣选(cherry-picking)
-
在SCM行话中,“拣选”指的是从一系列变更(通常是提交)中选择一个子集,并将其作为一组新的变更记录在不同的代码库之上。在 Git 中,这通过“git cherry-pick”命令执行,以提取现有提交引入的变更,并将其基于当前分支的尖端记录为一个新提交。
- 干净的
- 提交
-
作为名词:Git 历史中的单个点;项目的整个历史表示为一组相互关联的提交。Git 通常在其他版本控制系统使用“修订版本”或“版本”的地方使用“提交”一词。也用作提交对象的简称。
- 提交图概念、表示及其用法
-
对象数据库中由提交形成的有向无环图 (DAG) 结构的同义词,通过分支尖端引用,使用其链接提交的链。此结构是权威的提交图。该图可以通过其他方式表示,例如“提交图”文件。
- 提交图文件
-
“提交图”(通常带连字符)文件是提交图的补充表示,可加快提交图遍历。 “提交图”文件存储在 .git/objects/info 目录或备用对象数据库的 info 目录中。
- 提交对象
- commit-ish(或称 committish)
-
一个提交对象,或一个可以递归地解引用到提交对象的对象。以下都是 commit-ish:一个提交对象,一个指向提交对象的标签对象,一个指向指向提交对象的标签对象的标签对象,等等。
- 核心 Git
-
Git 的基本数据结构和工具。仅暴露有限的源代码管理工具。
- DAG(有向无环图)
-
有向无环图。 提交对象构成一个有向无环图,因为它们有父级(有向),并且提交对象的图是无环的(没有以同一个对象开始和结束的链)。
- 悬空对象
- 解引用
-
指符号引用:访问符号引用所指向的引用的行为。递归解引用涉及对结果引用重复上述过程,直到找到非符号引用。
指提交对象:访问提交的树对象的行为。提交不能递归解引用。
除非另有说明,Git 命令或协议上下文中使用的“解引用”是隐式递归的。
- 分离头指针 (detached HEAD)
-
通常,HEAD 存储分支的名称,对 HEAD 所代表的历史进行操作的命令,会针对指向分支尖端的历史进行操作。然而,Git 也允许你检出一个不一定是任何特定分支尖端的任意提交。处于这种状态的 HEAD 被称为“分离头指针”。
请注意,当 HEAD 分离时,对当前分支历史进行操作的命令(例如
git
commit
以在其之上构建新历史)仍然有效。它们会更新 HEAD 指向已更新历史的尖端,而不会影响任何分支。但是,更新或查询当前分支*信息*的命令(例如git
branch
--set-upstream-to
设置当前分支与哪个远程跟踪分支集成)显然无效,因为在这种状态下没有(真正的)当前分支可供查询。 - 目录
-
使用“ls”命令获取的列表 :-)
- 脏的
- 邪恶合并
- 快进
-
快进是一种特殊类型的合并,你有一个修订版本,并且你正在“合并”另一个分支的更改,而这些更改恰好是你所拥有修订版本的后代。在这种情况下,你不会创建一个新的合并提交,而是简单地更新你的分支,使其指向与你正在合并的分支相同的修订版本。这在远程仓库的远程跟踪分支上会经常发生。
- 抓取(fetch)
-
抓取分支意味着从远程仓库获取该分支的头引用,找出本地对象数据库中缺少哪些对象,并也获取它们。另请参阅git-fetch[1]。
- 文件系统
-
Linus Torvalds 最初设计 Git 时,旨在将其作为一个用户空间文件系统,即用于存储文件和目录的基础设施。这确保了 Git 的效率和速度。
- Git 存档
-
仓库的同义词(对于 arch 用户)。
- gitfile
-
工作区根目录下名为
.git
的纯文本文件,指向实际的仓库目录。有关正确用法,请参阅git-worktree[1]或git-submodule[1]。有关语法,请参阅gitrepository-layout[5]。 - 嫁接 (grafts)
-
嫁接允许两条原本不同的开发线通过记录提交的虚假祖先信息连接在一起。这样,你可以让 Git 假装一个提交的父级集合与提交创建时记录的不同。通过
.git/info/grafts
文件进行配置。请注意,嫁接机制已过时,可能导致仓库间对象传输出现问题;请参阅git-replace[1]以获取更灵活和健壮的实现相同功能的系统。
- 哈希
-
在 Git 的上下文中,对象名称的同义词。
- 头
-
分支尖端提交的命名引用。头存储在
$GIT_DIR/refs/heads/
目录中的文件中,除非使用打包引用。(参阅git-pack-refs[1]。) - HEAD(头指针)
-
当前分支。更详细地说:你的工作区通常派生自 HEAD 所引用的树的状态。HEAD 是你仓库中某个头的引用,除非使用分离头指针,在这种情况下它直接引用任意提交。
- 头引用
-
头的同义词。
- 钩子
-
在多个 Git 命令的正常执行过程中,会调用可选脚本,允许开发者添加功能或检查。通常,钩子允许在命令执行前进行预验证并可能中止,并在操作完成后进行后通知。钩子脚本位于
$GIT_DIR/hooks/
目录中,通过简单地删除文件名中的.sample
后缀即可启用。在早期版本的 Git 中,你必须将它们设置为可执行。 - 索引
-
一个包含文件统计信息的集合,其内容作为对象存储。索引是你工作区的一个存储版本。事实上,它还可以包含工作区的第二个,甚至第三个版本,这些版本在合并时使用。
- 索引条目
- master
-
默认开发分支。每当你创建一个 Git 仓库时,都会创建一个名为“master”的分支,并成为活动分支。在大多数情况下,这包含本地开发,尽管这纯粹是约定俗成,并非强制要求。
- 合并
-
作为动词:将另一个分支(可能来自外部仓库)的内容引入当前分支。如果被合并的分支来自不同的仓库,则首先抓取远程分支,然后将结果合并到当前分支中。抓取和合并操作的这种组合称为拉取。合并由一个自动过程执行,该过程识别自各分支分歧以来所做的更改,然后将所有这些更改一起应用。如果更改发生冲突,可能需要手动干预才能完成合并。
- 对象
-
Git 中的存储单元。它由其内容的SHA-1唯一标识。因此,对象不能被更改。
- 对象数据库
- 对象标识符 (oid)
-
对象名称的同义词。
- 对象名称
- 对象类型
- 章鱼合并
- 孤儿分支
-
进入一个尚未存在的分支(即未诞生的分支)的行为。在此操作之后,首次创建的提交将成为一个没有父级的提交,从而开始一段新的历史。
- origin
-
默认的上游仓库。大多数项目至少有一个它们跟踪的上游项目。默认情况下origin用于此目的。新的上游更新将被抓取到名为 origin/name-of-upstream-branch 的远程跟踪分支中,你可以使用
git
branch
-r
查看这些分支。 - 覆盖
-
只更新和添加文件到工作目录,但不删除它们,类似于cp -R更新目标目录内容的方式。这是从索引或tree-ish检出文件时检出的默认模式。相比之下,非覆盖模式还会删除源中不存在的已跟踪文件,类似于rsync --delete。
- 包 (pack)
-
一组被压缩到一个文件中的对象(为了节省空间或高效传输)。
- 包索引
-
包中对象的标识符和其他信息的列表,用于协助高效访问包的内容。
- 路径规约 (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。
以冒号
:
开头的路径规约具有特殊含义。在短形式中,前导冒号:
后面跟着零个或多个“魔术签名”字母(可选地由另一个冒号:
终止),其余部分是与路径匹配的模式。“魔术签名”由既非字母数字、glob、正则表达式特殊字符也非冒号的 ASCII 符号组成。如果模式以不属于“魔术签名”符号集且不是冒号的字符开头,则可以省略终止“魔术签名”的可选冒号。在长形式中,前导冒号
:
后面跟着一个左括号(,一个逗号分隔的零个或多个“魔术词”列表,和一个右括号),其余部分是与路径匹配的模式。仅包含一个冒号的路径规约表示“没有路径规约”。此形式不应与其他路径规约组合使用。
- 顶层
-
魔术词
top
(魔术签名:/
)使模式从工作树的根目录开始匹配,即使你是在子目录中运行命令。 - 字面量
-
模式中的通配符如
*
或?将被视为字面字符。 - 忽略大小写
-
不区分大小写匹配。
- 通配符 (glob)
-
Git 将模式视为适合 fnmatch(3) 与 FNM_PATHNAME 标志一起使用的 shell glob:模式中的通配符将不匹配路径名中的 /。例如,“Documentation/*.html”匹配“Documentation/git.html”,但不匹配“Documentation/ppc/ppc.html”或“tools/perf/Documentation/perf.html”。
与完整路径名匹配的模式中,两个连续的星号(
**
)可能具有特殊含义:-
前导的“
**
”后跟斜杠表示匹配所有目录。例如,“**/foo
”匹配任何地方的文件或目录“foo
”,与模式“foo
”相同。“**/foo/bar
”匹配直接在目录“foo
”下的任何地方的文件或目录“bar
”。 -
尾随的“
/**
”匹配内部所有内容。例如,“abc/**
”匹配相对于.gitignore
文件位置的目录“abc”内的所有文件,深度无限。 -
斜杠后跟两个连续星号再跟斜杠匹配零个或多个目录。例如,“
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)
-
一个路径匹配任何非排除路径规约后,它将通过所有排除路径规约(魔术签名:
!
或其同义词^
)。如果匹配,该路径将被忽略。当没有非排除路径规约时,排除将应用于结果集,就像在没有任何路径规约的情况下调用一样。
-
- 父级
-
一个提交对象包含开发线中逻辑前身(可能为空)的列表,即其父级。
- 剥离(peel)
- 镐(pickaxe)
-
术语镐指的是 diffcore 例程的一个选项,它帮助选择添加或删除给定文本字符串的更改。使用
--pickaxe-all
选项,可以用来查看引入或删除(例如)特定文本行的完整变更集。参阅git-diff[1]。 - 底层命令 (plumbing)
-
核心 Git 的可爱称呼。
- 高级命令 (porcelain)
-
依赖于核心 Git 的程序和程序套件的可爱称呼,它们提供了对核心 Git 的高级访问。高级命令比底层命令暴露更多的SCM接口。
- 每工作区引用
-
每工作区而不是全局的引用。目前这仅限于HEAD和任何以
refs/bisect/
开头的引用,但以后可能包括其他不寻常的引用。 - 伪引用 (pseudoref)
-
一种语义不同于普通引用的引用。这些引用可以通过普通的 Git 命令读取,但不能通过git-update-ref[1]等命令写入。
Git 已知以下伪引用:
-
FETCH_HEAD
由git-fetch[1]或git-pull[1]写入。它可能引用多个对象 ID。每个对象 ID 都带有元数据注释,指示其抓取来源和抓取状态。 -
MERGE_HEAD
在解决合并冲突时由git-merge[1]写入。它包含所有正在合并的提交 ID。
-
- 拉取 (pull)
-
拉取分支意味着抓取它并合并它。另请参阅git-pull[1]。
- 推送 (push)
-
推送分支意味着从远程仓库获取该分支的头引用,查明它是否是该分支本地头引用的祖先,如果是,则将所有可从本地头引用可达且远程仓库中缺失的对象放入远程对象数据库,并更新远程头引用。如果远程头不是本地头的祖先,则推送失败。
- 可达的
-
给定提交的所有祖先都被认为是可从该提交“可达的”。更一般地,如果一个对象可以通过遵循标签指向其所标记的对象,提交指向其父级或树,以及树指向其所包含的树或blob的链,从另一个对象到达该对象,则称一个对象可从另一个对象到达。
- 可达性位图
-
可达性位图存储关于打包文件或多包索引 (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]。
- 远程仓库
- 远程跟踪分支
-
用于跟踪来自另一个仓库的更改的引用。它通常看起来像refs/remotes/foo/bar(表示它跟踪名为foo的远程仓库中名为bar的分支),并与配置的抓取引用规约的右侧匹配。远程跟踪分支不应包含直接修改或对其进行本地提交。
- 仓库
-
一个引用的集合以及一个包含所有从引用可达的对象的对象数据库,可能还伴随有一个或多个高级命令的元数据。仓库可以通过备用机制与其他仓库共享对象数据库。
- 解决
-
手动修复失败的自动合并留下的问题的行为。
- 修订版本
-
提交(名词)的同义词。
- 回退
- SCM(源代码管理)
-
源代码管理(工具)。
- SHA-1
-
“安全哈希算法 1”;一种加密哈希函数。在 Git 的上下文中用作对象名称的同义词。
- 浅克隆
-
主要是浅仓库的同义词,但这个短语更明确地表明它是通过运行
git
clone
--depth=...
命令创建的。 - 浅仓库
-
浅仓库有一个不完整的历史,其中一些提交的父级被“烧断”(换句话说,Git 被告知假装这些提交没有父级,即使它们被记录在提交对象中)。当你只对项目的近期历史感兴趣,即使上游记录的真实历史要大得多时,这有时很有用。浅仓库是通过向git-clone[1]提供
--depth
选项创建的,其历史可以稍后用git-fetch[1]加深。 - 暂存条目
- 子模块
- 超级项目
- 符号引用 (symref)
-
符号引用:它不包含SHA-1 ID 本身,而是以ref: refs/some/thing的格式存在,并在被引用时递归地解引用到此引用。HEAD是符号引用的主要示例。符号引用通过git-symbolic-ref[1]命令进行操作。
- 标签
-
refs/tags/
命名空间下的引用,指向任意类型的对象(通常标签指向标签对象或提交对象)。与头不同,标签不会被commit
命令更新。Git 标签与 Lisp 标签(在 Git 的上下文中被称为对象类型)无关。标签最常用于标记提交祖先链中的特定点。 - 标签对象
-
一个对象,包含指向另一个对象的引用,该对象可以像提交对象一样包含消息。它还可以包含(PGP)签名,在这种情况下被称为“签名标签对象”。
- 主题分支
-
一个常规的 Git 分支,开发者用它来标识概念性的开发线。由于分支非常容易且廉价,因此通常希望有几个小分支,每个分支包含非常明确的概念或小而增量但相关的更改。
- 尾注 (trailer)
-
键值元数据。尾注可选择性地出现在提交消息的末尾。在其他社区中可能被称为“页脚”或“标签”。参阅git-interpret-trailers[1]。
- 树
- 树对象
- tree-ish(或称 treeish)
-
一个树对象,或一个可以递归地解引用到树对象的对象。解引用提交对象会产生与该修订版本顶层目录对应的树对象。以下都是 tree-ish:一个commit-ish,一个树对象,一个指向树对象的标签对象,一个指向指向树对象的标签对象的标签对象,等等。
- 未诞生分支 (unborn branch)
-
HEAD 可以指向一个尚不存在且没有任何提交的分支,这样的分支称为未诞生分支。用户遇到未诞生分支最典型的方式是全新创建一个仓库而不从其他地方克隆。HEAD 会指向尚未诞生的main(或master,取决于你的配置)分支。此外,某些操作也可以通过其孤儿分支选项让你进入一个未诞生分支。
- 未合并索引
- 不可达对象
- 上游分支
-
默认的分支,它被合并到所讨论的分支中(或者所讨论的分支被变基到它上面)。它通过 branch.<name>.remote 和 branch.<name>.merge 进行配置。如果A的上游分支是origin/B,有时我们会说“A正在跟踪origin/B”。
- 工作区 (working tree)
-
实际检出文件的树。工作区通常包含HEAD提交树的内容,以及你所做但尚未提交的任何本地更改。
- 工作树 (worktree)
-
一个仓库可以附加零个(即裸仓库)或一个或多个工作树。一个“工作树”包含一个“工作区”和仓库元数据,其中大部分在单个仓库的其他工作树之间共享,而部分则按工作树单独维护(例如索引、HEAD 和 MERGE_HEAD 等伪引用、每工作树引用以及每工作树配置文件)。