## Name

git - 迟钝的内容跟踪器

## 概要

    git [--version] [--help] [-C <path>] [-c <name>=<value>]    [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]    [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]    [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]    [--super-prefix=<path>]    <command> [<args>]

## 描述

Git 是一个快速，可扩展的分布式修订控制系统，具有异常丰富的命令集，可提供高级操作和对内部的全面访问。

请参阅 gittutorial [7] 开始，然后参阅 giteveryday [7] 以获取有用的最小命令集。Git 用户手册有更深入的介绍。

掌握了基本概念之后，您可以回到此页面来了解 Git 提供的命令。你可以通过“git help command”了解更多关于单个 Git 命令的信息。gitcli [7]手册页为您提供了命令行命令语法的概述。

格式化和超链接的最新 Git 文档可以在这里查看`https://git.github.io/htmldocs/git.html`。

## 选项

--version

打印该`git`程序来自的 Git 套件版本。

--help

打印大纲和最常用命令的列表。如果选择`--all`或`-a`给出，则打印所有可用的命令。如果一个 Git 命令被命名了，这个选项将会弹出该命令的手册页。

其他选项可用于控制手册页的显示方式。请参阅 git-help [1] 以获取更多信息，因为它们`git --help ...`被内部转换为`git help ...`。

-C <path>

运行就好像 git 是在`<path>`当前工作目录中开始的。当`-C`给出多个选项时，每个随后的非绝对`-C <path>`都相对于前面的解释`-C <path>`。

此选项会影响预期的路径名的选项一样`--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`（以小圆点分隔的子键）。

请注意，忽略`=`in `git -c foo.bar ...`是允许的，并设置`foo.bar`为布尔值 true（就像`[foo]bar`在配置文件中那样）。包括等号但有一个空值（如`git -c foo.bar= ...`）设置`foo.bar`为`git config --bool`将转换为空字符串`false`。

--exec-path=<path>

安装核心 Git 程序的路径。这也可以通过设置 GIT_EXEC_PATH 环境变量来控制。如果没有给出路径，`git`将打印当前设置，然后退出。

--html-path

打印路径，不加斜杠，其中安装了 Git 的 HTML 文档并退出。

--man-path

打印`man(1)`此版本 Git 手册页的 manpath（请参阅参考资料）并退出。

--info-path

打印记录此版本 Git 的 Info 文件的安装路径并退出。

-p --paginate

`less`如果标准输出是终端，则将所有输出管道（或者如果设置，则为 $ PAGER ）。这会覆盖`pager.<cmd>`配置选项（请参阅下面的“配置机制”部分）。

--no-pager

不要将 Git 输出传送到寻呼机。

--git-dir=<path>

设置存储库的路径。这也可以通过设置`GIT_DIR`环境变量来控制。它可以是当前工作目录的绝对路径或相对路径。

--work-tree=<path>

设置工作树的路径。它可以是相对于当前工作目录的绝对路径或路径。这也可以通过设置 GIT_WORK_TREE 环境变量和 core.worktree 配置变量来控制（有关更详细的讨论，请参阅 git-config [1] 中的 core.worktree ）。

--namespace=<path>

设置 Git 名称空间。有关更多详细信息，请参阅 gitnamespaces [7] 。相当于设置`GIT_NAMESPACE`环境变量。

--super-prefix=<path>

目前仅供内部使用。设置一个前缀，它提供从存储库上方到其根目录的路径。一个用途是给出调用它的超级项目的子模块上下文。

--bare

将存储库视为裸存储库。如果未设置 GIT_DIR 环境，则将其设置为当前工作目录。

--no-replace-objects

不要使用替换参考来替换 Git 对象。有关更多信息，请参见 git-replace [1] 。

--literal-pathspecs

字面上处理 pathspecs（即没有 globbing，没有 pathspec magic）。这相当于将`GIT_LITERAL_PATHSPECS`环境变量设置为`1`。

--glob-pathspecs

将“glob”魔法添加到所有 pathspec。这相当于将`GIT_GLOB_PATHSPECS`环境变量设置为`1`。禁用单个路径规范上的 globbing 可以使用 pathspec magic “：（literal）”来完成

