设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
-
2.53.0
2026-02-02
-
2.52.0
2025-11-17
- 2.51.2 无变更
-
2.51.1
2025-10-15
- 2.50.1 → 2.51.0 无变更
-
2.50.0
2025-06-16
- 2.49.1 无更改
-
2.49.0
2025-03-14
- 2.48.1 → 2.48.2 无更改
-
2.48.0
2025-01-10
- 2.47.1 → 2.47.3 无更改
-
2.47.0
2024-10-06
- 2.46.1 → 2.46.4 无更改
-
2.46.0
2024-07-29
- 2.45.2 → 2.45.4 无变更
-
2.45.1
2024-04-29
-
2.45.0
2024-04-29
- 2.44.2 → 2.44.4 无变更
-
2.44.1
2024-04-19
-
2.44.0
2024-02-23
- 2.43.5 → 2.43.7 无变更
-
2.43.4
2024-04-19
- 2.43.2 → 2.43.3 无变更
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.42.3 → 2.42.4 无变更
-
2.42.2
2024-04-19
-
2.42.1
2023-11-02
-
2.42.0
2023-08-21
- 2.41.2 → 2.41.3 无变更
-
2.41.1
2024-04-19
-
2.41.0
2023-06-01
- 2.40.3 → 2.40.4 无变更
-
2.40.2
2024-04-19
- 2.40.1 无变更
- 2.40.0 无变更
- 2.39.5 无更改
-
2.39.4
2024-04-19
- 2.39.1 → 2.39.3 无变更
-
2.39.0
2022-12-12
- 2.38.3 → 2.38.5 无更改
-
2.38.2
2022-12-11
- 2.38.1 无更改
-
2.38.0
2022-10-02
- 2.37.3 → 2.37.7 无更改
-
2.37.2
2022-08-11
- 2.37.1 无变更
-
2.37.0
2022-06-27
- 2.36.1 → 2.36.6 无更改
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 无更改
-
2.35.0
2022-01-24
- 2.34.1 → 2.34.8 无更改
-
2.34.0
2021-11-15
- 2.33.3 → 2.33.8 无变更
-
2.33.2
2022-03-23
-
2.33.1
2021-10-12
- 2.32.1 → 2.33.0 无更改
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 无更改
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 无更改
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 无更改
-
2.29.0
2020-10-19
- 2.28.1 无更改
-
2.28.0
2020-07-27
- 2.27.1 无更改
-
2.27.0
2020-06-01
- 2.26.1 → 2.26.3 无更改
-
2.26.0
2020-03-22
- 2.25.2 → 2.25.5 无更改
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 无更改
-
2.23.0
2019-08-16
- 2.22.2 → 2.22.5 无更改
-
2.22.1
2019-08-11
-
2.22.0
2019-06-07
- 2.20.1 → 2.21.4 无更改
-
2.20.0
2018-12-09
- 2.19.3 → 2.19.6 无更改
-
2.19.2
2018-11-21
- 2.19.1 无更改
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 无更改
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 无更改
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
- 2.13.7 无更改
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
概要
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] 手册页为您提供了命令行命令语法的概览。
最新 Git 文档的格式化和带超链接的副本可以在 https://git.github.io/htmldocs/git.html 或 https://git-scm.cn/docs 查看。
选项
- -v
- --version
-
打印 git 程序所属的 Git 套件版本。
此选项在内部转换为
gitversion... 并且接受与 git-version[1] 命令相同的选项。如果同时给出了--help,则它的优先级高于--version。 - -h
- --help
-
打印概要和最常用命令列表。如果给出了
--all或-a选项,则打印所有可用命令。如果指定了一个 Git 命令,此选项将调出该命令的手册页。还有其他选项可用于控制手册页的显示方式。有关更多信息,请参见 git-help[1],因为
git--help... 在内部被转换为githelp...。 - -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-cfoo.bar... 中省略=是允许的,并将foo.bar设置为布尔真值(就像配置文件中的 [foo]bar一样)。包含等号但值为空(如git-cfoo.bar=...)会将foo.bar设置为空字符串,gitconfig--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 工作树的顶层在哪里。如果你只想让 git 运行效果就像在 <path> 中启动一样,请使用
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
-
不要按需从 promisor 远程仓库获取缺失的对象。与
gitcat-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 的内置命令)、deprecated(已弃用的内置命令)、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环境变量。
高层命令 (porcelain)
我们将瓷器命令分为主要命令和一些辅助用户工具。
主要瓷器命令
- git-add[1]
-
将文件内容添加到索引
- git-am[1]
-
从邮箱中应用一系列补丁
- git-archive[1]
-
从指定树创建文件的归档
- git-backfill[1]
-
在部分克隆中下载缺失的对象
- git-bisect[1]
-
使用二分查找找到引入 bug 的提交
- 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]
-
创建、列出、删除或验证标签
- 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]
-
管理引用日志信息
- git-refs[1]
-
对引用的底层访问
- git-remote[1]
-
管理跟踪的仓库集
- git-repack[1]
-
打包仓库中未打包的对象
- git-replace[1]
-
创建、列出、删除用于替换对象的引用
查询类
- git-annotate[1]
-
使用提交信息批注文件行
- git-blame[1]
-
显示文件的每一行最后是由哪个修订版本和作者修改的
- git-bugreport[1]
-
收集信息供用户提交 Bug 报告
- git-count-objects[1]
-
计算未打包对象的数量及其磁盘消耗
- git-diagnose[1]
-
生成诊断信息的 zip 归档
- git-difftool[1]
-
使用常用的差异工具显示更改
- 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 仓库导入并向其提交
- git-quiltimport[1]
-
将 quilt 补丁集应用到当前分支
- git-request-pull[1]
-
生成待处理更改的摘要
- git-send-email[1]
-
以电子邮件形式发送补丁集
- git-svn[1]
-
Subversion 仓库与 Git 之间的双向操作
重置 (reset)、恢复 (restore) 和反转 (revert)
有三个名称类似的命令:git reset、git restore 和 git revert。
-
git-revert[1] 用于创建一个新的提交,该提交会反转由其他提交所做的更改。
-
git-restore[1] 用于从索引或另一个提交中恢复工作树文件。此命令不会更新你的分支。该命令也可用于从另一个提交中恢复索引中的文件。
-
git-reset[1] 用于更新你的分支,移动分支尖端以从分支中添加或删除提交。此操作会更改提交历史。
gitreset也可用于恢复索引,功能与gitrestore有重叠。
底层命令 (plumbing)
尽管 Git 包含了自己的瓷器层,但其底层命令足以支持开发替代瓷器程序。此类瓷器的开发者可以从阅读 git-update-index[1] 和 git-read-tree[1] 开始。
这些底层命令的接口(输入、输出、选项集和语义)旨在比瓷器级命令稳定得多,因为这些命令主要用于脚本。另一方面,为了改善最终用户的体验,瓷器命令的接口可能会发生变化。
以下说明将底层命令分为:操作对象(在仓库、索引和工作树中)的命令、查询和比较对象的命令,以及在仓库之间移动对象和引用的命令。
操作命令
- git-apply[1]
-
将补丁应用到文件和/或索引
- git-checkout-index[1]
-
将文件从索引复制到工作树
- git-commit-graph[1]
-
写入并验证 Git commit-graph 文件
- 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-pairs[1]
-
比较提供的 blob 对的内容和模式
- 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-last-modified[1]
-
实验性:显示文件最后修改的时间
- git-ls-files[1]
-
显示有关索引和工作树中文件的信息
- git-ls-remote[1]
-
列出远程仓库中的引用
- git-ls-tree[1]
-
列出树对象的内容
- git-merge-base[1]
-
为合并查找尽可能好的共同祖先
- git-name-rev[1]
-
为给定的修订版本查找符号名称
- git-pack-redundant[1]
-
查找冗余的包文件
- git-repo[1]
-
检索有关仓库的信息
- 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]
-
Git Over HTTP 的服务端实现
- git-send-pack[1]
-
通过 Git 协议将对象推送到另一个仓库
- git-update-server-info[1]
-
更新辅助信息文件以帮助哑服务器 (dumb server)
以下是上述命令使用的辅助命令;终端用户通常不直接使用它们。
- 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 钩子
- 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]
-
微调差异输出
- 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 commit-graph 格式
- 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 = "gitster@pobox.com"
各种命令从配置文件中读取信息并相应地调整其操作。请参阅 git-config[1] 以获取列表和关于配置机制的更多详细信息。
标识符术语
- <object>
-
表示任何类型对象的对象名称。
- <blob>
-
表示 blob 对象名称。
- <tree>
-
表示树对象名称。
- <commit>
-
表示提交对象名称。
- <tree-ish>
-
表示树、提交或标签对象名称。接受 <tree-ish> 参数的命令最终希望操作 <tree> 对象,但会自动解引用指向 <tree> 的 <commit> 和 <tag> 对象。
- <commit-ish>
-
表示提交或标签对象名称。接受 <commit-ish> 参数的命令最终希望操作 <commit> 对象,但会自动解引用指向 <commit> 的 <tag> 对象。
- <type>
-
表示需要一个对象类型。目前是以下之一:
blob、tree、commit或tag。 - <file>
-
表示文件名 - 几乎总是相对于
GIT_INDEX_FILE所描述的树结构的根目录。
符号标识符
任何接受 <object> 的 Git 命令也可以使用以下符号标记法
有关拼写对象名称的更完整列表,请参见 gitrevisions[7] 中的“指定修订版本”部分。
术语
请参见 gitglossary[7]。
环境变量
各种 Git 命令会关注环境变量并改变其行为。标记为 "Boolean"(布尔值)的环境变量采用与布尔配置变量相同的方式,即 "true"、"yes"、"on" 和正数被视为 "yes",而 "false"、"no"、"off" 和 "0" 被视为 "no"。
以下是这些变量
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 在寻找仓库目录时,将不会 chdir(向上切换目录)进入这些目录(对于排除加载缓慢的网络目录很有用)。它不会排除当前工作目录或在命令行或环境中设置的 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-
创建提交或标签对象或写入引用日志时,在作者身份中使用的人类可读姓名。会覆盖
user.name和author.name配置设置。 GIT_AUTHOR_EMAIL-
创建提交或标签对象或写入引用日志时,在作者身份中使用的电子邮件地址。会覆盖
user.email和author.email配置设置。 GIT_AUTHOR_DATE-
创建提交或标签对象或写入引用日志时,为作者身份使用的日期。有效格式请参见 git-commit[1]。
GIT_COMMITTER_NAME-
创建提交或标签对象或写入引用日志时,在提交者身份中使用的人类可读姓名。会覆盖
user.name和committer.name配置设置。 GIT_COMMITTER_EMAIL-
创建提交或标签对象或写入引用日志时,在作者身份中使用的电子邮件地址。会覆盖
user.email和committer.email配置设置。 GIT_COMMITTER_DATE-
创建提交或标签对象或写入引用日志时,为提交者身份使用的日期。有效格式请参见 git-commit[1]。
EMAIL-
如果未设置其他相关的环境变量或配置设置,则在作者和提交者身份中使用的电子邮件地址。
Git 差异 (Diff)
GIT_DIFF_OPTS-
唯一有效的设置是 "--unified=??" 或 "-u??",用于设置创建统一差异时显示的上下文行数。这优先于 Git diff 命令行上传递的任何 "-U" 或 "--unified" 选项值。
GIT_EXTERNAL_DIFF-
当设置了环境变量
GIT_EXTERNAL_DIFF时,将调用由它命名的程序来生成差异,Git 不使用其内置的差异机制。对于添加、删除或修改的路径,将使用 7 个参数调用GIT_EXTERNAL_DIFFpath 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-
控制在显示可选进度指示器之前延迟多少秒的数字。默认为 1。
GIT_EDITOR-
此环境变量覆盖
$EDITOR和$VISUAL。当在交互模式下需要启动编辑器时,它会被多个 Git 命令使用。另见 git-var[1] 和 git-config[1] 中的core.editor选项。 GIT_SEQUENCE_EDITOR-
此环境变量在编辑交互式变基(rebase)的待办列表(todo list)时,覆盖配置的 Git 编辑器。另见 git-rebase[1] 和 git-config[1] 中的
sequence.editor选项。 GIT_SSHGIT_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 的树状对象(treeish)。
GIT_ASKPASS-
如果设置了此环境变量,那么需要获取密码或密码短语(例如用于 HTTP 或 IMAP 身份验证)的 Git 命令将使用适当的提示作为命令行参数调用此程序,并从其标准输出(STDOUT)中读取密码。另见 git-config[1] 中的
core.askPass选项。 GIT_TERMINAL_PROMPT-
如果此布尔环境变量设置为 false,git 将不会在终端上进行提示(例如,在请求 HTTP 身份验证时)。
GIT_CONFIG_GLOBALGIT_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-
启用对任何包(pack)的所有访问的跟踪消息。对于每次访问,都会记录包文件名和包中的偏移量。这可能有助于排查一些与包相关的性能问题。有关可用的跟踪输出选项,请参阅
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 database)操作的跟踪消息。有关可用的跟踪输出选项,请参阅
GIT_TRACE。 GIT_TRACE_SETUP-
在 Git 完成设置阶段后启用跟踪消息,打印 .git、工作树和当前工作目录。有关可用的跟踪输出选项,请参阅
GIT_TRACE。 GIT_TRACE_SHALLOW-
启用有助于调试浅表(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 域套接字(Unix Domain Socket)打开。套接字类型可以是stream或dgram。取消设置该变量,或将其设置为空、"0" 或 "false"(不区分大小写)会禁用跟踪消息。
有关完整详情,请参阅 Trace2 文档。
GIT_TRACE2_EVENT-
此设置写入一种适合机器解释的基于 JSON 的格式。有关可用的跟踪输出选项,请参见
GIT_TRACE2,有关完整详情,请参见 Trace2 文档。 GIT_TRACE2_PERF-
除了
GIT_TRACE2中提供的基于文本的消息外,此设置还写入一种基于列的格式,用于了解嵌套区域。有关可用的跟踪输出选项,请参见GIT_TRACE2,有关完整详情,请参见 Trace2 文档。 GIT_TRACE_REDACT-
默认情况下,当激活跟踪时,Git 会脱敏(redact)Cookie 的值、"Authorization:" 标头、"Proxy-Authorization:" 标头和包文件 URI。将此布尔环境变量设置为 false 可防止这种脱敏操作。
GIT_NO_REPLACE_OBJECTS-
设置并导出此环境变量会告诉 Git 忽略替换引用,不要替换 Git 对象。
GIT_LITERAL_PATHSPECS-
将此布尔环境变量设置为 true 会使 Git 将所有路径规格(pathspecs)视为字面量,而不是 glob 模式。例如,运行
GIT_LITERAL_PATHSPECS=1gitlog--'*.c'将搜索涉及路径*.c的提交,而不是 glob*.c匹配的任何路径。如果您向 Git 提供字面路径(例如,先前由gitls-tree、--rawdiff 输出等给出的路径),则可能需要此设置。 GIT_GLOB_PATHSPECS-
将此布尔环境变量设置为 true 将使 Git 将所有路径规格视为 glob 模式(即 "glob" 魔法)。
GIT_NOGLOB_PATHSPECS-
将此布尔环境变量设置为 true 将使 Git 将所有路径规格视为字面量(即 "literal" 魔法)。
GIT_ICASE_PATHSPECS-
将此布尔环境变量设置为 true 将使 Git 将所有路径规格视为不区分大小写。
GIT_NO_LAZY_FETCH-
将此布尔环境变量设置为 true 会告诉 Git 不要根据需要从承诺远程(promisor remote)延迟提取丢失的对象。
GIT_REFLOG_ACTION-
当引用被更新时,会创建引用日志(reflog)条目,除了记录引用的旧值和新值外,还会记录更新引用的原因(通常是更新引用的高级命令的名称)。当脚本化的 Porcelain 命令被最终用户作为顶层命令调用时,可以使用
git-sh-setup中的 set_reflog_action 辅助函数将其名称设置到此变量中,以便记录在 reflog 的正文中。 GIT_REF_PARANOIA-
如果此布尔环境变量设置为 false,则在迭代引用列表时忽略损坏或命名不当的引用。通常 Git 会尝试包含任何此类引用,这可能会导致某些操作失败。这通常是更好的选择,因为对于具有潜在破坏性的操作(例如 git-prune[1]),最好是中止操作而不是忽略损坏的引用(从而认为它们指向的历史不值得保存)。默认值为
1(即对检测和中止所有操作保持警惕)。通常不需要将其设置为0,但在尝试从损坏的仓库中挽救数据时可能会有用。 GIT_COMMIT_GRAPH_PARANOIA-
从提交图(commit-graph)加载提交对象时,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状态的协议。这对于限制来自不受信任存储库的递归子模块初始化,或者对于向 git 命令提供潜在不受信任 URL 的程序非常有用。有关更多详情,请参见 git-config[1]。 GIT_PROTOCOL-
仅限内部使用。用于有线协议(wire protocol)的握手。包含一个冒号 : 分隔的键列表,带有可选值 <key>[=<value>]。必须忽略未知的键和值。
请注意,可能需要配置服务器以允许此变量通过某些传输协议。在访问本地仓库(即
file://或文件系统路径)以及通过git://协议时,它将自动传播。对于 git-over-http,它在大多数配置中应该自动工作,但请参阅 git-http-backend[1] 中的讨论。对于 git-over-ssh,可能需要配置 ssh 服务器以允许客户端传递此变量(例如,在 OpenSSH 中使用AcceptEnvGIT_PROTOCOL)。此配置是可选的。如果变量未传播,则客户端将退回到原始的 "v0" 协议(但可能会错过某些性能改进或功能)。此变量目前仅影响克隆和提取;它尚未用于推送(但将来可能会使用)。
GIT_OPTIONAL_LOCKS-
如果此布尔环境变量设置为 false,Git 将完成任何请求的操作,而不会执行任何需要获取锁的可选子操作。例如,这将防止
gitstatus将刷新索引作为副作用。这对于在后台运行且不希望与仓库中的其他操作引起锁竞争的进程非常有用。默认值为1。 GIT_REDIRECT_STDINGIT_REDIRECT_STDOUTGIT_REDIRECT_STDERR-
仅限 Windows:允许将标准输入/输出/错误句柄重定向到环境变量指定的路径。这在多线程应用程序中特别有用,因为通过
CreateProcess() 传递标准句柄的规范方法不可选,因为它要求句柄被标记为可继承(因此每个生成的进程都会继承它们,可能会阻塞常规 Git 操作)。主要的预期用例是使用命名管道进行通信(例如 \\.\pipe\my-git-stdin-123)。支持两个特殊值:
off将简单地关闭相应的标准句柄;如果GIT_REDIRECT_STDERR为 2>&1,标准错误将被重定向到与标准输出相同的句柄。 GIT_PRINT_SHA1_ELLIPSIS(已弃用)-
如果设置为
yes,则在(缩写的)SHA-1 值后打印省略号。这会影响分离头指针(detached HEAD)的指示(git-checkout[1])和原始 diff 输出(git-diff[1])。在上述情况下打印省略号不再被认为是合适的,并且很可能在可预见的将来移除对其的支持(连同该变量)。 GIT_ADVICE-
如果设置为
0,则禁用所有建议(advice)消息。这些消息旨在为人类用户提供提示,帮助他们摆脱困境或利用新功能。用户可以使用advice.*配置项禁用单个消息。这些消息可能会对执行 Git 进程的工具造成干扰,因此此变量可用于禁用这些消息。(--no-advice全局选项也可用,但旧版本的 Git 在不理解此选项时可能会失败。不理解此环境变量的 Git 版本将忽略它。)
讨论
有关以下内容的更多详细信息,可从 用户手册的 Git 概念章节 和 gitcore-tutorial[7] 中获得。
Git 项目通常由一个顶层带有 ".git" 子目录的工作目录组成。.git 目录包含(除其他外)一个表示项目完整历史记录的压缩对象数据库、一个将该历史记录链接到工作树当前内容的 "index"(索引)文件,以及指向该历史记录的命名指针(如标签和分支头)。
对象数据库包含三种主要类型的对象:blob(数据对象),保存文件数据;tree(树对象),指向 blob 和其他 tree 以构建目录层次结构;以及 commit(提交对象),每个提交指向一个 tree 和若干个父提交。
提交(commit)等同于其他系统中所谓的 "changeset"(变更集)或 "version"(版本),代表项目历史中的一个步骤,每个父提交代表紧接其前的一个步骤。具有多个父提交的提交代表独立开发路线的合并。
所有对象都根据其内容的 SHA-1 哈希值命名,通常写成 40 位十六进制数字的字符串。这些名称是全局唯一的。通过仅对一个提交进行签名,就可以保证通向该提交的整个历史记录。为此提供了第四种对象类型:tag(标签)。
最初创建时,对象存储在单个文件中,但为了提高效率,稍后可能会被压缩到 "pack files"(包文件)中。
名为 refs(引用)的命名指针标记了历史中的重要点。一个引用可以包含一个对象的 SHA-1 名称或另一个引用的名称(后者称为 "symbolic ref",即符号引用)。名称以 refs/heads/ 开头的引用包含正在开发的分支的最新提交(或 "head")的 SHA-1 名称。感兴趣的标签的 SHA-1 名称存储在 refs/tags/ 下。名为 HEAD 的符号引用包含当前检出分支的名称。
索引(index)文件由所有路径的列表初始化,并且对于每个路径,包含一个 blob 对象和一组属性。该 blob 对象代表当前分支头部的对应文件内容。属性(最后修改时间、大小等)取自工作树中的相应文件。可以通过比较这些属性来发现工作树后续的变化。索引可以使用新内容更新,并且可以从索引中存储的内容创建新的提交。
索引还能够为给定的路径名存储多个条目(称为 "stages",阶段)。当合并正在进行时,这些阶段用于保存文件的各种未合并版本。
安全性
某些配置选项和钩子(hook)文件可能会导致 Git 运行任意 shell 命令。因为配置和钩子不会使用 git clone 复制,所以通常可以安全地克隆具有不受信任内容的远程仓库,并使用 git log 等进行检查。
然而,当 .git 目录本身来自不受信任的源时,在 .git 目录(或其周围的工作树)中运行 Git 命令是不安全的。其配置和钩子中的命令会以通常的方式执行。
默认情况下,当仓库所有者不是运行命令的用户时,Git 将拒绝运行。参见 git-config[1] 中关于 safe.directory 的条目。虽然这可以帮助在多用户环境中保护您,但请注意,您也可能获得由您拥有的不受信任仓库(例如,如果您从不受信任的来源解压 zip 文件或 tar 包)。在这种情况下,您需要先“清理”不受信任的仓库。
如果您有一个不受信任的 .git 目录,您应该先使用 git clone --no-local 克隆它以获得一个干净的副本。Git 确实限制了由 upload-pack(处理克隆或提取的服务器端)运行的选项和钩子的集合,但请注意 upload-pack 的攻击面很大,因此这确实带有一定的风险。最安全的方法是以非特权用户身份提供仓库服务(通过 git-daemon[1]、ssh,或使用其他工具更改用户 ID)。请参阅 git-upload-pack[1] 中 SECURITY 章节的讨论。
更多文档
参见“描述”部分的参考资料以开始使用 Git。对于初次使用者来说,以下内容可能比必要的细节更详细。
用户手册的 Git 概念章节 和 gitcore-tutorial[7] 都提供了对底层 Git 架构的介绍。
有关推荐工作流的概述,请参见 gitworkflows[7]。
另见 howto 文档,其中包含一些有用的示例。
内部原理记录在 Git API 文档 中。
从 CVS 迁移的用户可能还想阅读 gitcvs-migration[7]。
作者
Git 由 Linus Torvalds 发起,目前由 Junio C Hamano 维护。Git 邮件列表 <git@vger.kernel.org> 提供了大量贡献。https://openhub.net/p/git/contributors/summary 给出了更完整的贡献者列表。
如果您拥有 git.git 本身的克隆,git-shortlog[1] 和 git-blame[1] 的输出可以显示项目特定部分的作者。
报告漏洞
请向主要进行开发和维护工作的 Git 邮件列表 <git@vger.kernel.org> 报告漏洞。您不必订阅该列表即可发送邮件。有关之前的漏洞报告和其他讨论,请参见列表存档:https://lore.kernel.org/git。
与安全相关的问题应私下披露给 Git 安全邮件列表 <git-security@googlegroups.com>。