Git 中文参考(四)(4)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Git 中文参考(四)

Git 中文参考(四)(3)https://developer.aliyun.com/article/1565831


假设 reflog 所提到的所有对象都在命令行中列为

--single-worktree

默认情况下,当有多个工作树时,将通过以下选项检查所有工作树(参见 git-worktree [1] ):--all--reflog--indexed-objects。此选项强制它们仅检查当前工作树。

--ignore-missing 

在输入中看到无效的对象名称时,假装没有给出错误的输入。

--bisect 

假设好像已经列出了错误的二分法refs/bisect/bad并且好像它后面跟着--not并且良好的二分法在命令行上引用了refs/bisect/good-*。不能与–first-parent 结合使用。

--stdin 

除了 _< commit>在命令行中列出 _,从标准输入中读取它们。如果看到--分隔符,请停止读取提交并开始读取路径以限制结果。

--cherry-mark 

--cherry-pick(见下文)相同,但标记等效提交与=而不是省略它们,而与+不等价。

--cherry-pick 

当提交集受限于对称差异时,省略任何引用与“另一方”上的另一个提交相同的更改的提交。

例如,如果您有两个分支,AB,通常只在一侧列出所有提交的方法是使用--left-right(请参阅下面--left-right选项说明中的示例) 。但是,它显示了从另一个分支中挑选出来的提交(例如,“b 上的第 3 个”可以从分支 A 中挑选出来)。使用此选项,将从输出中排除此类提交对。

--left-only 
--right-only 

列表仅在对称差异的相应侧提交,即仅在那些将被标记为<的那些。 > --left-right

例如,--cherry-pick --right-only A...B省略了来自B的提交,这些提交位于A中,或者补丁等效于A中的提交。换句话说,这列出了git cherry A B+提交。更确切地说,--cherry-pick --right-only --no-merges给出了确切的列表。

--cherry 

--right-only --cherry-mark --no-merges的同义词;有用的是将输出限制在我们这一侧的提交中,并用git log --cherry upstream...mybranch标记已应用于分叉历史记录另一侧的输出,类似于git cherry upstream mybranch

-g 
--walk-reflogs 

而不是走提交祖先链,将 reflog 条目从最新的条目转到较旧的条目。使用此选项时,您无法指定要排除的提交(即 ^ commitcommit1…commit2commit1 … commit2 表示法不能用过的)。

使用oneline以外的--pretty格式(出于显而易见的原因),这会导致输出从 reflog 中获取两行额外的信息。输出中的 reflog 指示符可能显示为ref@{Nth}(其中Nth是 reflog 中的反向时间顺序索引)或ref@{timestamp}(带有该条目的时间戳),具体取决于以下几条规则:

  1. 如果起始点指定为ref@{Nth},则显示索引格式。
  2. 如果起始点指定为ref@{now},则显示时间戳格式。
  3. 如果两者均未使用,但在命令行中给出了--date,则以--date请求的格式显示时间戳。
  4. 否则,显示索引格式。

--pretty=oneline下,提交消息在同一行上以此信息为前缀。此选项不能与--reverse组合使用。另见 git-reflog [1]

--merge 

合并失败后,show refs 触摸有冲突的文件,并且在所有头上都不存在要合并的文件。

--boundary 

输出排除边界提交。边界提交以-为前缀。

历史简化

有时您只对历史记录的某些部分感兴趣,例如修改特定< path>的提交。但 _ 历史简化 _ 有两个部分,一部分是选择提交,另一部分是如何做,因为有各种策略来简化历史。

以下选项选择要显示的提交:

<paths> 

提交修改给定的<路径>被选中。

--simplify-by-decoration 

选择某些分支或标记引用的提交。

请注意,可以显示额外的提交以提供有意义的历史记录。

以下选项会影响简化的执行方式:

Default mode 

将历史简化为最简单的历史,解释树的最终状态。最简单的,因为如果最终结果相同(即合并具有相同内容的分支),它会修剪一些侧分支

--full-history 

与默认模式相同,但不修剪某些历史记录。

--dense 

仅显示选定的提交,并显示一些具有有意义的历史记录。

--sparse 

显示简化历史记录中的所有提交。

--simplify-merges 

--full-history的附加选项,用于从生成的历史记录中删除一些不必要的合并,因为没有选定的提交有助于此合并。

--ancestry-path

