简体中文 ▾ Topics ▾ Latest version ▾ git-show last updated in 2.49.0

名称

git-show - 显示各种类型的对象

概述

git show [<选项>] [<对象>…​]

描述

显示一个或多个对象(Blobs、树、标签和提交)。

对于提交,它显示日志信息和文本差异。并会以一种特殊的格式显示合并提交,就像 git diff-tree --cc 所产生的信息那样。

对于标签,它显示标签信息和引用的对象。

对于目录树,它显示名字(相当于 git ls-tree 添加了 --name-only 选项)。

对于普通二进制对象,它显示普通内容。

git log 命令理解的一些选项可以用来控制如何显示提交带来的改动。

本手册页只描述了最常用的选项。

选项

<对象>…​

要显示的对象的名称(默认为’HEAD')。 更完整的对象名称拼写方式列表,请参见 gitrevisions[7] 中的 "特别修订" 部分。

--pretty[=<格式>]
--format=<格式>

以指定的格式打印提交日志的内容,其中'<format>'可以是’oneline'、shortmediumfullfullerreferenceemailrawformat:<string>'和’tformat:<string>'之一。 当<format>'不是上述任何一种,并且其中有'%placeholder’时,它的作用就像给出'--pretty=tformat:<format>'一样。

参见 "PRETTY FORMATS "部分,了解每种格式的一些额外细节。 当'=<格式>'部分被省略时,它默认为’中等'。

注意:你可以在版本库配置中指定默认的漂亮格式(见git-config[1])。

--abbrev-commit

不要显示完整的40字节的十六进制提交对象名称,而是显示一个前缀,以唯一的方式命名该对象。 "--abbrev=<n>"选项可以用来指定前缀的最小长度(如果显示的话,它也会修改diff输出)。

这应该使"--pretty=oneline "对于使用80列终端的人来说更容易阅读。

--no-abbrev-commit

显示完整的40字节十六进制的提交对象名称。这否定了`--abbrev-commit`,无论是明确的还是由其他选项如"--oneline "暗示的。它还覆盖了`log.abbrevCommit`变量。

--oneline

这是"--pretty=oneline --abbrev-commit "的简写,一起使用。

--encoding=<编码>

提交对象会在其编码头中记录日志信息使用的字符编码;该选项可用于告诉命令以用户偏好的编码重新编码提交日志信息。 对于非底层命令,默认编码为 UTF-8。需要注意的是,如果对象声称以 X 编码,而我们以 X 输出,我们将逐字输出该对象;这意味着原始提交中的无效序列可能会被复制到输出中。同样,如果 iconv(3) 无法转换提交,我们也会静静地逐字输出原始对象。

--expand-tabs=<n>
--expand-tabs
--no-expand-tabs

在输出中显示之前,在日志信息中进行标签扩展(用足够的空格替换每个标签,以填充到下一个显示列的 <n> 的倍数)。 --expand-tabs--expand-tabs=8 的简写,--no-expand-tabs--expand-tabs=0 的简写,它禁止标签扩展。

默认情况下,标签会以漂亮的格式展开,将日志信息缩进4个空格(即 "中",这是默认的,"全",和 "更全")。

--notes[=<引用>]

在显示提交日志信息时,显示注释提交的说明(见git-notes[1])。 这是`git log`、git show`和`git whatchanged`命令的默认设置,当命令行中没有给出--pretty`、--format`或--oneline`选项时。

默认情况下,显示的注释来自于`core.notesRef`和`notes.displayRef`变量(或相应的环境覆盖)中列出的注释参考。更多细节见git-config[1]

有了一个可选的 <引用> 参数,就可以使用引用来寻找要显示的笔记。 当引用以 refs/notes/ 开头时,可以指定完整的引用名称;当它以 notes/ 开头时, refs/ ,否则 refs/notes/ 前缀,形成引用的全名。

多个—​音符选项可以组合起来,控制哪些音符被显示。例如。"--notes=foo "将只显示来自 "refs/notes/foo "的注释;"--notes=foo --notes "将同时显示来自 "refs/notes/foo "和默认注释的注释。

--no-notes

不显示注释。这否定了上面的`--notes`选项,因为它重新设置了显示注释的注释列表。 选项按照命令行给出的顺序进行解析,因此,例如"--notes --notes=foo --no-notes --notes=bar "将只显示来自 "refs/notes/bar "的注释。

--show-notes-by-default

显示默认备注,除非给出了显示特定备注的选项。

--show-notes[=<引用>]
--[no-]standard-notes

这些选项已被废弃。请使用上面的 --notes/--no-notes 选项来代替。

--show-signature

通过将签名传递给 gpg --verify 来检查已签名的提交对象的有效性,并显示输出。

漂亮的格式

如果提交是一个合并,并且如果pretty-format不是 "oneline"、"email "或 "raw",那么在 "Author: "一行之前会插入一个附加行。 这一行的开头是 "Merge:这一行以 "Merge: "开头,并打印出祖先提交的哈希值,用空格分隔。 请注意,如果你限制了你的历史视图,那么列出的提交不一定是*直接*父级提交的列表:例如,如果你只对与某个目录或文件有关的修改感兴趣。

有几种内置的格式,你可以通过将 pretty.<名称> 配置选项设置为另一种格式名称或 format: 字符串来定义额外的格式,如下所述(见 git-config[1] )。下面是内置格式的细节:

  • oneline

    <哈希值> <标题行>

    这个设计是为了尽可能的紧凑。

  • short

    承诺<hash>
    作者。<作者>的情况
    <标题行>
  • medium

    commit <哈希值>
    Author: <作者>
    Date:   <提交日期>
    <标题行>
    <完整的提交信息
  • full

    承诺<hash>
    作者。< Author>
    承诺。<committer>(提交者)。
    <标题行>
    <完整的提交信息
  • fuller

    commit <哈希值>
    Author:     <作者>
    AuthorDate: <作者提交日期>
    Commit:     <提交者>
    CommitDate: <提交者提交日期>
    <标题行>
    <完整的提交信息
  • ‘引用’

    <缩写哈希值>(<标题行>,<简短的作者日期>)

    这种格式用于在提交信息中引用另一个提交,与`--pretty='format:%C(auto)%h (%s, %ad)'相同。 默认情况下,日期的格式为`--date=short`,除非明确指定其他`--date`选项。 与任何带有格式占位符的`format:一样,其输出不受其他选项的影响,如--decorate`和`--walk-reflogs`。

  • email

    From <哈希> <日期>
    From: <作者>
    Date: <作者提交日期>
    Subject: [PATCH] <标题行>
    <完整的提交信息
  • mboxrd

    和 "email "一样,但提交信息中以 "From "开头的行(前面有零个或多个">")用">"引出,这样就不会被混淆为开始了一个新的提交。

  • raw

    原始 "格式显示的是整个提交对象中存储的内容。 值得注意的是,无论是否使用了 --abbrev 或 --no-abbrev,哈希值都会被完整地显示出来,而’parent’信息会显示真正的父级提交,不会考虑移花接木或历史简化。注意,这种格式会影响提交的显示方式,但不会影响diff的显示方式,比如用`git log --raw`来显示。要获得原始差异格式的完整对象名称,请使用`--no-abbrev`。

  • format:<格式字符串>

    format:<格式字符串 格式允许你指定要显示的信息。它的工作原理有点像 printf 格式,但有一个明显的例外,那就是换行符是 %n 而不是 \n

    例如,format: "The author of %h was %an, %ar%nThe title was >>%s<<%n" 会显示这样的内容:

    fe6e0ee的作者是Junio C Hamano, 23小时前
    标题是 >>t4119: 测试传统diff输入的自动计算-p<n>。

    占位符是:

    • 占位符,可扩展为一个字面字符:

      %n

      换行

      %%

      一个原始的'%'

      %x00

      %x 后跟两个十六进制数字,会被一个包含十六进制数字值的字节替换(在本文档的其余部分,我们称之为 “字面格式化代码”)。

    • 影响后面占位符的格式化的占位符:

      %Cred

      切换颜色为红色

      %Cgreen

      切换颜色为绿色

      %Cblue

      将颜色改为蓝色

      %Creset

      重置颜色

      %C(…​)

      颜色规范,如git-config[1]的 "配置文件 "部分中的数值描述。 默认情况下,只有在启用日志输出时才会显示颜色(通过 color.diff, color.ui, 或 --color, 如果我们要去终端,要尊重前者的`auto`设置)。%C(auto,...)`被接受为默认的历史同义词(例如,%C(auto,red))。指定%C(always,…​)将显示颜色,即使没有启用颜色(尽管考虑使用--color=always`来启用整个输出的颜色,包括这个格式和其他任何git可能的颜色)。 auto`单独使用(即%C(auto)`)将在下一个占位符上开启自动着色,直到再次切换颜色。

      %m

      左(<)、右(>)或边界(-)标记

      %w([<w>[,<i1>[,<i2>]]])

      开关包行,就像 git-shortlog[1] 的 -w 选项。

      %<(<N>[,trunc|ltrunc|mtrunc])

      使下一个占位符至少占用 N 列宽,必要时在右侧填充空格。 如果输出超过 N 列,可选择在左侧(ltrunc)..ft、中间(mtrunc)mi..le 或末尾(trunc)rig.. 截断(用省略号 .. )。 注意 1:截断只在 N >= 2 时有效。 注 2:N 和 M(见下文)值周围的空格为可选项。 注 3:表情符号和其他宽字符将占用两个显示列,可能会超出列边界。 注 4:分解字符组合标记可能会在填充边界处错位。

      %<|(<M>)

      使下一个占位符至少显示到第 M 列,必要时在右侧填充空格。 从终端窗口右侧边缘测量的列位置使用负 M 值。

      %>(<N>), %>|(<M>)

      分别类似于 %<( <N> )%<|( <M> ),但在左侧填充空格

      %>>(<N>), %>>|(<M>)

      分别类似于'%>(<N>)%>|(<M>)',只是如果下一个占位符占用的空间比给定的多,并且其左侧有空格,则使用这些空格

      %><(<N>), %><|(<M>)

      分别类似于'%<( <N> )' 和 %<|( <M> ),但两边都有填充(即文本居中)

    • 占位符,扩展到从提交中提取的信息:

      %H

      提交的哈希值

      %h

      简称提交哈希

      %T

      目录树哈希值

      %t

      简称树形哈希

      %P

      父类哈希值

      %p

      缩写的父母哈希值

      %an

      作者名

      %aN

      作者名(关于 .mailmap,请参见 git-shortlog[1]git-blame[1]

      %ae

      作者电子邮箱

      %aE

      作者电子邮件(关于 .mailmap,请参见 git-shortlog[1]git-blame[1]

      %al

      作者电子邮件的本地部分(@ 符号之前的部分)

      %aL

      尊重 .mailmap 作者的本地部分(参见 %al ),参见 git-shortlog[1]git-blame[1])

      %ad

      作者日期(格式尊重—​date=选项

      %aD

      作者日期,RFC2822风格

      %ar

      作者日期,相对

      %at

      作者日期,UNIX时间戳

      %ai

      作者日期,类似ISO 8601的格式

      %aI

      作者日期,严格的ISO 8601格式

      %as

      作者日期,短格式( YYYY-MM-DD

      %ah

      作者日期,以易读形式呈现(就像 git-rev-list[1]--date=human 选项)

      %cn

      提交者名称

      %cN

      提交者名称(尊重 .mailmap,参见 git-shortlog[1]git-blame[1]

      %ce

      提交者电子邮箱

      %cE

      提交者电子邮箱(尊重 .mailmap,参见 git-shortlog[1]git-blame[1]

      %cl

      提交者电子邮件的本地部分(@ 符号之前的部分)

      %cL

      提交者本地部分(参见'%cl' )尊重 .mailmap, 参见 git-shortlog[1]git-blame[1])

      %cd

      承诺人日期(格式尊重—​date=选项

      %cD

      承诺人日期,RFC2822风格

      %cr

      承诺人日期,相对

      %ct

      提交者日期,UNIX时间戳

      %ci

      承诺人日期,类似ISO 8601的格式

      %cI

      承诺人日期,严格的ISO 8601格式

      %cs

      承诺人日期,短格式( YYYY-MM-DD

      %ch

      提交者的日期,人类风格(就像 git-rev-list[1]--date=human 选项)

      %d

      ref名称,就像git-log[1]的—​decorate选项。

      %D

      没有"("、")"包装的参考文献名称。

      %(decorate[:<选项>])

      自定义装饰的引用名称。decorate 字符串后面可以是冒号和零个或多个以逗号分隔的选项。选项值可能包含字面格式化代码。由于逗号(%x2C)和结尾括号(%x29)在选项语法中的作用,因此必须使用这些代码。

      • prefix=<值>: 显示在引用名称列表之前。 默认为 " ("。

      • suffix=<值>: 显示在引用名称列表之后。 默认为 ")"。

      • separator=<值>: 显示在引用名称之间。 默认为 ", "。

      • point=<值>: 显示在 HEAD 和其指向的分支(如果有)之间。 默认为 " -> "。

      • tag=<值>: 显示在标记名称之前。默认为 "tag: "。

    例如,制作不带包装或标签注释的装饰,并用空格作为分隔符:

    + %(decorate:prefix=,suffix=,tag=,separator= )

    %(describe[:<选项>])

    人类可读的名字,像git-describe[1];空字符串表示不可描述的提交。 `describe`字符串后面可以有冒号和零个或多个逗号分隔的选项。 当标签同时被添加或删除时,描述可能不一致。

    • tags[=<bool-value>]:不仅考虑带注释的标签,还考虑轻量级标签。

    • abbrev=<数量>:不使用缩写对象名称的默认十六进制位数(根据仓库中对象的数量而变化,默认为 7 位),而是使用 <数量> 的位数,或根据需要的位数来组成唯一的对象名称。

    • match=<pattern>:只考虑与给定的`glob(7)`模式匹配的标签,不包括 "refs/tags/"前缀。

    • exclude=<pattern>:不考虑匹配给定`glob(7)`模式的标签,排除 "refs/tags/"前缀。

    %S

    在命令行中给出的提交名称(如 git log --source),只对 git log 起作用

    %e

    编码方式

    %s

    主题

    %f

    经过消毒的主题行,适合于文件名

    %b

    正文

    %B

    原始体(未包装的主题和体)

    %N

    承诺说明

    %GG

    来自GPG的签名提交的原始验证信息

    %G?

    显示 "G" 代表一个好的(有效的)签名,"B" 代表一个坏的签名,"U" 代表一个有效性未知的好的签名,"X" 代表一个已经过期的好的签名,"Y" 代表一个由过期的钥匙制作的好的签名,"R" 代表一个由撤销的 钥匙制作的好的签名,"E" 如果不能检查签名(如缺少钥匙),"N" 代表没有签名

    %GS

    显示已签名的提交的签名者的名字

    %GK

    显示用于签署已签名的承诺的密钥

    %GF

    显示用于签署已签名提交文件的密钥的指纹

    %GP

    显示主键的指纹,该主键的子键被用来签署一个已签署的提交

    %GT

    显示用于签署已签名的承诺的密钥的信任级别

    %gD

    reflog选择器,例如,refs/stash@{1}`或`refs/stash@{2分钟前};其格式遵循`-g`选项的规则。@'前面的部分是命令行上给出的参考文献名称(所以`git log -g refs/heads/master`会产生`refs/heads/master@{0})。

    %gd

    简化的 reflog 选择器;与 %gD 相同,但 refname 部分被缩短以利于人类阅读(因此 refs/heads/master 变成了 master)。

    %gn

    记录身份名称

    %gN

    引用日志身份名称(尊重 .mailmap,参见 git-shortlog[1]git-blame[1]

    %ge

    重新记录身份邮件

    %gE

    引用日志身份电子邮箱(尊重 .mailmap,参见 git-shortlog[1]git-blame[1]

    %gs

    记录主题

    %(trailers[:<选项>])

    显示由 git-interpret-trailers[1] 解释的正文的为主。trailers 字符串后面可以有冒号和零个或多个逗号分隔的选项。 如果任何选项被多次提供,则最后出现的选项获胜。

    • key=<键>:只显示具有指定密钥的为主。匹配是不分大小写的,后面的冒号是可选的。如果多次给出选项,则显示与任何键匹配的为主行。该选项自动启用 only 选项,使拖车块中的非尾注行被隐藏。如果不希望这样,可以用 only=false 禁用。 例如,%(trailers:key=Reviewed-by) 显示键为 Reviewed-by 的拖车行。

    • only[=<布尔值>] :选择是否应该包括来自尾注块的非尾注行。

    • separator=<sep>: specify the separator inserted between trailer lines. Defaults to a line feed character. The string <sep> may contain the literal formatting codes described above. To use comma as separator one must use %x2C as it would otherwise be parsed as next option. E.g., %(trailers:key=Ticket,separator=%x2C ) shows all trailer lines whose key is "Ticket" separated by a comma and a space.

    • unfold[=<布尔值>]:使它的行为就像 interpret-trailer 的 --unfold 选项被给出一样。例如,`%(trailers:only,unfold=true)`会展开并显示所有的尾注行。

    • keyonly[=<布尔值>]:只显示尾注的关键部分。

    • valueonly[=<布尔值>]:只显示尾注的值部分。

    • key_value_separator=<sep>: specify the separator inserted between the key and value of each trailer. Defaults to ": ". Otherwise it shares the same semantics as separator=<sep> above.

Note
一些占位符可能取决于给修订版遍历引擎的其他选项。例如,%g* reflog选项将插入一个空字符串,除非我们正在遍历reflog条目(例如,通过`git log -g`)。%d`和%D`占位符将使用 "短 "装饰格式,如果`--decorate`没有在命令行上提供。

The boolean options accept an optional value [=<bool-value>]. The values taken by --type=bool git-config[1], like yes and off, are all accepted. Giving a boolean option without =<value> is equivalent to giving it with =true.

如果你在占位符的'%后面加了一个`+(加号),当且仅当占位符扩展为一个非空字符串时,在扩展前会立即插入换行符。

如果你在占位符的'%后面加了一个`-(减号),如果且仅当占位符扩展为空字符串时,紧接着扩展前的所有连续换行将被删除。

如果你在占位符的'%'后面加了一个``(空格),当且仅当占位符扩展到一个非空字符串时,空格就会紧接着插入扩展。

  • t格式:

    tformat: 格式的工作原理与 format: 完全一样,只是它提供了 “终止符” 语义,而不是 “分隔符” 语义。换句话说,每个提交都附加了信息结束符(通常是换行符),而不是在条目之间放置一个分隔符。 这意味着单行格式的最后一个条目将正确地以新行结束,就像 “单行” 格式那样。 比如说:

    $ git log -2 --pretty=format:%h 4da45bef \
      | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    4da45be
    7134973 -- NO NEWLINE
    
    $ git log -2 --pretty=tformat:%h 4da45bef \
      | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    4da45be
    7134973

    此外,任何未被识别的字符串,如果其中有 % ,将被解释为前面有 tformat: 。 例如,这两个是等同的:

    $ git log -2 --pretty=tformat:%h 4da45bef
    $ git log -2 --pretty=%h 4da45bef

差异格式化

下面的选项可以用来改变`git show`生成差异输出的方式。

Warning

Missing zh_HANS-CN/diff-options.adoc

See original version for this content.

使用选项 -p 生成补丁文本

使用 -p 选项运行 git-diff[1]git-log[1]git-show[1]git-diff-index[1]git-diff-tree[1]git-diff-files[1] 会生成补丁文本。 你可以通过 GIT_EXTERNAL_DIFFGIT_DIFF_OPTS 环境变量(参见 git[1]),以及 diff 属性(参见 gitattributes[5])自定义补丁文本的创建。

What the -p option produces is slightly different from the traditional diff format:

  1. 它前面有一个 git diff 头,如下所示:

    diff --git a/file1 b/file2

    a/b/ 的文件名相同,除非涉及到重命名/复制。特别地,即使是创建或删除,也 使用 /dev/null 来代替 a/b/ 文件名。

    当涉及重命名/复制时,file1file2 分别显示重命名/复制的源文件名和重命名/复制产生的文件名。

  2. 它的后面是一个或多个扩展头信息行:

    old mode <mode> new mode <mode> deleted file mode <mode> new file mode <mode> copy from <path> copy to <path> rename from <path> rename to <path> similarity index <number> dissimilarity index <number> index <hash>..<hash> <mode>

    File modes <mode> are printed as 6-digit octal numbers including the file type and file permission bits.

    扩展头信息中的路径名称不包括 a/b/ 前缀。

    相似性指数是未改变的行占比,而不相似性指数是改变的行占比。它是四舍五入的整数,后有百分号。因此,100%的相似度指数指为两个文件相等,而 100% 的不相似度意味着入新文件中没有旧文件中的行。

    The index line includes the blob object names before and after the change. The <mode> is included if the file mode does not change; otherwise, separate lines indicate the old and the new mode.

  3. 含有 "不常见" 字符的路径名会被引用,这一点在配置变量` core.quotePath` 中有所解释(见 git-config[1])。

  4. 输出中所有的 file1 文件都是指提交前的文件,而所有的 file2 文件都是指提交后的文件。按顺序对每个文件进行修改是不正确的。例如,这个补丁将交换文件 a 和 b:

    diff --git a/a b/b
    rename from a
    rename to b
    diff --git a/b b/a
    rename from b
    rename to a
  5. 块头提到了块头所适用的函数的名称。 参见 gitattributes[5] 中的 “定义自定义 hunk-header”,以了解如何针对特定语言进行定制。

合并的差异格式

任何生成差异的命令都可以使用 -c--cc 选项,在显示合并时产生一个 “合并差异”。当用 git-diff[1]git-show[1] 显示合并时,这默认格式。还需要注意的是,你可以给这些命令适当的 --diff-merges 选项来强制生成特定格式的差异。

"合并的差异" 的格式如下:

diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
	return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
  }

- static void describe(char *arg)
 -static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
  {
 +	unsigned char sha1[20];
 +	struct commit *cmit;
	struct commit_list *list;
	static int initialized = 0;
	struct commit_name *n;

 +	if (get_sha1(arg, sha1) < 0)
 +		usage(describe_usage);
 +	cmit = lookup_commit_reference(sha1);
 +	if (!cmit)
 +		usage(describe_usage);
 +
	if (!initialized) {
		initialized = 1;
		for_each_ref(get_name);
  1. 它前面有 "git diff" 头,如下(当使用 -c 选项时):

    diff --combined file

    或如下(当使用 --cc 选项时):

    diff --cc file
  2. 它的后面是一个或多个扩展头信息行(本例显示的是与两个父提交的合并):

    index <hash>,<hash>..<hash> mode <mode>,<mode>..<mode> new file mode <mode> deleted file mode <mode>,<mode>

    The mode <mode>,<mode>..<mode> line appears only if at least one of the <mode> is different from the rest. Extended headers with information about detected content movement (renames and copying detection) are designed to work with the diff of two <tree-ish> and are not used by combined diff format.

  3. 它的后面是两行源文件/目标文件的头信息:

    --- a/file
    +++ b/file

    与传统 ‘统一’ diff 格式的双行标题类似,/dev/null 用于表示已创建或已删除的文件。

    但是,如果提供了 --combined-all-paths 选项,你就会得到一个 N+1 行的源文件/目标文件头,其中 N 是合并提交中的父提交数量:

    --- a/file
    --- a/file
    --- a/file
    +++ b/file

    如果重命名或复制检测处于活动状态,这种扩展格式可能很有用,可以让你在不同的父提交中看到文件的原始名称。

  4. 修改了文件块头信息的格式,以防止不小心将其送入 patch -p1。合并的差异格式是为审查合并提交的修改而创建的,并不是为了应用。这个变化类似于扩展的 "索引" 头信息的变化:

    @@@ <from-file-range> <from-file-range> <to-file-range> @@@

    块中有(父提交数量+1)@ 字符,用于合并的差异格式。

与传统的 "统一" 差异格式不同,这种格式显示两个文件 A 和 B 的列,其中有 -(减号 — 在 A 中出现,但在 B 中删除),+(加号 — 在 A 中缺少,但在 B 中增加),或 " "(空格 — 不变)前缀,这种格式比较两个或多个文件与一个文件 X,并显示 X 与其中每个文件的差异。文件中的每一个都有一列被前置在输出行中,以指出 X 的行与它的不同之处。

第 N 列中的 - 字符意味着该行出现在文件 N 中,但它没有出现在结果文件中。第 N 列中的 + 字符意味着该行出现在结果文件中,而文件 N 中没有该行(换句话说,从该父提交的角度来看,该行是被添加的)。

在上面的输出示例中,两个文件中的函数签名都被改变了(因此从文件 1 和文件 2 中都有表示删除的 -,而 ++ 表示被添加的一行没有出现在文件 1 或文件 2 中)。另外还有 8 行与文件 1 中的相同,但没有出现在文件 2 中(因此前缀为 +)。

当用 git diff-tree -c 显示时,它将合并提交的父提交文件与合并结果进行比较(即文件 1 …​ 文件 N 是父提交文件)。当用 git diff-files -c 显示时,它将两个未解决的合并父提交文件与工作树文件进行比较(即文件 1 是阶段 2 ,又称 "我们的版本",文件 2 是阶段 3,又称 "他们的版本")。

实例

git show v1.0.0

显示标签 v1.0.0,以及标签指向的对象。

git show v1.0.0^{tree}

显示标签`v1.0.0`所指向的树。

git show -s --format=%s v1.0.0^{commit}

显示由标签`v1.0.0`指向的提交的主题。

git show next~10:Documentation/README

显示`Documentation/README`文件的内容,因为它们在分支`next`的最后10次提交中是当前的。

git show master:Makefile master:t/Makefile

将上述Makefiles的内容串联在分支`master`的头部。

讨论

Git在某种程度上是与字符编码无关的。

  • blob对象的内容是未经解释的字节序列。 在核心层没有编码转换。

  • 路径名以UTF-8规范化形式C编码,这适用于树对象、索引文件、参考名称,以及命令行参数、环境变量和配置文件(.git/config(见git-config[1]),gitignore[5]gitattributes[5]gitmodules[5])中的路径名。

    请注意,Git 在核心层将路径名简单地视为非 NUL 字节的序列,没有路径名编码的转换(除了 Mac 和 Windows)。因此,即使在使用传统的扩展ASCII编码的平台和文件系统上,使用非ASCII的路径名大多也能工作。然而,在这种系统上创建的仓库在基于UTF-8的系统(如Linux、Mac、Windows)上将无法正常工作,反之亦然。 此外,许多基于Git的工具简单地认为路径名称是UTF-8,而不能正确显示其他编码。

  • 提交日志信息通常以UTF-8编码,但也支持其他扩展ASCII编码。这包括ISO-8859-x、CP125x和其他许多编码,但不包括UTF-16/32、EBCDIC和CJK多字节编码(GBK、Shift-JIS、Big5、EUC-x、CP9xx等)。

尽管我们鼓励提交日志信息使用UTF-8编码,但核心系统和Git Porcelain的设计并不强制要求项目使用UTF-8。 如果某个项目的所有参与者都认为使用传统编码更方便,Git也不会禁止。 然而,有几件事需要注意。

  1. git commit and git commit-tree issue a warning if the commit log message given to it does not look like a valid UTF-8 string, unless you explicitly say your project uses a legacy encoding. The way to say this is to have i18n.commitEncoding in .git/config file, like this:

    [i18n]
    	commitEncoding = ISO-8859-1

    用上述设置创建的提交对象在它的 encoding 头中记录了 i18n.commitEncoding 的值。 这是为了帮助以后看这些对象的人。 缺少这个头意味着提交日志信息是以 UTF-8 编码的。

  2. git log, git show, git blame and friends look at the encoding header of a commit object, and try to re-code the log message into UTF-8 unless otherwise specified. You can specify the desired output encoding with i18n.logOutputEncoding in .git/config file, like this:

    [i18n]
    	logOutputEncoding = ISO-8859-1

    如果你没有这个配置变量,则使用`i18n.commitEncoding`的值来代替。

请注意,我们特意选择在提交对象层面上,不对提交日志信息进行重新编码,因为重新编码为UTF-8不一定是一个可逆的操作。

GIT

属于 git[1] 文档

scroll-to-top