--noglob-pathspecs

将“文字”魔法添加到所有 pathspec。这相当于将`GIT_NOGLOB_PATHSPECS`环境变量设置为`1`。可以使用 pathspec magic“：（glob）”来启用单个 pathspecs 上的 globbing

--icase-pathspecs

将“icase”魔法添加到所有 pathspec。这相当于将`GIT_ICASE_PATHSPECS`环境变量设置为`1`。

## Git commands

我们将 Git 分为高级（“瓷器”）命令和低级别（“管道”）命令。

## High-level commands (porcelain)

我们将 porcelain 命令分成主要命令和一些辅助用户实用程序。

### 主要的 porcelain 命令

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]

在commits，commit 和 working tree 等之间显示更改

git-fetch[1]

从另一个存储库下载对象和参考

git-format-patch[1]

准备电子邮件提交 patches

git-gc[1]

清理不必要的文件并优化本地存储库

git-grep[1]

打印符合图案的线条

git-gui[1]

Git 的便携式图形界面

git-init[1]

创建一个空的 Git 存储库或重新初始化现有的存储库

gitk[1]

Git 存储库浏览器

git-log[1]

显示提交日志

git-merge[1]

集合两个或更多发展历史

git-mv[1]

移动或重命名文件，目录或符号链接

git-notes[1]

添加或检查对象注释

git-pull[1]

从另一个存储库或本地分支中获取并与其集成

git-push[1]

更新远程引用以及关联的对象

git-rebase[1]

重新申请在另一个基本技巧之上提交

git-reset[1]

将当前 HEAD 重置为指定状态

git-revert[1]

恢复一些现有的提交

git-rm[1]

从工作树和索引中删除文件

git-shortlog[1]

总结`git log`输出

git-show[1]

显示各种类型的对象

git-stash[1]

将变化存储在不完美的工作目录中

git-status[1]

显示工作树的状态

git-submodule[1]

初始化，更新或检查子模块

git-tag[1]

创建，列出，删除或验证使用 GPG 签名的标签对象

git-worktree[1]

管理多个工作树

### 辅助命令

机器人：

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-remote[1]

管理一组已跟踪的存储库

git-repack[1]

将解包的对象打包到存储库中

git-replace[1]

创建，列出，删除参考替换对象

读写器：

git-annotate[1]

用提交信息注释文件行

git-blame[1]

显示修订版本和作者上次修改文件的每一行

git-cherry[1]

查找尚未应用于上游的提交

git-count-objects[1]

计算未包装的对象数量及其磁盘消耗量

git-difftool[1]

使用常见差异工具显示更改

git-fsck[1]

验证数据库中对象的连通性和有效性

git-get-tar-commit-id[1]

从使用 git-archive 创建的存档中提取提交 ID

git-help[1]

显示关于 Git 的帮助信息

git-instaweb[1]

在 gitweb 中即时浏览您的工作存储库

git-merge-tree[1]

无需触摸索引即可显示三路合并

git-rerere[1]

重复使用冲突合并的记录分辨率

git-rev-parse[1]

选取并按摩参数

git-show-branch[1]

显示分支和他们的提交

git-verify-commit[1]

检查提交的 GPG 签名

git-verify-tag[1]

检查标签的GPG签名

gitweb[1]

Git Web 界面（Git 仓库的前端）

git-whatchanged[1]

显示每个提交引入的差异日志

### 与他人互动

这些命令将通过电子邮件补丁与外国 SCM 和其他人进行交互。

git-archimport[1]

将 Arch 存储库导入到 Git 中

git-cvsexportcommit[1]

将单个提交导出到 CVS 签出

git-cvsimport[1]

将您的数据从另一个人们常常不喜欢的 SCM 中拯救出来

git-cvsserver[1]

Git 的 CVS 服务器模拟器

git-imap-send[1]

从 stdin 将一组补丁发送到 IMAP 文件夹

git-p4[1]

从 Perforce 存储库导入和提交

git-quiltimport[1]

将一个被套补丁集应用到当前分支上

git-request-pull[1]

生成待定更改的摘要