当给出一系列要显示的提交时(例如 commit1…commit2commit2 ^ commit1 ),只显示直接存在于 commit1 之间的祖先链上的提交]和 commit2 ,即提交既是 commit1 的后代,又是 commit2 的祖先。

下面是更详细的解释。

假设您将foo指定为< paths>。我们将调用修改foo!TREESAME 的提交,以及其余的 TREESAME。 (在foo的差异滤波中,它们分别看起来不同且相等。)

在下文中,我们将始终参考相同的示例历史记录来说明简化设置之间的差异。我们假设您正在过滤此提交图中的文件foo

.-A---M---N---O---P---Q
   /     /   /   /   /   /
  I     B   C   D   E   Y
   \   /   /   /   /   /
    `-------------'   X

历史 A — Q 的水平线被视为每次合并的第一个父级。提交是:

  • I是初始提交,其中foo存在内容“asdf”,文件quux存在,内容为“quux”。初始提交与空树进行比较,因此I是!TREESAME。
  • A中,foo仅包含“foo”。
  • B包含与A相同的更改。它的合并M是微不足道的,因此对所有父母都是 TREESAME。
  • C不会更改foo,但是它的合并N会将其更改为“foobar”,因此它不是任何父级的 TREESAME。
  • Dfoo设置为“baz”。它的合并OND的字符串组合成“foobarbaz”;即,它不是任何父母的 TREESAME。
  • Equux更改为“xyzzy”,其合并P将字符串组合为“quux xyzzy”。 P是 TREESAME 到O,但不是E
  • X是一个独立的根提交,它添加了一个新文件sideY修改了它。 Y是 TREESAME 到X。它的合并Qside添加到PQ将 TREESAME 添加到P,但不添加到Y

rev-list根据是否使用--full-history和/或父改写(通过--parents--children)来回溯历史记录,包括或排除提交。可以使用以下设置。

Default mode 

如果对任何父母不是 TREESAME,则包含提交(尽管可以更改,请参阅下面的--sparse)。如果提交是合并,并且它是一个父级的 TREESAME,则只关注该父级。 (即使有几个 TREESAME 父母,也只能跟随他们中的一个。)否则,请跟随所有父母。

这导致:

.-A---N---O
   /     /   /
  I---------D

请注意,仅遵循 TREESAME 父级的规则(如果有的话)将完全从考虑中删除BC被认为是通过N,但是是 TREESAME。 Root 提交与空树进行比较,因此I是!TREESAME。

父/子关系仅在--parents中可见,但这不会影响在默认模式下选择的提交,因此我们显示了父行。

--full-history without parent rewriting 

此模式与默认值在一点上不同:始终跟随合并的所有父项,即使它是其中一个的 TREESAME。即使合并的多个方面包含了包含的提交,这并不意味着合并本身就是!在这个例子中,我们得到了

I  A  B  N  D  O  P  Q

M被排除在外,因为对父母双方都是 TREESAME。 ECB都走了,但只有B是!TREESAME,所以没有出现。

请注意,如果没有父改写,就不可能谈论提交之间的父/子关系,因此我们将它们显示为断开连接。

--full-history with parent rewriting 

只有普通提交才包括在内!TREESAME(虽然可以更改,但请参见下面的--sparse)。

合并始终包括在内。但是,它们的父列表会被重写:沿着每个父项删除不包含在其中的提交。这导致了

.-A---M---N---O---P---Q
   /     /   /   /   /
  I     B   /   D   /
   \   /   /   /   /
    `-------------'

--full-history比较而不重写上述内容。请注意,E被删除,因为它是 TREESAME,但是 P 的父列表被重写为包含E的父ICNXYQ也发生了同样的情况。

除上述设置外,您还可以更改 TREESAME 是否影响包含:

--dense 

如果他们不是任何父母的 TREESAME,则包括走路的提交。

--sparse 

包括所有步行的提交。

请注意,如果没有--full-history,这仍然可以简化合并:如果其中一个父项是 TREESAME,我们只遵循那个,所以合并的其他方面永远不会走。

--simplify-merges 

首先,以与父改写的--full-history相同的方式构建历史图(参见上文)。

然后根据以下规则将每个提交C简化为最终历史记录中的替换C'

  • C'设置为C
  • C'的每个父P替换为其简化P'。在这个过程中,删除作为其他父母或祖先的祖先的父母将 TREESAME 提交到空树,并删除重复项,但要注意永远不要删除我们所有父母的 TREESAME。
  • 如果在此父级重写之后,C'是根或合并提交(具有零或> 1 父级),边界提交或!TREESAME,它仍然存在。否则,它将替换为其唯一的父级。

