设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
修补
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.47.0 10/06/24
- 2.46.1 → 2.46.2 无更改
- 2.46.0 07/29/24
- 2.45.2 无更改
- 2.45.1 04/29/24
- 2.45.0 04/29/24
- 2.44.2 无更改
- 2.44.1 04/19/24
- 2.44.0 02/23/24
- 2.43.5 无更改
- 2.43.4 04/19/24
- 2.43.2 → 2.43.3 无更改
- 2.43.1 02/09/24
- 2.43.0 11/20/23
- 2.42.3 无更改
- 2.42.2 04/19/24
- 2.42.1 11/02/23
- 2.42.0 08/21/23
- 2.41.2 无更改
- 2.41.1 04/19/24
- 2.41.0 06/01/23
- 2.40.3 无更改
- 2.40.2 04/19/24
- 2.40.1 无更改
- 2.40.0 无更改
- 2.39.5 无更改
- 2.39.4 04/19/24
- 2.39.1 → 2.39.3 无更改
- 2.39.0 12/12/22
- 2.38.3 → 2.38.5 无更改
- 2.38.2 12/11/22
- 2.38.1 无更改
- 2.38.0 10/02/22
- 2.37.3 → 2.37.7 无更改
- 2.37.2 08/11/22
- 2.37.1 无更改
- 2.37.0 06/27/22
- 2.36.1 → 2.36.6 无更改
- 2.36.0 04/18/22
- 2.35.1 → 2.35.8 无更改
- 2.35.0 01/24/22
- 2.34.1 → 2.34.8 无更改
- 2.34.0 11/15/21
- 2.33.3 → 2.33.8 无更改
- 2.33.2 03/23/22
- 2.33.1 10/12/21
- 2.32.1 → 2.33.0 无更改
- 2.32.0 06/06/21
- 2.31.1 → 2.31.8 无更改
- 2.31.0 03/15/21
- 2.30.1 → 2.30.9 无更改
- 2.30.0 12/27/20
- 2.29.1 → 2.29.3 无更改
- 2.29.0 10/19/20
- 2.28.1 无更改
- 2.28.0 07/27/20
- 2.27.1 无更改
- 2.27.0 06/01/20
- 2.26.1 → 2.26.3 无更改
- 2.26.0 03/22/20
- 2.25.2 → 2.25.5 无更改
- 2.25.1 02/17/20
- 2.25.0 01/13/20
- 2.23.1 → 2.24.4 无更改
- 2.23.0 08/16/19
- 2.22.2 → 2.22.5 无更改
- 2.22.1 08/11/19
- 2.22.0 06/07/19
- 2.20.1 → 2.21.4 无更改
- 2.20.0 12/09/18
- 2.19.3 → 2.19.6 无更改
- 2.19.2 11/21/18
- 2.19.1 无更改
- 2.19.0 09/10/18
- 2.18.1 → 2.18.5 无更改
- 2.18.0 06/21/18
- 2.17.1 → 2.17.6 无更改
- 2.17.0 04/02/18
- 2.16.6 12/06/19
- 2.15.4 12/06/19
- 2.14.6 12/06/19
- 2.13.7 无更改
- 2.12.5 09/22/17
- 2.11.4 09/22/17
- 2.10.5 09/22/17
- 2.9.5 07/30/17
- 2.8.6 07/30/17
- 2.7.6 07/30/17
- 2.6.7 05/05/17
- 2.5.6 05/05/17
- 2.4.12 05/05/17
- 2.3.10 09/28/15
- 2.2.3 09/04/15
- 2.1.4 12/17/14
- 2.0.5 12/17/14
概要
git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch] [--no-optional-locks] [--no-advice] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] [--config-env=<name>=<envvar>] <command> [<args>]
描述
Git 是一个快速、可扩展、分布式的版本控制系统,它拥有一个异常丰富的命令集,既提供高级操作,又允许完全访问内部机制。
请参阅 gittutorial[7] 以开始使用,然后参阅 giteveryday[7] 以了解一组有用的最小命令集。 Git 用户手册 提供了更深入的介绍。
掌握基本概念后,您可以返回此页面以了解 Git 提供的命令。您可以使用“git help command”了解更多关于各个 Git 命令的信息。 gitcli[7] 手册页为您提供了命令行命令语法的概述。
可以在 https://git.github.io/htmldocs/git.html 或 https://git-scm.cn/docs 查看最新 Git 文档的格式化和超链接版本。
选项
- -v
- --version
-
打印 git 程序来自的 Git 套件版本。
此选项在内部转换为
git version ...
并接受与 git-version[1] 命令相同的选项。如果也提供了--help
,则它优先于--version
。 - -h
- --help
-
打印概要和最常用命令的列表。如果提供了选项
--all
或-a
,则会打印所有可用命令。如果命名了一个 Git 命令,则此选项将显示该命令的手册页。还有其他选项可用于控制手册页的显示方式。有关更多信息,请参阅 git-help[1],因为
git --help ...
在内部转换为git help ...
。 - -C <path>
-
运行时,就像 git 在 <path> 而不是当前工作目录中启动一样。当给出多个
-C
选项时,每个后续的非绝对-C <path>
将相对于前面的-C <path>
进行解释。如果 <path> 存在但为空,例如-C ""
,则当前工作目录保持不变。此选项会影响那些期望路径名称(如
--git-dir
和--work-tree
)的选项,因为它们对路径名称的解释将相对于-C
选项导致的工作目录进行。例如,以下调用是等效的git --git-dir=a.git --work-tree=b -C c status git --git-dir=c/a.git --work-tree=c/b status
- -c <name>=<value>
-
将配置参数传递给命令。给定的值将覆盖来自配置文件的值。<name> 的格式应与 git config 列出的格式相同(子键用点分隔)。
请注意,在
git -c foo.bar ...
中省略=
是允许的,它将foo.bar
设置为布尔值 true(就像配置文件中的[foo]bar
一样)。包含等号但值为空(如git -c foo.bar= ...
)将foo.bar
设置为空字符串,git config --type=bool
将将其转换为false
。 - --config-env=<name>=<envvar>
-
类似于
-c <name>=<value>
,为配置变量 <name> 提供一个值,其中 <envvar> 是要从中检索值的 环境变量的名称。与-c
不同,没有直接将值设置为空字符串的快捷方式,而是必须将环境变量本身设置为空字符串。如果环境中不存在<envvar>
,则为错误。<envvar>
不能包含等号,以避免与<name>
包含等号产生歧义。这在您想要将瞬态配置选项传递给 git 但在其他进程可能能够读取您的命令行(例如
/proc/self/cmdline
)但不能读取您的环境(例如/proc/self/environ
)的操作系统上执行此操作时非常有用。这种行为在 Linux 上是默认行为,但在您的系统上可能不是。请注意,这可能会为诸如
http.extraHeader
之类的变量添加安全性,其中敏感信息是值的一部分,但不是例如url.<base>.insteadOf
,其中敏感信息可以是键的一部分。 - --exec-path[=<path>]
-
您安装的核心 Git 程序所在路径。这也可以通过设置 GIT_EXEC_PATH 环境变量来控制。如果没有给出路径,git 将打印当前设置,然后退出。
- --html-path
-
打印 Git 的 HTML 文档安装所在的路径(不带尾部斜杠),然后退出。
- --man-path
-
打印此版本的 Git 的手册页的手册路径(参见
man(1)
),然后退出。 - --info-path
-
打印安装此版本的 Git 的 Info 文件所在的路径,然后退出。
- -p
- --paginate
-
如果标准输出是终端,则将所有输出通过管道传输到 less(或如果已设置,则为 $PAGER)。这会覆盖
pager.<cmd>
配置选项(请参阅下面的“配置机制”部分)。 - -P
- --no-pager
-
不要将 Git 输出通过管道传输到分页器。
- --git-dir=<path>
-
设置存储库(“.git”目录)的路径。这也可以通过设置
GIT_DIR
环境变量来控制。它可以是绝对路径或相对于当前工作目录的相对路径。使用此选项(或
GIT_DIR
环境变量)指定“.git”目录的位置会关闭尝试查找包含“.git”子目录的目录的仓库发现功能(这是发现仓库和工作树顶层的机制),并告诉Git您位于工作树的顶层。如果您不在工作树的顶层目录,则应使用--work-tree=<path>
选项(或GIT_WORK_TREE
环境变量)告诉Git工作树的顶层位置。如果您只想像在
<path>
中启动一样运行git,则使用git -C <path>
。 - --work-tree=<path>
-
设置工作树的路径。它可以是绝对路径或相对于当前工作目录的相对路径。这也可以通过设置GIT_WORK_TREE环境变量和core.worktree配置变量来控制(有关更详细的讨论,请参见git-config[1]中的core.worktree)。
- --namespace=<path>
-
设置Git命名空间。有关更多详细信息,请参见gitnamespaces[7]。相当于设置
GIT_NAMESPACE
环境变量。 - --bare
-
将仓库视为裸仓库。如果未设置GIT_DIR环境,则将其设置为当前工作目录。
- --no-replace-objects
-
不要使用替换引用来替换Git对象。这相当于使用任何值导出
GIT_NO_REPLACE_OBJECTS
环境变量。有关更多信息,请参见git-replace[1]。 - --no-lazy-fetch
-
不要按需从承诺者远程获取缺少的对象。与
git cat-file -e <object>
一起使用,以查看对象是否在本地可用。这相当于将GIT_NO_LAZY_FETCH
环境变量设置为1
。 - --no-optional-locks
-
不要执行需要锁定的可选操作。这相当于将
GIT_OPTIONAL_LOCKS
设置为0
。 - --no-advice
-
禁用打印所有建议提示。
- --literal-pathspecs
-
按字面意思处理路径规范(即没有通配符,没有路径规范魔法)。这相当于将
GIT_LITERAL_PATHSPECS
环境变量设置为1
。 - --glob-pathspecs
-
为所有路径规范添加“glob”魔法。这相当于将
GIT_GLOB_PATHSPECS
环境变量设置为1
。可以使用路径规范魔法“:(literal)”禁用单个路径规范上的通配符。 - --noglob-pathspecs
-
为所有路径规范添加“literal”魔法。这相当于将
GIT_NOGLOB_PATHSPECS
环境变量设置为1
。可以使用路径规范魔法“:(glob)”启用单个路径规范上的通配符。 - --icase-pathspecs
-
为所有路径规范添加“icase”魔法。这相当于将
GIT_ICASE_PATHSPECS
环境变量设置为1
。 - --list-cmds=<group>[,<group>…]
-
按组列出命令。这是一个内部/实验性选项,将来可能会更改或删除。支持的组包括:builtins、parseopt(使用parse-options的内置命令)、main(libexec目录中的所有命令)、others(
$PATH
中所有以git-为前缀的其他命令)、list-<category>(请参阅command-list.txt中的类别)、nohelpers(排除辅助命令)、alias和config(从配置变量completion.commands检索命令列表)。 - --attr-source=<tree-ish>
-
从<tree-ish>而不是工作树读取gitattributes。请参见gitattributes[5]。这相当于设置
GIT_ATTR_SOURCE
环境变量。
高级命令(瓷器)
我们将瓷器命令分为主要命令和一些辅助用户实用程序。
主要瓷器命令
- git-add[1]
-
将文件内容添加到索引
- git-am[1]
-
从邮箱中应用一系列补丁
- git-archive[1]
-
从命名树中创建文件的归档文件
- git-bisect[1]
-
使用二分搜索查找引入错误的提交
- git-branch[1]
-
列出、创建或删除分支
- git-bundle[1]
-
通过归档移动对象和引用
- git-checkout[1]
-
切换分支或恢复工作树文件
- git-cherry-pick[1]
-
应用某些现有提交引入的更改
- git-citool[1]
-
git-commit 的图形替代方案
- git-clean[1]
-
从工作树中删除未跟踪的文件
- git-clone[1]
-
将仓库克隆到新目录中
- git-commit[1]
-
记录对仓库的更改
- git-describe[1]
-
根据可用的引用为对象提供人类可读的名称
- git-diff[1]
-
显示提交之间、提交和工作树之间等的更改
- git-fetch[1]
-
从另一个仓库下载对象和引用
- git-format-patch[1]
-
准备用于电子邮件提交的补丁
- git-gc[1]
-
清理不必要的文件并优化本地仓库
- git-grep[1]
-
打印与模式匹配的行
- git-gui[1]
-
Git 的可移植图形界面
- git-init[1]
-
创建空Git仓库或重新初始化现有仓库
- git-log[1]
-
显示提交日志
- git-maintenance[1]
-
运行优化Git仓库数据的任务
- git-merge[1]
-
将两个或多个开发历史合并在一起
- git-mv[1]
-
移动或重命名文件、目录或符号链接
- git-notes[1]
-
添加或检查对象注释
- git-pull[1]
-
从另一个仓库或本地分支获取并与其集成
- git-push[1]
-
更新远程引用以及关联的对象
- git-range-diff[1]
-
比较两个提交范围(例如,分支的两个版本)
- git-rebase[1]
-
在另一个基本提示之上重新应用提交
- git-reset[1]
-
将当前HEAD重置为指定状态
- git-restore[1]
-
恢复工作树文件
- git-revert[1]
-
撤消某些现有提交
- git-rm[1]
-
从工作树和索引中删除文件
- git-shortlog[1]
-
总结git log输出
- git-show[1]
-
显示各种类型的对象
- git-sparse-checkout[1]
-
将您的工作树缩减到跟踪文件的子集
- git-stash[1]
-
将脏工作目录中的更改存储起来
- git-status[1]
-
显示工作树状态
- git-submodule[1]
-
初始化、更新或检查子模块
- git-switch[1]
-
切换分支
- git-tag[1]
-
创建、列出、删除或验证使用GPG签名的标签对象
- git-worktree[1]
-
管理多个工作树
- gitk[1]
-
Git 仓库浏览器
- scalar[1]
-
用于管理大型Git仓库的工具
辅助命令
操作器
- git-config[1]
-
获取和设置仓库或全局选项
- git-fast-export[1]
-
Git 数据导出器
- git-fast-import[1]
-
Git 数据快速导入的后端
- git-filter-branch[1]
-
重写分支
- git-mergetool[1]
-
运行合并冲突解决工具来解决合并冲突
- git-pack-refs[1]
-
打包头部和标签以实现高效的仓库访问
- git-prune[1]
-
从对象数据库中修剪所有不可到达的对象
- git-reflog[1]
-
管理 reflog 信息
- git-refs[1]
-
对 refs 的底层访问
- git-remote[1]
-
管理跟踪仓库的集合
- git-repack[1]
-
打包仓库中未打包的对象
- git-replace[1]
-
创建、列出、删除替换对象的 refs
查询工具
- git-annotate[1]
-
用提交信息注释文件行
- git-blame[1]
-
显示哪个修订版本和作者最后修改了文件的每一行
- git-bugreport[1]
-
收集信息供用户提交错误报告
- git-count-objects[1]
-
计算未打包的对象数量及其磁盘占用量
- git-diagnose[1]
-
生成包含诊断信息的 zip 压缩文件
- git-difftool[1]
-
使用常见的 diff 工具显示更改
- git-fsck[1]
-
验证数据库中对象的连接性和有效性
- git-help[1]
-
显示关于 Git 的帮助信息
- git-instaweb[1]
-
在 gitweb 中立即浏览您的工作仓库
- git-merge-tree[1]
-
执行合并而不触碰索引或工作树
- git-rerere[1]
-
重复使用已记录的冲突合并解决方案
- git-show-branch[1]
-
显示分支及其提交
- git-verify-commit[1]
-
检查提交的 GPG 签名
- git-verify-tag[1]
-
检查标签的 GPG 签名
- git-version[1]
-
显示关于 Git 的版本信息
- git-whatchanged[1]
-
显示每次提交引入差异的日志
- gitweb[1]
-
Git Web 界面(Git 仓库的 Web 前端)
与他人互动
这些命令用于与外部 SCM 以及通过电子邮件补丁与其他人互动。
- git-archimport[1]
-
将 GNU Arch 仓库导入 Git
- git-cvsexportcommit[1]
-
将单个提交导出到 CVS 检出
- git-cvsimport[1]
-
从其他人喜欢讨厌的另一个 SCM 中抢救您的数据
- git-cvsserver[1]
-
Git 的 CVS 服务器模拟器
- git-imap-send[1]
-
将一组补丁从标准输入发送到 IMAP 文件夹
- git-p4[1]
-
从 Perforce 仓库导入和提交到 Perforce 仓库
- git-quiltimport[1]
-
将 quilt 补丁集应用到当前分支
- git-request-pull[1]
-
生成挂起的更改摘要
- git-send-email[1]
-
将一组补丁作为电子邮件发送
- git-svn[1]
-
在 Subversion 仓库和 Git 之间进行双向操作
重置、恢复和反转
有三个名称相似的命令:git reset
、git restore
和 git revert
。
-
git-revert[1] 用于创建新的提交以反转其他提交所做的更改。
-
git-restore[1] 用于从索引或其他提交中恢复工作树中的文件。此命令不会更新您的分支。该命令也可用于从其他提交中恢复索引中的文件。
-
git-reset[1] 用于更新您的分支,移动分支的顶端以从分支中添加或删除提交。此操作会更改提交历史记录。
git reset
也可用于恢复索引,与git restore
重叠。
底层命令(管道)
虽然 Git 包含自己的瓷器层,但其底层命令足以支持开发替代瓷器。此类瓷器的开发人员可以从阅读git-update-index[1] 和 git-read-tree[1] 开始。
这些底层命令的接口(输入、输出、选项集和语义)旨在比瓷器级命令稳定得多,因为这些命令主要用于脚本使用。另一方面,瓷器命令的接口可能会发生更改以改善最终用户体验。
以下说明将底层命令划分为操作对象(在仓库、索引和工作树中)、查询和比较对象以及在仓库之间移动对象和引用的命令。
操作命令
- git-apply[1]
-
将补丁应用到文件和/或索引
- git-checkout-index[1]
-
将文件从索引复制到工作树
- git-commit-graph[1]
-
写入和验证 Git 提交图文件
- git-commit-tree[1]
-
创建一个新的提交对象
- git-hash-object[1]
-
计算对象 ID 并根据需要从文件创建对象
- git-index-pack[1]
-
为现有的打包存档构建打包索引文件
- git-merge-file[1]
-
运行三方文件合并
- git-merge-index[1]
-
为需要合并的文件运行合并
- git-mktag[1]
-
创建带有额外验证的标签对象
- git-mktree[1]
-
从 ls-tree 格式化的文本构建树对象
- git-multi-pack-index[1]
-
写入和验证多包索引
- git-pack-objects[1]
-
创建对象的打包存档
- git-prune-packed[1]
-
删除已在打包文件中存在的额外对象
- git-read-tree[1]
-
将树信息读入索引
- git-replay[1]
-
实验性:在新的基础上重放提交,也适用于裸仓库
- git-symbolic-ref[1]
-
读取、修改和删除符号引用
- git-unpack-objects[1]
-
从打包存档中解包对象
- git-update-index[1]
-
将工作树中的文件内容注册到索引
- git-update-ref[1]
-
安全地更新存储在引用中的对象名称
- git-write-tree[1]
-
根据当前索引创建树对象
查询命令
- git-cat-file[1]
-
提供仓库对象的內容或详细信息
- git-cherry[1]
-
查找尚未应用到上游的提交
- git-diff-files[1]
-
比较工作树和索引中的文件
- git-diff-index[1]
-
比较树与工作树或索引
- git-diff-tree[1]
-
比较通过两个树对象找到的 Blob 的内容和模式
- git-for-each-ref[1]
-
输出每个引用的信息
- git-for-each-repo[1]
-
在仓库列表上运行 Git 命令
- git-get-tar-commit-id[1]
-
从使用 git-archive 创建的归档文件中提取提交 ID
- git-ls-files[1]
-
显示索引和工作树中文件的信息
- git-ls-remote[1]
-
列出远程仓库中的引用
- git-ls-tree[1]
-
列出树对象的内容
- git-merge-base[1]
-
为合并查找尽可能好的共同祖先
- git-name-rev[1]
-
查找给定修订版本的符号名称
- git-pack-redundant[1]
-
查找冗余的 pack 文件
- git-rev-list[1]
-
按反时间顺序列出提交对象
- git-rev-parse[1]
-
选取和处理参数
- git-show-index[1]
-
显示打包的归档索引
- git-show-ref[1]
-
列出本地仓库中的引用
- git-unpack-file[1]
-
使用 Blob 的内容创建一个临时文件
- git-var[1]
-
显示 Git 逻辑变量
- git-verify-pack[1]
-
验证打包的 Git 归档文件
通常,查询命令不会修改工作树中的文件。
同步仓库
- git-daemon[1]
-
一个非常简单的 Git 仓库服务器
- git-fetch-pack[1]
-
从另一个仓库接收缺少的对象
- git-http-backend[1]
-
通过 HTTP 实现 Git 的服务器端
- git-send-pack[1]
-
通过 Git 协议将对象推送到另一个仓库
- git-update-server-info[1]
-
更新辅助信息文件以帮助哑服务器
以下是上述命令使用的辅助命令;最终用户通常不会直接使用它们。
- git-http-fetch[1]
-
通过 HTTP 从远程 Git 仓库下载
- git-http-push[1]
-
通过 HTTP/DAV 将对象推送到另一个仓库
- git-receive-pack[1]
-
接收推送到仓库的内容
- git-shell[1]
-
仅限 Git 的 SSH 访问的受限登录 Shell
- git-upload-archive[1]
-
将归档文件发送回 git-archive
- git-upload-pack[1]
-
将打包的对象发送回 git-fetch-pack
内部辅助命令
这些是其他命令使用的内部辅助命令;最终用户通常不会直接使用它们。
- git-check-attr[1]
-
显示 gitattributes 信息
- git-check-ignore[1]
-
调试 gitignore / 排除文件
- git-check-mailmap[1]
-
显示联系人的规范名称和电子邮件地址
- git-check-ref-format[1]
-
确保引用名称格式正确
- git-column[1]
-
以列的形式显示数据
- git-credential[1]
-
检索和存储用户凭据
- git-credential-cache[1]
-
帮助程序,用于在内存中临时存储密码
- git-credential-store[1]
-
帮助程序,用于将凭据存储在磁盘上
- git-fmt-merge-msg[1]
-
生成合并提交消息
- git-hook[1]
-
运行 git hook
- git-interpret-trailers[1]
-
在提交消息中添加或解析结构化信息
- git-mailinfo[1]
-
从单个电子邮件中提取补丁和作者信息
- git-mailsplit[1]
-
简单的 UNIX mbox 分割程序
- git-merge-one-file[1]
-
与 git-merge-index 一起使用的标准辅助程序
- git-patch-id[1]
-
计算补丁的唯一 ID
- git-sh-i18n[1]
-
Git 的 shell 脚本 i18n 设置代码
- git-sh-setup[1]
-
常见的 Git shell 脚本设置代码
- git-stripspace[1]
-
删除不必要的空格
指南
以下文档页面是关于 Git 概念的指南。
- gitcore-tutorial[7]
-
面向开发人员的 Git 核心教程
- gitcredentials[7]
-
为 Git 提供用户名和密码
- gitcvs-migration[7]
-
面向 CVS 用户的 Git
- gitdiffcore[7]
-
调整 diff 输出
- giteveryday[7]
-
日常 Git 使用的实用最小命令集
- gitfaq[7]
-
关于使用 Git 的常见问题
- gitglossary[7]
-
Git 词汇表
- gitnamespaces[7]
-
Git 命名空间
- gitremote-helpers[7]
-
与远程仓库交互的辅助程序
- gitsubmodules[7]
-
在一个仓库中挂载另一个仓库
- gittutorial[7]
-
Git 入门教程
- gittutorial-2[7]
-
Git 入门教程:第二部分
- gitworkflows[7]
-
Git 推荐工作流概述
仓库、命令和文件接口
本文档讨论了用户期望直接交互的仓库和命令接口。有关标准的更多详细信息,请参阅 git-help[1] 中的 --user-formats
。
- gitattributes[5]
-
定义每个路径的属性
- gitcli[7]
-
Git 命令行界面和约定
- githooks[5]
-
Git 使用的钩子
- gitignore[5]
-
指定要故意忽略的未跟踪文件
- gitmailmap[5]
-
映射作者/提交者姓名和/或电子邮件地址
- gitmodules[5]
-
定义子模块属性
- gitrepository-layout[5]
-
Git 仓库布局
- gitrevisions[7]
-
指定 Git 的版本和范围
文件格式、协议和其他开发者接口
本文档讨论文件格式、网络协议和其他 Git 开发者接口。请参阅 git-help[1] 中的 --developer-interfaces
。
- gitformat-bundle[5]
-
Bundle 文件格式
- gitformat-chunk[5]
-
基于块的文件格式
- gitformat-commit-graph[5]
-
Git 提交图格式
- gitformat-index[5]
-
Git 索引格式
- gitformat-pack[5]
-
Git 打包格式
- gitformat-signature[5]
-
Git 加密签名格式
- gitprotocol-capabilities[5]
-
协议 v0 和 v1 功能
- gitprotocol-common[5]
-
各种协议的共同点
- gitprotocol-http[5]
-
基于 HTTP 的 Git 协议
- gitprotocol-pack[5]
-
打包如何在网络上传输
- gitprotocol-v2[5]
-
Git 线路协议,版本 2
配置机制
Git 使用简单的文本格式来存储每个仓库和每个用户的自定义设置。这样的配置文件可能如下所示
# # A '#' or ';' character indicates a comment. # ; core variables [core] ; Don't trust file modes filemode = false ; user identity [user] name = "Junio C Hamano" email = "[email protected]"
各种命令读取配置文件并相应地调整其操作。请参阅 git-config[1] 以获取配置机制的列表和更多详细信息。
标识符术语
- <object>
-
表示任何类型对象的object名称。
- <blob>
-
表示blob对象的名称。
- <tree>
-
表示tree对象的名称。
- <commit>
-
表示commit对象的名称。
- <tree-ish>
-
表示tree、commit或tag对象的名称。接受<tree-ish>参数的命令最终希望对<tree>对象进行操作,但会自动取消对指向<tree>的<commit>和<tag>对象的引用。
- <commit-ish>
-
表示commit或tag对象的名称。接受<commit-ish>参数的命令最终希望对<commit>对象进行操作,但会自动取消对指向<commit>的<tag>对象的引用。
- <type>
-
表示需要对象类型。目前包括:
blob
、tree
、commit
或tag
。 - <file>
-
表示文件名 - 几乎总是相对于
GIT_INDEX_FILE
描述的树结构的根目录。
符号标识符
任何接受任何<object>的 Git 命令也可以使用以下符号表示法
有关对象名称拼写方式的更完整列表,请参阅 gitrevisions[7] 中的“指定版本”部分。
术语
请参阅 gitglossary[7]。
环境变量
各种 Git 命令会关注环境变量并更改其行为。标记为“布尔”的环境变量以与布尔值配置变量相同的方式获取其值,例如“true”、“yes”、“on”和正数被视为“yes”。
以下是这些变量
Git 仓库
这些环境变量适用于所有核心 Git 命令。请注意,它们可能被位于 Git 上层的 SCM 使用/覆盖,因此如果使用外部前端,请注意。
-
GIT_INDEX_FILE
-
此环境变量指定备用索引文件。如果未指定,则使用默认的
$GIT_DIR/index
。 -
GIT_INDEX_VERSION
-
此环境变量指定写入索引文件时使用的索引版本。它不会影响现有的索引文件。默认情况下使用索引文件版本 2 或 3。有关更多信息,请参阅 git-update-index[1]。
-
GIT_OBJECT_DIRECTORY
-
如果通过此环境变量指定对象存储目录,则 sha1 目录将在其下创建 - 否则将使用默认的
$GIT_DIR/objects
目录。 -
GIT_ALTERNATE_OBJECT_DIRECTORIES
-
由于 Git 对象的不可变性,旧对象可以存档到共享的只读目录中。此变量指定一个用“:”分隔(在 Windows 上用“;”分隔)的 Git 对象目录列表,这些目录可用于搜索 Git 对象。新对象不会写入这些目录。
以
"
(双引号)开头的条目将被解释为 C 样式的带引号的路径,删除开头和结尾的双引号并尊重反斜杠转义。例如,值"path-with-\"-and-:-in-it":vanilla-path
有两个路径:path-with-"-and-:-in-it
和vanilla-path
。 -
GIT_DIR
-
如果设置了
GIT_DIR
环境变量,则它指定要使用的路径,而不是仓库基础的默认.git
。--git-dir
命令行选项也会设置此值。 -
GIT_WORK_TREE
-
设置工作树根目录的路径。这也可以通过
--work-tree
命令行选项和 core.worktree 配置变量来控制。 -
GIT_NAMESPACE
-
设置 Git 命名空间;有关详细信息,请参阅 gitnamespaces[7]。
--namespace
命令行选项也会设置此值。 -
GIT_CEILING_DIRECTORIES
-
这应该是一个用冒号分隔的绝对路径列表。如果设置,它是一系列 Git 在查找仓库目录时不应向上更改为的目录(对于排除加载缓慢的网络目录很有用)。它不会排除当前工作目录或在命令行或环境中设置的 GIT_DIR。通常,Git 必须读取此列表中的条目并解析可能存在的任何符号链接才能将它们与当前目录进行比较。但是,如果即使此访问速度很慢,您也可以向列表中添加一个空条目以告诉 Git 后续条目不是符号链接并且不需要解析;例如,
GIT_CEILING_DIRECTORIES=/maybe/symlink::/very/slow/non/symlink
。 -
GIT_DISCOVERY_ACROSS_FILESYSTEM
-
在没有“.git”仓库目录的目录中运行时,Git 会尝试在父目录中查找此类目录以查找工作树的顶部,但默认情况下它不会跨越文件系统边界。此布尔环境变量可以设置为 true 以告诉 Git 不要在文件系统边界处停止。与
GIT_CEILING_DIRECTORIES
一样,这不会影响通过GIT_DIR
或在命令行中显式设置的仓库目录。 -
GIT_COMMON_DIR
-
如果此变量设置为路径,则通常位于 $GIT_DIR 中的非工作树文件将改为从此路径获取。特定于工作树的文件(如 HEAD 或索引)将从 $GIT_DIR 获取。有关详细信息,请参阅 gitrepository-layout[5] 和 git-worktree[1]。此变量的优先级低于其他路径变量,例如 GIT_INDEX_FILE、GIT_OBJECT_DIRECTORY…
-
GIT_DEFAULT_HASH
-
如果设置了此变量,则新仓库的默认哈希算法将设置为此值。克隆时会忽略此值,并且始终使用远程仓库的设置。默认值为“sha1”。请参阅 git-init[1] 中的
--object-format
。 -
GIT_DEFAULT_REF_FORMAT
-
如果设置了此变量,则新仓库的默认引用后端格式将设置为此值。默认值为“files”。请参阅 git-init[1] 中的
--ref-format
。
Git 提交
-
GIT_AUTHOR_NAME
-
创建提交或标签对象时或写入 reflog 时使用的作者身份的可读名称。覆盖
user.name
和author.name
配置设置。 -
GIT_AUTHOR_EMAIL
-
创建提交或标签对象时或写入 reflog 时使用的作者身份的电子邮件地址。覆盖
user.email
和author.email
配置设置。 -
GIT_AUTHOR_DATE
-
创建提交或标签对象时或写入 reflog 时使用的作者身份的日期。请参阅 git-commit[1] 以获取有效格式。
-
GIT_COMMITTER_NAME
-
创建提交或标签对象时或写入 reflog 时使用的提交者身份的可读名称。覆盖
user.name
和committer.name
配置设置。 -
GIT_COMMITTER_EMAIL
-
创建提交或标签对象时或写入 reflog 时使用的作者身份的电子邮件地址。覆盖
user.email
和committer.email
配置设置。 -
GIT_COMMITTER_DATE
-
创建提交或标签对象时或写入 reflog 时使用的提交者身份的日期。请参阅 git-commit[1] 以获取有效格式。
-
EMAIL
-
如果未设置其他相关环境变量或配置设置,则用于作者和提交者身份的电子邮件地址。
Git 差异
-
GIT_DIFF_OPTS
-
唯一有效的设置是“--unified=??" 或 "-u??" 以设置创建统一差异时显示的上下文行数。这优先于传递给 Git diff 命令行的任何“-U”或“--unified”选项值。
-
GIT_EXTERNAL_DIFF
-
当设置了环境变量
GIT_EXTERNAL_DIFF
时,将调用其命名的程序来生成差异,并且 Git 不会使用其内置差异机制。对于添加、删除或修改的路径,GIT_EXTERNAL_DIFF
将使用 7 个参数调用path old-file old-hex old-mode new-file new-hex new-mode
其中
- <old|new>-file
-
是 GIT_EXTERNAL_DIFF 可以用来读取 <old|new> 内容的文件,
- <old|new>-hex
-
是 40 位十六进制的 SHA-1 哈希值,
- <old|new>-mode
-
是文件模式的八进制表示。
文件参数可以指向用户的当前工作文件(例如,“git-diff-files”中的
new-file
)、/dev/null
(例如,添加新文件时的old-file
)或临时文件(例如,索引中的old-file
)。GIT_EXTERNAL_DIFF
不需要担心解除临时文件的链接——它会在GIT_EXTERNAL_DIFF
退出时被删除。对于未合并的路径,
GIT_EXTERNAL_DIFF
会调用一个参数 <path>。对于每个
GIT_EXTERNAL_DIFF
调用的路径,都会设置两个环境变量,GIT_DIFF_PATH_COUNTER
和GIT_DIFF_PATH_TOTAL
。 -
GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE
-
如果将此布尔环境变量设置为 true,则
GIT_EXTERNAL_DIFF
命令预计在认为输入文件相等时返回退出代码 0,在认为它们不同时返回退出代码 1,就像diff(1)
一样。如果将其设置为 false(默认值),则命令预计无论是否相等都返回退出代码 0。任何其他退出代码都会导致 Git 报告致命错误。 -
GIT_DIFF_PATH_COUNTER
-
一个从 1 开始的计数器,每个路径递增 1。
-
GIT_DIFF_PATH_TOTAL
-
路径的总数。
其他
-
GIT_MERGE_VERBOSITY
-
控制递归合并策略显示输出量的数字。覆盖 merge.verbosity。参见 git-merge[1]
-
GIT_PAGER
-
此环境变量覆盖
$PAGER
。如果将其设置为空字符串或值“cat”,Git 将不会启动分页器。另请参见 git-config[1] 中的core.pager
选项。 -
GIT_PROGRESS_DELAY
-
控制在显示可选进度指示器之前延迟多少秒的数字。默认为 2。
-
GIT_EDITOR
-
此环境变量覆盖
$EDITOR
和$VISUAL
。当在交互模式下需要启动编辑器时,它会被多个 Git 命令使用。另请参见 git-var[1] 和 git-config[1] 中的core.editor
选项。 -
GIT_SEQUENCE_EDITOR
-
在编辑交互式变基的待办事项列表时,此环境变量会覆盖配置的 Git 编辑器。另请参见 git-rebase[1] 和 git-config[1] 中的
sequence.editor
选项。 -
GIT_SSH
-
GIT_SSH_COMMAND
-
如果设置了这两个环境变量中的任何一个,则当 git fetch 和 git push 需要连接到远程系统时,它们将使用指定的命令而不是 ssh。传递给配置命令的命令行参数由 ssh 变体确定。有关详细信息,请参见 git-config[1] 中的
ssh.variant
选项。$GIT_SSH_COMMAND
优先于$GIT_SSH
,并由 shell 解释,允许包含其他参数。另一方面,$GIT_SSH
必须只是程序的路径(如果需要其他参数,它可以是包装器 shell 脚本)。通常,通过您的个人
.ssh/config
文件配置任何所需的选项更容易。有关更多详细信息,请参阅您的 ssh 文档。 -
GIT_SSH_VARIANT
-
如果设置了此环境变量,它将覆盖 Git 的自动检测,即
GIT_SSH
/GIT_SSH_COMMAND
/core.sshCommand
是否指的是 OpenSSH、plink 或 tortoiseplink。此变量覆盖用于相同目的的配置设置ssh.variant
。 -
GIT_SSL_NO_VERIFY
-
将此环境变量设置为任何值并导出它会告诉 Git 在通过 HTTPS 获取或推送时不要验证 SSL 证书。
-
GIT_ATTR_SOURCE
-
设置将从中读取 gitattributes 的树状结构。
-
GIT_ASKPASS
-
如果设置了此环境变量,则需要获取密码或口令的 Git 命令(例如,用于 HTTP 或 IMAP 身份验证)将使用合适的提示作为命令行参数调用此程序,并从其 STDOUT 读取密码。另请参见 git-config[1] 中的
core.askPass
选项。 -
GIT_TERMINAL_PROMPT
-
如果将此布尔环境变量设置为 false,则 git 将不会在终端上提示(例如,在请求 HTTP 身份验证时)。
-
GIT_CONFIG_GLOBAL
-
GIT_CONFIG_SYSTEM
-
从给定的文件中获取配置,而不是从全局或系统级配置文件中获取。如果设置了
GIT_CONFIG_SYSTEM
,则在构建时定义的系统配置文件(通常为/etc/gitconfig
)将不会被读取。同样,如果设置了GIT_CONFIG_GLOBAL
,则$HOME/.gitconfig
和$XDG_CONFIG_HOME/git/config
都不会被读取。可以将其设置为/dev/null
以跳过读取相应级别的配置文件。 -
GIT_CONFIG_NOSYSTEM
-
是否跳过读取系统范围的
$(prefix)/etc/gitconfig
文件中的设置。此布尔环境变量可以与$HOME
和$XDG_CONFIG_HOME
一起使用以创建用于挑剔脚本的可预测环境,或者可以将其设置为 true 以临时避免使用有问题的/etc/gitconfig
文件,同时等待具有足够权限的人员修复它。 -
GIT_FLUSH
-
如果将此布尔环境变量设置为 true,则诸如 git blame(增量模式)、git rev-list、git log、git check-attr 和 git check-ignore 之类的命令将在每个记录刷新后强制刷新输出流。如果将此变量设置为 false,则这些命令的输出将使用完全缓冲的 I/O 完成。如果未设置此环境变量,Git 将根据 stdout 是否似乎重定向到文件来选择缓冲或面向记录的刷新。
-
GIT_TRACE
-
启用常规跟踪消息,例如别名扩展、内置命令执行和外部命令执行。
如果此变量设置为“1”、“2”或“true”(比较不区分大小写),则跟踪消息将打印到 stderr。
如果变量设置为大于 2 小于 10(严格)的整数值,则 Git 会将此值解释为打开的文件描述符,并尝试将跟踪消息写入此文件描述符。
或者,如果变量设置为绝对路径(以 / 字符开头),则 Git 会将其解释为文件路径,并尝试将跟踪消息追加到其中。
取消设置变量,或将其设置为空、“0”或“false”(不区分大小写)将禁用跟踪消息。
-
GIT_TRACE_FSMONITOR
-
启用文件系统监视器扩展的跟踪消息。有关可用的跟踪输出选项,请参见
GIT_TRACE
。 -
GIT_TRACE_PACK_ACCESS
-
启用对任何打包文件的访问的跟踪消息。对于每次访问,都会记录打包文件名和打包文件中的偏移量。这可能有助于解决某些与打包相关的性能问题。有关可用的跟踪输出选项,请参见
GIT_TRACE
。 -
GIT_TRACE_PACKET
-
启用对进入或离开给定程序的所有数据包的跟踪消息。这可以帮助调试对象协商或其他协议问题。跟踪在以“PACK”开头的包处关闭(但请参见下面的
GIT_TRACE_PACKFILE
)。有关可用的跟踪输出选项,请参见GIT_TRACE
。 -
GIT_TRACE_PACKFILE
-
启用由给定程序发送或接收的打包文件的跟踪。与其他跟踪输出不同,此跟踪是逐字的:没有标题,也没有对二进制数据的引用。您几乎肯定希望将其定向到文件(例如,
GIT_TRACE_PACKFILE=/tmp/my.pack
)而不是在终端上显示它或将其与其他跟踪输出混合。请注意,这目前仅在克隆和获取的客户端侧实现。
-
GIT_TRACE_PERFORMANCE
-
启用与性能相关的跟踪消息,例如每个 Git 命令的总执行时间。有关可用的跟踪输出选项,请参见
GIT_TRACE
。 -
GIT_TRACE_REFS
-
启用对 ref 数据库操作的跟踪消息。有关可用的跟踪输出选项,请参见
GIT_TRACE
。 -
GIT_TRACE_SETUP
-
启用在 Git 完成其设置阶段后打印 .git、工作树和当前工作目录的跟踪消息。有关可用的跟踪输出选项,请参见
GIT_TRACE
。 -
GIT_TRACE_SHALLOW
-
启用可以帮助调试浅层存储库的获取/克隆的跟踪消息。有关可用的跟踪输出选项,请参见
GIT_TRACE
。 -
GIT_TRACE_CURL
-
启用 git 传输协议的所有传入和传出数据的 curl 完全跟踪转储,包括描述性信息。这类似于在命令行上对 curl 执行
--trace-ascii
。有关可用的跟踪输出选项,请参见GIT_TRACE
。 -
GIT_TRACE_CURL_NO_DATA
-
启用 curl 跟踪时(请参见上面的
GIT_TRACE_CURL
),不要转储数据(即,仅转储信息行和标题)。 -
GIT_TRACE2
-
启用来自“trace2”库的更详细的跟踪消息。
GIT_TRACE2
的输出是一种简单的基于文本的格式,供人类阅读。如果此变量设置为“1”、“2”或“true”(比较不区分大小写),则跟踪消息将打印到 stderr。
如果变量设置为大于 2 小于 10(严格)的整数值,则 Git 会将此值解释为打开的文件描述符,并尝试将跟踪消息写入此文件描述符。
或者,如果变量设置为绝对路径(以 / 字符开头),则 Git 会将其解释为文件路径,并尝试将跟踪消息追加到其中。如果路径已存在并且是目录,则跟踪消息将写入该目录中的文件(每个进程一个),并根据 SID 的最后一个组件和可选计数器命名(以避免文件名冲突)。
此外,如果变量设置为
af_unix:[<socket-type>:]<absolute-pathname>
,则 Git 将尝试将路径打开为 Unix 域套接字。套接字类型可以是stream
或dgram
。取消设置变量,或将其设置为空、“0”或“false”(不区分大小写)将禁用跟踪消息。
有关完整详细信息,请参见 Trace2 文档。
-
GIT_TRACE2_EVENT
-
此设置编写适合机器解释的基于 JSON 的格式。有关可用的跟踪输出选项,请参见
GIT_TRACE2
,有关完整详细信息,请参见 Trace2 文档。 -
GIT_TRACE2_PERF
-
除了
GIT_TRACE2
中提供的基于文本的消息外,此设置还会写入一种基于列的格式,用于理解嵌套区域。有关可用的跟踪输出选项,请参见GIT_TRACE2
,并参阅Trace2 文档以获取完整详细信息。 -
GIT_TRACE_REDACT
-
默认情况下,当激活跟踪时,Git 会屏蔽 cookie 的值、“Authorization:” 头、“Proxy-Authorization:” 头和 packfile URI。将此布尔环境变量设置为 false 以防止此屏蔽操作。
-
GIT_NO_REPLACE_OBJECTS
-
设置和导出此环境变量会告诉 Git 忽略替换引用,并且不替换 Git 对象。
-
GIT_LITERAL_PATHSPECS
-
将此布尔环境变量设置为 true 会导致 Git 将所有路径规范视为字面量,而不是作为通配符模式。例如,运行
GIT_LITERAL_PATHSPECS=1 git log -- '*.c'
将搜索触及路径*.c
的提交,而不是通配符*.c
匹配的任何路径。如果您正在向 Git 提供字面路径(例如,之前由git ls-tree
、--raw
diff 输出等提供的路径),您可能需要这样做。 -
GIT_GLOB_PATHSPECS
-
将此布尔环境变量设置为 true 会导致 Git 将所有路径规范视为通配符模式(又名“glob”魔法)。
-
GIT_NOGLOB_PATHSPECS
-
将此布尔环境变量设置为 true 会导致 Git 将所有路径规范视为字面量(又名“literal”魔法)。
-
GIT_ICASE_PATHSPECS
-
将此布尔环境变量设置为 true 会导致 Git 将所有路径规范视为不区分大小写。
-
GIT_NO_LAZY_FETCH
-
将此布尔环境变量设置为 true 会告诉 Git 不要根据需要延迟从承诺者远程获取缺少的对象。
-
GIT_REFLOG_ACTION
-
当引用更新时,会创建引用日志条目以跟踪更新引用的原因(通常是更新引用的高级命令的名称),以及引用的旧值和新值。脚本化的瓷器命令可以使用
git-sh-setup
中的set_reflog_action
辅助函数在被最终用户作为顶级命令调用时将它的名称设置为此变量,以便记录在引用日志的主体中。 -
GIT_REF_PARANOIA
-
如果此布尔环境变量设置为 false,则在迭代引用列表时忽略损坏或命名错误的引用。通常,Git 会尝试包含任何此类引用,这可能会导致某些操作失败。这通常是可取的,因为潜在的破坏性操作(例如,git-prune[1])最好中止而不是忽略损坏的引用(从而认为它们指向的历史记录不值得保存)。默认值为
1
(即,对检测和中止所有操作保持谨慎)。您通常不需要将其设置为0
,但当尝试从损坏的存储库中抢救数据时,它可能很有用。 -
GIT_COMMIT_GRAPH_PARANOIA
-
从提交图加载提交对象时,Git 会在对象数据库中对该对象执行存在性检查。这样做是为了避免出现包含对已删除提交的引用的陈旧提交图的问题,但会带来性能损失。
默认值为“false”,它禁用上述行为。将其设置为“true”将启用存在性检查,以便陈旧的提交永远不会从提交图中返回,但会以牺牲性能为代价。
-
GIT_ALLOW_PROTOCOL
-
如果设置为以冒号分隔的协议列表,则行为就像
protocol.allow
设置为never
一样,并且列出的每个协议都将protocol.<name>.allow
设置为always
(覆盖任何现有配置)。有关更多详细信息,请参阅git-config[1]中protocol.allow
的说明。 -
GIT_PROTOCOL_FROM_USER
-
将此布尔环境变量设置为 false 以防止 fetch/push/clone 使用的协议配置为
user
状态。这对于限制从不受信任的存储库进行递归子模块初始化或用于将潜在不受信任的 URL 提供给 git 命令的程序很有用。有关更多详细信息,请参阅git-config[1]。 -
GIT_PROTOCOL
-
仅供内部使用。用于协商线协议。包含以冒号:分隔的键列表,以及可选的值<key>[=<value>]。必须忽略未知键和值的存在。
请注意,服务器可能需要进行配置才能允许此变量通过某些传输。在访问本地存储库(即
file://
或文件系统路径)以及通过git://
协议时,它将自动传播。对于 git-over-http,它应该在大多数配置中自动工作,但请参阅git-http-backend[1]中的讨论。对于 git-over-ssh,ssh 服务器可能需要进行配置才能允许客户端传递此变量(例如,通过使用 OpenSSH 的AcceptEnv GIT_PROTOCOL
)。此配置是可选的。如果未传播该变量,则客户端将回退到原始的“v0”协议(但可能会错过一些性能改进或功能)。此变量目前仅影响克隆和获取;它尚未用于推送(但将来可能会使用)。
-
GIT_OPTIONAL_LOCKS
-
如果此布尔环境变量设置为 false,则 Git 将完成任何请求的操作,而不会执行任何需要获取锁的可选子操作。例如,这将阻止
git status
作为副作用刷新索引。这对于在后台运行并且不想与存储库上的其他操作导致锁争用的进程很有用。默认为1
。 -
GIT_REDIRECT_STDIN
-
GIT_REDIRECT_STDOUT
-
GIT_REDIRECT_STDERR
-
仅限 Windows:允许将标准输入/输出/错误句柄重定向到环境变量指定的路径。这在多线程应用程序中特别有用,在这些应用程序中,通过
CreateProcess()
传递标准句柄的规范方法不可用,因为这需要将句柄标记为可继承(因此**每个**生成的进程都将继承它们,可能会阻止常规的 Git 操作)。主要预期用例是使用命名管道进行通信(例如\\.\pipe\my-git-stdin-123
)。支持两个特殊值:
off
将简单地关闭相应的标准句柄,如果GIT_REDIRECT_STDERR
是2>&1
,则标准错误将重定向到与标准输出相同的句柄。 -
GIT_PRINT_SHA1_ELLIPSIS
(已弃用) -
如果设置为
yes
,则在(缩写)SHA-1 值后面打印省略号。这会影响分离 HEAD 的指示(git-checkout[1])和原始 diff 输出(git-diff[1])。在提到的情况下打印省略号不再被认为足够,并且在可预见的将来(以及该变量一起)可能会删除对它的支持。 -
GIT_ADVICE
-
如果设置为
0
,则禁用所有建议消息。这些消息旨在为人类用户提供提示,这些提示可能帮助他们摆脱有问题的状况或利用新功能。用户可以使用advice.*
配置键禁用单个消息。这些消息可能会干扰执行 Git 进程的工具,因此此变量可用于禁用这些消息。(--no-advice
全局选项也可使用,但旧版本的 Git 在不理解此选项时可能会失败。不支持它的 Git 版本将忽略此环境变量。)
讨论
有关以下内容的更多详细信息,请参阅用户手册的 Git 概念章节和gitcore-tutorial[7]。
Git 项目通常由一个工作目录组成,该目录在顶层有一个“.git”子目录。.git 目录包含(除其他事项外)一个压缩的对象数据库,该数据库表示项目的完整历史记录,一个“索引”文件,该文件将该历史记录链接到工作树的当前内容,以及指向该历史记录的命名指针,例如标签和分支头。
对象数据库包含三种主要类型对象:blob,用于保存文件数据;tree,用于指向 blob 和其他 tree 以构建目录层次结构;以及 commit,每个 commit 都引用单个 tree 和一些父 commit。
commit 等同于其他系统称为“changeset”或“version”的东西,表示项目历史中的一个步骤,每个父级都表示一个紧接在前的步骤。具有多个父级的 commit 表示独立开发线的合并。
所有对象都以其内容的 SHA-1 哈希命名,通常写成 40 个十六进制数字的字符串。此类名称是全局唯一的。可以通过仅签名该提交来证明导致提交的整个历史记录。为此目的提供了第四种对象类型,即标签。
首次创建时,对象存储在单个文件中,但为了提高效率,以后可能会压缩到“pack 文件”中。
名为 ref 的命名指针标记历史记录中的有趣点。ref 可以包含对象的 SHA-1 名称或另一个 ref 的名称(后者称为“符号 ref”)。名称以refs/head/
开头的 ref 包含正在开发的分支的最新提交(或“head”)的 SHA-1 名称。感兴趣的标签的 SHA-1 名称存储在refs/tags/
下。名为HEAD
的符号 ref 包含当前签出分支的名称。
索引文件初始化时包含所有路径的列表,以及每个路径对应的 Blob 对象和一组属性。Blob 对象表示当前分支头部时的文件内容。属性(最后修改时间、大小等)取自工作树中对应的文件。可以通过比较这些属性来找到工作树的后续更改。索引可以更新为新内容,并且可以根据存储在索引中的内容创建新的提交。
索引还可以为给定的路径名存储多个条目(称为“阶段”)。当合并正在进行时,这些阶段用于保存文件的各种未合并版本。
安全性
某些配置选项和钩子文件可能会导致 Git 运行任意的 shell 命令。由于配置和钩子不会使用 git clone
复制,因此克隆包含不受信任内容的远程仓库通常是安全的,可以使用 git log
检查它们,等等。
但是,当 .git
目录本身来自不受信任的来源时,在 .git
目录(或其周围的工作树)中运行 Git 命令是不安全的。其配置和钩子中的命令将以通常的方式执行。
默认情况下,当仓库由运行命令的用户以外的用户拥有时,Git 将拒绝运行。请参阅 git-config[1] 中 safe.directory
的条目。虽然这可以在多用户环境中帮助保护您,但请注意,您也可以获取由您自己拥有的不受信任的仓库(例如,如果您从不受信任的来源解压缩 zip 文件或 tarball)。在这种情况下,您需要先“清理”不受信任的仓库。
如果您有一个不受信任的 .git
目录,您应该首先使用 git clone --no-local
克隆它以获取干净的副本。Git 确实限制了 upload-pack
将运行的选项和钩子的集合,upload-pack
处理克隆或获取的服务器端,但请注意,针对 upload-pack
的攻击面很大,因此这确实存在一些风险。最安全的方法是以非特权用户身份提供仓库服务(通过 git-daemon[1]、ssh 或使用其他工具更改用户 ID)。请参阅 git-upload-pack[1] 的“安全性”部分中的讨论。
更多文档
请参阅“描述”部分中的参考,以开始使用 Git。以下内容可能比第一次用户需要的更多。
用户手册中的 Git 概念章节 和 gitcore-tutorial[7] 都提供了对底层 Git 架构的介绍。
有关推荐工作流程的概述,请参阅 gitworkflows[7]。
另请参阅 howto 文档,了解一些有用的示例。
内部结构在 Git API 文档 中有记录。
从 CVS 迁移的用户可能还想阅读 gitcvs-migration[7]。
作者
Git 由 Linus Torvalds 发起,目前由 Junio C Hamano 维护。Git 邮件列表 <[email protected]> 做出了大量贡献。 https://openhub.net/p/git/contributors/summary 提供了更完整的贡献者列表。
如果您有 git.git 本身的克隆,则 git-shortlog[1] 和 git-blame[1] 的输出可以显示项目特定部分的作者。
报告错误
将错误报告到 Git 邮件列表 <[email protected]>,开发和维护主要在这里完成。您不必订阅该列表即可向其发送消息。请参阅 https://lore.kernel.org/git 上的列表存档,了解以前的错误报告和其他讨论。
与安全相关的错误应私下披露给 Git 安全邮件列表 <[email protected]>。
GIT
git[1] 套件的一部分