git-send-email[1]

以电子邮件的形式发送一组修补程序

git-svn[1]

Subversion 版本库和 Git 之间的双向操作

## 低级命令（管道）

虽然 Git 包含自己的瓷器层，但其低级命令足以支持替代瓷器的开发。这些 porcelains 的开发人员可能从阅读 git-update-index [1] 和 git-read-tree [1] 开始。

这些低级命令的接口（输入，输出，选项集和语义）比 Porcelain 级命令要稳定得多，因为这些命令主要用于脚本使用。另一方面，Porcelain 命令的界面可能会发生变化，以改善最终用户体验。

以下描述将低级命令划分为操纵对象（在存储库，索引和工作树中），查询和比较对象的命令以及在存储库之间移动对象和引用的命令。

### 操作命令

git-apply[1]

将修补程序应用于文件和／或索引

git-checkout-index[1]

将索引中的文件复制到工作树中

git-commit-tree[1]

创建一个新的提交对象

git-hash-object[1]

计算对象 ID 并可选择从文件创建一个 blob

git-index-pack[1]

为现有打包归档生成包索引文件

git-merge-file[1]

运行三路文件合并

git-merge-index[1]

为需要合并的文件运行合并

git-mktag[1]

创建一个标签对象

git-mktree[1]

从 ls-tree 格式的文本构建一个树对象

git-pack-objects[1]

创建对象的打包存档

git-prune-packed[1]

删除已经在包文件中的额外对象

git-read-tree[1]

将树信息读入索引

git-symbolic-ref[1]

阅读，修改和删除符号参考

git-unpack-objects[1]

从打包的压缩文件中解压缩对象

git-update-index[1]

将工作树中的文件内容注册到索引

git-update-ref[1]

安全地更新存储在 ref 中的对象名称

git-write-tree[1]

从当前索引创建一个树对象

### 询问命令

git-cat-file[1]

为存储库对象提供内容或类型和大小信息

git-diff-files[1]

比较工作树中的文件和索引

git-diff-index[1]

将树与工作树或索引进行比较

git-diff-tree[1]

比较通过两个树对象找到的斑点的内容和模式