通过与--full-history与父重写进行比较,可以最好地显示出这种效果。这个例子变成了:

.-A---M---N---O
   /     /       /
  I     B       D
   \   /       /
    `---------'

注意NPQ--full-history的主要差异:

  • N的父列表删除了I,因为它是另一个父M的祖先。仍然,N仍然是因为它是!TREESAME。
  • P的父列表同样删除了IP然后被完全删除,因为它有一个父母并且是 TREESAME。
  • Q的父列表将Y简化为X。然后删除X,因为它是 TREESAME 根。 Q然后被完全删除,因为它有一个父母并且是 TREESAME。

最后,还有第五种简化模式:

--ancestry-path 

将显示的提交限制为直接在给定提交范围中的“from”和“to”提交之间的祖先链上的提交。即只显示“to”提交的祖先和“from”提交的后代的提交。

作为示例用例,请考虑以下提交历史记录:

D---E-------F
     /     \       \
    B---C---G---H---I---J
   /                     \
  A-------K---------------L--M

常规 D…M 计算作为M的祖先的提交集,但不包括作为D的祖先的提交。这对于从D以来导致M的历史发生了什么是有用的,因为“D中没有M具有什么M”。这个例子中的结果将是所有提交,除了AB(当然还有D本身)。

当我们想知道M中的提交被D引入的 bug 污染并需要修复时,我们可能只想查看实际上 D…M 的子集D的后代,即排除CK。这正是--ancestry-path选项的作用。应用于 D…M 范围,它会导致:

E-------F
     \       \
      G---H---I---J
             \
        L--M

--simplify-by-decoration选项允许您通过省略未由标记引用的提交来仅查看历史拓扑的大图。如果(1)它们被标记引用,或(2)它们改变命令行上给出的路径的内容,则提交被标记为!TREESAME(换句话说,保持在上述历史简化规则之后)。所有其他提交都标记为 TREESAME(可以简化)。

提交订购

默认情况下,提交以反向时间顺序显示。

--date-order 

在显示所有子项之前不显示父项,但在提交时间戳顺序中显示提交。

--author-date-order 

在显示所有子项之前不显示父项,但在作者时间戳顺序中显示提交。

--topo-order 

在显示所有子项之前不显示父项,并避免在多行历史记录中显示混合的提交。

例如,在这样的提交历史中:

---1----2----4----7
  \        \
   3----5----6----8---

其中数字表示提交时间戳的顺序,git rev-list--date-order的朋友按时间戳顺序显示提交:8 7 6 5 4 3 2 1。

使用--topo-order,他们将显示 8 6 5 3 7 4 2 1(或 8 7 4 2 6 5 3 1);为了避免将两个并行开发轨道的提交混合在一起,显示一些较旧的提交在较新的提交之前。

--reverse 

输出要以相反顺序显示的提交(请参阅上面的“提交限制”部分)。不能与--walk-reflogs结合使用。

对象遍历

这些选项主要用于打包 Git 存储库。

--no-walk[=(sorted|unsorted)] 

只显示给定的提交,但不要遍历他们的祖先。如果指定了范围,则无效。如果给出了参数unsorted,则提交将按命令行中给出的顺序显示。否则(如果sorted或没有给出参数),提交按提交时间以反向时间顺序显示。不能与--graph结合使用。

--do-walk 

覆盖之前的--no-walk

提交格式

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

以给定格式打印提交日志的内容,其中 < format> 可以是 oneline ,_ 短 培养基 更丰富 之一电子邮件 原始 格式:< string>_ 和 tformat:< string> 。当 < format> 不属于上述情况,并且其中包含 _%占位符 _,其行为就像 –pretty = tformat:< format> 给出了。

有关每种格式的一些其他详细信息,请参阅“PRETTY FORMATS”部分。当 =< format> 部分省略,默认为 medium

注意:您可以在存储库配置中指定默认的漂亮格式(请参阅 git-config [1] )。

--abbrev-commit 

而不是显示完整的 40 字节十六进制提交对象名称,而只显示部分前缀。可以使用“–abbrev =< n>”指定非默认位数(如果显示,也会修改 diff 输出)。

对于使用 80 列终端的人来说,这应该使“–pretty = oneline”更具可读性。

--no-abbrev-commit 

显示完整的 40 字节十六进制提交对象名称。这否定了--abbrev-commit以及暗示它的选项,例如“–oneline”。它还会覆盖log.abbrevCommit变量。

--oneline 

这是一起使用的“–pretty = oneline --abbrev-commit”的简写。

--encoding=<encoding> 

提交对象在其编码头中记录用于日志消息的编码;此选项可用于告诉命令以用户首选的编码重新编码提交日志消息。对于非管道命令,默认为 UTF-8。请注意,如果一个对象声称在X中编码并且我们在X中输出,我们将逐字输出该对象;这意味着原始提交中的无效序列可能会复制到输出中。

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

执行选项卡扩展(将每个选项卡替换为足够的空格以填充到日志消息中的 < n> 的倍数的下一个显示列),然后在输出中显示它。 --expand-tabs--expand-tabs=8的简写,--no-expand-tabs--expand-tabs=0的简写,它会禁用制表符扩展。

默认情况下,选项卡以相当格式展开,将日志消息缩进 4 个空格(即 medium ,默认情况下, fullfulller )。

--notes[=<treeish>] 

在显示提交日志消息时,显示注释提交的注释(请参阅 git-notes [1] )。当命令行中没有给出--pretty--format--oneline选项时,这是git loggit showgit whatchanged命令的默认值。

默认情况下,显示的注释来自core.notesRefnotes.displayRef变量(或相应的环境覆盖)中列出的注释 refs。有关详细信息,请参阅 git-config [1]

使用可选的 < treeish> 参数,使用树形查找要显示的注释。树形可以在以refs/notes/开头时指定完整的引用名称;当它以notes/开始时,refs/和其他refs/notes/作为前缀以形成 ref 的全名。

可以组合多个–notes 选项来控制显示哪些音符。示例:“ - notes = foo”将仅显示“refs / notes /  foo”中的注释; “–notes = foo --notes”将显示“refs / notes / foo”和默认音符  ref(s)中的两个音符。

--no-notes 

不要显示笔记。这取消了上面的--notes选项,通过重置显示注释的注释列表。选项按命令行中给出的顺序进行解析,例如, “–notes --notes = foo --no-notes --notes = bar”只会显示“refs / notes / bar”中的注释。

--show-notes[=<treeish>]
--[no-]standard-notes 

不推荐使用这些选项。请使用上面的–notes / - no-notes 选项。

--show-signature 

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

--relative-date 

--date=relative的同义词。

--date=<format> 

仅对以人类可读格式显示的日期生效,例如使用--pretty时。 log.date config 变量为日志命令的--date选项设置默认值。默认情况下,日期显示在原始时区(提交者或作者)中。如果-local附加到格式(例如,iso-local),则使用用户的本地时区。

--date=relative显示相对于当前时间的日期,例如“2 小时前”。 -local选项对--date=relative无效。

--date=local--date=default-local的别名。

--date=iso(或--date=iso8601)以类似 ISO 8601 的格式显示时间戳。与严格的 ISO 8601 格式的区别在于:

  • 空格而不是T日期/时间分隔符
  • 时区和时区之间的空间
  • 时区的小时和分钟之间没有冒号

--date=iso-strict(或--date=iso8601-strict)以严格的 ISO 8601 格式显示时间戳。

  • --date=rfc(或--date=rfc2822)以 RFC 2822 格式显示时间戳,通常在电子邮件中找到。
  • --date=short仅以YYYY-MM-DD格式显示日期,但不显示时间。
  • --date=raw显示自纪元以来的秒数(1970-01-01 00:00:00 UTC),后跟一个空格,然后将时区显示为与 UTC 的偏移量(+-与四位数;前两位是小时,后两位是分钟)。即,好像时间戳是用strftime("%s %z")格式化的。请注意,-local选项不会影响秒 - 自 - 纪元值(始终以 UTC 为单位),但会切换附带的时区值。
  • --date=human如果时区与当前时区不匹配则显示时区,如果匹配则不显示整个日期(即跳过“今年”日期的打印年份,但也跳过整个日期如果它是在过去几天,我们可以说它是什么工作日)。对于较旧的日期,小时和分钟也被省略。
  • --date=unix将日期显示为 Unix 纪元时间戳(自 1970 年以来的秒数)。与--raw一样,它始终为 UTC,因此-local无效。
  • --date=format:...将格式...输入系统strftime,%z 和%Z 除外,它们在内部处理。使用--date=format:%c以系统区域设置的首选格式显示日期。有关格式占位符的完整列表,请参阅strftime手册。使用-local时,正确的语法是--date=format-local:...
  • --date=default是默认格式,类似于--date=rfc2822,但有一些例外:
  • 星期几之后没有逗号
  • 使用本地时区时,省略时区
--parents 

同时打印提交的父级(以“提交父级”的形式)。也可以启用父重写,请参阅上面的 _ 历史简化 _。

--children 

同时打印提交的子项(以“提交子项…”的形式)。也可以启用父重写,请参阅上面的 _ 历史简化 _。

--left-right 

标记可以从中获取提交的对称差异的哪一侧。左侧的提示以<为前缀,右侧的提示以>为前缀。如果与--boundary结合使用,则这些提交以-为前缀。

例如,如果您有此拓扑:

y---b---b  branch B
      / \ /
     /   .
    /   / \
   o---x---a---a  branch A

你会得到这样的输出:

$ git rev-list --left-right --boundary --pretty=oneline A...B
  >bbbbbbb... 3rd on b
  >bbbbbbb... 2nd on b
  <aaaaaaa... 3rd on a
  <aaaaaaa... 2nd on a
  -yyyyyyy... 1st on b
  -xxxxxxx... 1st on a
--graph 

在输出的左侧绘制提交历史的基于文本的图形表示。这可能会导致在提交之间打印额外的行,以便正确绘制图形历史记录。不能与--no-walk结合使用。

这使父进行重写,参见上面的 _ 历史简化 _。

默认情况下,这意味着--topo-order选项,但也可以指定--date-order选项。

--show-linear-break[=<barrier>] 

当不使用–graph 时,所有历史分支都被展平,这使得很难看出两个连续的提交不属于线性分支。在这种情况下,此选项会在它们之间设置障碍。如果指定了,则显示的是字符串而不是默认字符串。

差异格式化

下面列出了控制 diff 输出格式的选项。其中一些特定于 git-rev-list [1] ,但是可以给出其他差异选项。有关更多选项,请参阅 git-diff-files [1]

-c 

使用此选项,合并提交的 diff 输出同时显示每个父项与合并结果的差异,而不是一次显示父项和结果之间的成对差异。此外,它仅列出从所有父母修改的文件。

--cc 

这个标志意味着-c选项并通过省略不感兴趣的帅哥进一步压缩补丁输出,其中父母的内容只有两个变体,合并结果选择其中一个而不做修改。

-m 

此标志使合并提交像常规提交一样显示完整差异;对于每个合并父项,将生成单独的日志条目和差异。一个例外是,当给出--first-parent选项时,只显示对第一个父项的差异;在这种情况下,输出表示合并带来的变化 _ 进入当前分支的 _。

-r 

显示递归差异。

-t 

在 diff 输出中显示树对象。这意味着-r


Git 中文参考(四)(5)https://developer.aliyun.com/article/1565833

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
监控 程序员 开发工具
如何规范Git提交-参考阿里云开发者社区
这篇文章分享了如何规范Git提交,介绍了commit message的格式规范,并通过webhook监控机制来确保代码提交的规范性,从而提高研发效率和代码维护质量。
|
3月前
|
存储 缓存 网络安全
Git 中文参考(一)(8)
Git 中文参考(一)
34 2
|
3月前
|
存储 网络安全 开发工具
Git 中文参考(一)(7)
Git 中文参考(一)
22 2
|
3月前
|
存储 算法 Java
Git 中文参考(一)(6)
Git 中文参考(一)
29 2
|
3月前
|
存储 Shell 开发工具
Git 中文参考(一)(5)
Git 中文参考(一)
22 2
|
3月前
|
存储 开发工具 git
Git 中文参考(一)(4)
Git 中文参考(一)
24 2
|
3月前
|
存储 安全 开发工具
Git 中文参考(一)(3)
Git 中文参考(一)
18 2
|
3月前
|
存储 Shell 开发工具
Git 中文参考(一)(2)
Git 中文参考(一)
19 2
|
3月前
|
存储 人工智能 开发工具
Git 中文参考(五)(9)
Git 中文参考(五)
130 2
|
3月前
|
存储 Linux 开发工具
Git 中文参考(五)(8)
Git 中文参考(五)
23 2