git-for-each-ref[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-rev-list[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-parse-remote[1]

帮助解析远程存储库访问参数的例程

git-receive-pack[1]

接收推入存储库的内容

git-shell[1]

仅 Git-only 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-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 使用简单的文本格式来存储每个存储库和每个用户的定制。这样的配置文件可能如下所示：

    #

    # 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> 对象进行操作，但是会自动将 <commit> 和 <tag> 对象的 dereference 指向 <tree> 。

<commit-ish>

指示提交或标记对象名称。采用 <commit-ish> 参数的命令最终希望对 <commit> 对象进行操作，但是会自动对指向 <commit> 的 <tag> 对象取消引用。

<type>

表示需要一个对象类型。目前的一个：`blob`，`tree`，`commit`，或`tag`。

<file>

指示文件名 - 几乎总是相对于树结构的根`GIT_INDEX_FILE`描述。

## 符号标识符

任何接受任何 <object> 的 Git 命令都可以使用以下符号表示法：

HEAD

表示当前分支的 head 。

<tag>

一个有效的标签`name`（即`refs/tags/<tag>`参考）。

<head>

一个有效的 head `name`（即`refs/heads/<head>`参考）。

有关拼写对象名称的更完整列表，请参阅 gitrevisions [7] 中的“指定修订”部分。

## 文件/目录结构

请参阅 gitrepository-layout [5] 文档。

阅读 githooks [5] 了解每个 hook 的更多细节。

更高层次的 SCM 可能会提供和管理附加信息`$GIT_DIR`。

## 术语

请参阅 gitglossary [7] 。

## 环境变量

各种 Git 命令使用以下环境变量：

### Git 库

这些环境变量适用于`all`核心 Git 命令。铌：值得注意的是，他们可能会被 SCMS 使用/覆盖，因此如果使用外部前端，请注意。

`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 对象。新对象不会写入这些目录。

    Entries that begin with `"` (double-quote) will be interpretedas C-style quoted paths, removing leading and trailing

    double-quotes and respecting backslash escapes. E.g., the value`"path-with-\"-and-:-in-it":vanilla-path` has two paths:`path-with-"-and-:-in-it` and `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 提交

`GIT_AUTHOR_NAME` `GIT_AUTHOR_EMAIL` `GIT_AUTHOR_DATE` `GIT_COMMITTER_NAME` `GIT_COMMITTER_EMAIL` `GIT_COMMITTER_DATE` EMAIL

see git-commit-tree[1]

### Git Diffs

`GIT_DIFF_OPTS`

只有有效的设置是 “--unified = ??” 或 “-u ??” 设置创建统一差异时显示的上下文行数。这优先于在 Git diff 命令行上传递的任何 “-U” 或 “--unified” 选项值。

`GIT_EXTERNAL_DIFF`

当设置环境变量时`GIT_EXTERNAL_DIFF`，将调用由其命名的程序，而不是上述的差异调用。对于添加，删除或修改的路径，将`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-hexdigit SHA-1 散列，

<old|new>-mode

是用文件模式的八进制表示。

文件参数可以指向用户的工作文件（例如，`new-file`在 “git-diff-files” 中），`/dev/null`（例如，`old-file`当添加新文件时）或临时文件（例如`old-file`在索引中）。`GIT_EXTERNAL_DIFF`不应该担心取消临时文件的链接 - `GIT_EXTERNAL_DIFF`退出时会将其删除。

对于未合并的路径，`GIT_EXTERNAL_DIFF`使用1参数调用 <path> 。

为每个路径`GIT_EXTERNAL_DIFF`调用两个环境变量，`GIT_DIFF_PATH_COUNTER`并`GIT_DIFF_PATH_TOTAL`进行设置。

`GIT_DIFF_PATH_COUNTER`

对于每个路径，基于1的计数器都加1。

`GIT_DIFF_PATH_TOTAL`

路径的总数。

### 其他

`GIT_MERGE_VERBOSITY`

一个数字，用于控制递归合并策略所显示的输出量。重写 merge.verbosity。见 git-merge [1]

`GIT_PAGER`

这个环境变量覆盖`$PAGER`。如果它设置为空字符串或值“cat”，Git 将不会启动寻呼机。另请参阅`core.pager` git-config [1] 中的选项。

`GIT_EDITOR`

这个环境变量覆盖`$EDITOR`和`$VISUAL`。当在交互模式下，编辑器将被启动时，它被几个 Git 命令使用。另请参阅 git-var [1] 和`core.editor` git-config [1] 中的选项。

`GIT_SSH` `GIT_SSH_COMMAND`

如果这些环境变量的设置，那么`git fetch`与`git push`将使用指定的命令，而不是`ssh`当他们需要连接到远程系统。该命令将只有两个或四个参数：（`username@host`或者仅仅`host`）来自 URL 和 shell 命令，以便在远程系统上执行，可选地，前面的`-p`（字面意思）和`port` URL 指定的内容不是默认的 SSH 港口。

`$GIT_SSH_COMMAND`优先于`$GIT_SSH`，并且由 shell 解释，这允许包括额外的参数。`$GIT_SSH`另一方面必须是程序的路径（如果需要额外的参数，它可以是包装程序的外壳脚本）。

通常情况下，通过个人`.ssh/config`文件配置任何所需的选项比较容易。有关更多详细信息，请参阅您的 ssh 文档。

`GIT_SSH_VARIANT`

如果这个环境变量设置，它将覆盖 Git 的自动检测是否`GIT_SSH`/ `GIT_SSH_COMMAND`/ `core.sshCommand`参考的 OpenSSH ，plink 或 TortoisePlink。该变量覆盖了`ssh.variant`用于相同目的的配置设置。

`GIT_ASKPASS`

如果设置了此环境变量，那么需要获取密码或密码（例如，用于HTTP或IMAP身份验证）的 Git 命令将使用适当的提示作为命令行参数调用该程序，并从其 STDOUT 读取密码。另请参阅`core.askPass` git-config [1] 中的选项。

`GIT_TERMINAL_PROMPT`

如果此环境变量设置为`0`，则git不会在终端上提示（例如，请求 HTTP 身份验证时）。

`GIT_CONFIG_NOSYSTEM`

是否跳过从系统范围`$(prefix)/etc/gitconfig`文件读取设置。此环境变量可以搭配一起`$HOME`，并`$XDG_CONFIG_HOME`为挑剔的脚本来创建一个可预测的环境，也可以暂时将其设置为避免使用 buggy `/etc/gitconfig`文件，而等待有人具有足够的权限来修复它。

`GIT_FLUSH`

如果该环境变量被设置为“1”，则命令，比如`git blame`（在增量模式下），`git rev-list` ，`git log` ，`git check-attr` 和 `git check-ignore` 将迫使输出流的一个齐平的每个记录已经刷新之后。如果此变量设置为“0”，则这些命令的输出将使用完全缓冲的 I / O 完成。如果这个环境变量没有设置，Git 会根据标准输出是否被重定向到文件来选择缓冲或面向记录的刷新。

`GIT_TRACE`

启用常规跟踪消息，例如别名扩展，内置命令执行和外部命令执行。

如果此变量设置为“1”，“2”或“true”（比较不区分大小写），则跟踪消息将会被打印到 stderr。

如果变量设置为大于2且小于10的整数值（严格），那么 Git 会将此值解释为打开的文件描述符，并尝试将跟踪消息写入此文件描述符。

或者，如果变量设置为绝对路径（以`/`字符开头），Git 会将其解释为文件路径，并尝试将跟踪消息写入其中。

取消设置变量或将其设置为空，“0”或“false”（不区分大小写）将禁用跟踪消息。

`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_SETUP`

在 Git 完成设置阶段后，启用跟踪消息打印 .git ，工作树和当前工作目录。请参阅`GIT_TRACE`可用的跟踪输出选项。

`GIT_TRACE_SHALLOW`

启用可帮助调试浅存储库的提取/克隆的跟踪消息。请参阅`GIT_TRACE`可用的跟踪输出选项。

`GIT_TRACE_CURL`

启用 git 传输协议的所有传入和传出数据（包括描述性信息）的卷曲完全跟踪转储。这与`--trace-ascii`在命令行上进行卷曲相似。该选项将覆盖设置`GIT_CURL_VERBOSE`环境变量。请参阅`GIT_TRACE`可用的跟踪输出选项。

`GIT_LITERAL_PATHSPECS`

设置这个变量`1`将导致 Git 字面上处理所有的 pathspecs ，而不是作为 glob 模式。例如，运行`GIT_LITERAL_PATHSPECS=1 git log -- '*.c'`将搜索触摸该路径的提交`*.c`，而不搜索该 glob `*.c`匹配的任何路径。如果你正在向 Git 提供文字路径（例如，先前给出的路径`git ls-tree`，`--raw` diff 输出等），你可能会想要这样做。

`GIT_GLOB_PATHSPECS`

设置这个变量`1`将导致 Git 将所有的 pathspecs 视为 glob 模式（又名“glob” magic ）。

`GIT_NOGLOB_PATHSPECS`

设置这个变量`1`将导致 Git 将所有的 pathspecs 视为文字（又名 “literal” magic ）。

`GIT_ICASE_PATHSPECS`

设置这个变量`1`将使 Git 将所有的 pathspecs 视为不区分大小写。

`GIT_REFLOG_ACTION`

当 ref 被更新时，reflog 条目被创建以跟踪 ref 为什么被更新的原因（通常是更新 ref 的高级命令的名称），以及旧的和新的 ref 值。脚本 Porcelain 命令可以使用 set_reflog_action 辅助函数`git-sh-setup`将其名称设置为该变量，当它由最终用户作为顶级命令调用时，将记录在 reflog 的主体中。

`GIT_REF_PARANOIA`

如果设置为`1`，则在遍历参考列表时包含破损或严重名称的参考。在一个正常的，没有损坏的存储库中，这没有任何作用。但是，启用它可能会帮助 git 检测并中止一些操作，在出现断点的情况下。Git 在执行破坏性操作（如 git-prune [1] ）时会自动设置此变量。你不需要自己设置它，除非你想要确保一个操作触及每个参考（例如，因为你正在克隆一个存储库来进行备份）而偏执。

`GIT_ALLOW_PROTOCOL`

如果设置为以冒号分隔的协议列表，则表现得好像`protocol.allow`设置为`never`，并且列出的每个协议都已`protocol.<name>.allow`设置为`always`（覆盖任何现有配置）。换句话说，任何未提及的协议都将被禁止（即，这是白名单，而不是黑名单）。有关`protocol.allow`更多详细信息，请参阅 git-config [1] 中的说明。

`GIT_PROTOCOL_FROM_USER`

设置为0可防止配置为该`user`状态的 fetch / push / clone 使用的协议。这对于限制来自不受信任的存储库的递归子模块初始化或将可能不可信的 URL 提供给 git 命令的程序是有用的。有关更多详细信息，请参阅 git-config [1] 。

## 讨论

有关以下内容的更多详细信息，请参阅用户手册和 gitcore-tutorial [7] 的 Git 概念一章。

一个 Git 项目通常包含一个工作目录，顶层有一个 “.git” 子目录。.git 目录包含一个表示项目完整历史记录的压缩对象数据库，一个将历史链接到工作树的当前内容的 “index” 文件，以及指向该历史记录的指针，如标签和分支头。

对象数据库包含三种主要类型的对象：blob ，它保存文件数据; 指向 blob 和其他树来建立目录层次结构; 和提交，每个引用一棵树和一些父类提交。

该提交等同于其他系统称为“变更集”或“版本”的提交，代表项目历史记录中的一个步骤，每个父代代表紧接的前一个步骤。承诺与多个父母代表合并独立的发展线。

所有对象都由其内容的 SHA-1 散列命名，通常写为40个十六进制数字的字符串。这些名称是全球唯一的。通过对提交进行签名，可以确保导致提交的整个历史记录。为此提供了第四种对象类型，即标签。

首次创建时，对象存储在单个文件中，但为了提高效率，以后可以一起压缩成“包文件”。

命名为 refs 的指针标记历史中的有趣点。一个 ref 可以包含一个对象的 SHA-1 名称或另一个 ref 的名称。名称开头的引用`ref/head/`包含正在开发的分支的最近提交（或“头”）的 SHA-1 名称。下面存储感兴趣标签的 SHA-1 名称`ref/tags/`。一个名为 ref 的特殊 ref `HEAD`包含当前签出分支的名称。

索引文件使用所有路径的列表进行初始化，并且对于每个路径，都会创建一个 Blob 对象和一组属性。blob 对象代表当前分支头部的文件内容。属性（上次修改时间，大小等）取自工作树中的相应文件。通过比较这些属性可以找到对工作树的后续更改。索引可以用新内容更新，并且可以从存储在索引中的内容创建新的提交。

该索引还能够存储给定路径名的多个条目（称为“阶段”）。这些阶段用于在合并进行时保存文件的各种未合并版本。

## 更多文档

请参阅“说明”部分中的参考资料以开始使用 Git 。以下内容可能比第一次使用用户需要的更详细。

用户手册和 gitcore-tutorial [7] 中的 Git 概念章节都介绍了底层的 Git 体系结构。

有关推荐的工作流程概述，请参阅 gitworkflows [7] 。

有关有用的示例，另请参阅 howto 文档。

内部信息记录在 Git API 文档中。

从 CVS 迁移的用户也可能需要阅读 gitcvs-migration [7] 。

## 作者

Git 由 Linus Torvalds 创建，目前由 Junio C Hamano 维护。许多贡献来自 Git 邮件列表 [git@vger.kernel.org]（mailto：git@vger.kernel.org）。http://www.openhub.net/p/git/contributors/summary为您提供了更完整的贡献者名单。

如果你有一个 git.git 本身的副本，git-shortlog [1] 和 git-blame [1] 的输出可以显示作者的项目特定部分。

## 报告错误

将错误报告给开发和维护主要完成的 Git 邮件列表[git@vger.kernel.org]（mailto：git@vger.kernel.org）。您无需订阅该列表即可在该处发送消息。