git - 什么是 git diff^?
问题描述
我通常通过“git diff commit^!”检查提交的内容。但是,当我将它应用于初始提交时,我会看到之后来自不同提交的混合更改,而我认为它应该是提交的初始副本。有人可以帮助我从语义上理解它吗?
顺便说一句,我知道有很好的答案如何显示来自stackoverflow 问题 40883798的 init 提交的差异。
解决方案
我通常通过“git diff commit^!”检查提交的内容。
(为什么?通常的命令是git show <commit>
。)
但是,当我将它应用于初始提交时,我看到 [一些不太有用的东西]
找到任何修订语法的(简短)解释的地方是gitrevisons 文档,它说明了^!
后缀:
r1 ^! 表示法包括提交r1但不包括其所有父项。该符号本身表示单个提交r1。
不幸的是,这个解释太短了。在这种情况下,提供修订版git rev-parse
更有帮助:
$ git rev-parse HEAD
b5101f929789889c2e536d915698f58d5c5c6b7a
$ git rev-parse HEAD^1
a562a119833b7202d5c9b9069d1abb40c1f9b59a
从这两个输出中,我们可以看到HEAD
代表哈希 ID b5101f929789889c2e536d915698f58d5c5c6b7a
,它的第一个父节点是a562a119833b7202d5c9b9069d1abb40c1f9b59a
。这是我们需要理解的:
$ git rev-parse HEAD^!
b5101f929789889c2e536d915698f58d5c5c6b7a
^a562a119833b7202d5c9b9069d1abb40c1f9b59a
这里的输出实际上意味着:
- 从
b5101f929789889c2e536d915698f58d5c5c6b7a
...开始 - 但停在
a562a119833b7202d5c9b9069d1abb40c1f9b59a
.
(^
哈希 ID 前面的意思是“不是”:提交 B,但不是提交 A。)
将此与以下内容进行比较:
$ git rev-parse HEAD^..HEAD
b5101f929789889c2e536d915698f58d5c5c6b7a
^a562a119833b7202d5c9b9069d1abb40c1f9b59a
输出是一样的!
这意味着什么git diff
有点棘手和微妙,因为我们在这里谈论git rev-parse
而不是git diff
. 但实际上,当你运行时:
git diff <something>
Git 在内部<something>
将git rev-parse
. 因此,如果您输入:
git diff HEAD^..HEAD
git diff
在内部将整个字符串HEAD^..HEAD
传递给内部版本git rev-parse
并获取“停止于”和“开始于”ID。如果您输入:
git diff HEAD^!
git diff
在内部将整个字符串HEAD^!
交给内部版本git rev-parse
并获得相同的“停止于”和“开始于”ID。
当您将提交哈希用于具有一个父级的任何提交时,同样适用:^!
后缀为父级哈希生成“非”,为哈希生成“使用”。
但是,当你找到一个根提交时——在我的 Git 存储库中,有一堆,所以我只选择第一个:
$ git rev-list --max-parents=0 HEAD | head -1
0ca71b3737cbb26fbf037aa15b3f58735785e6e3
——当我们给这个哈希ID加上帽子后缀时git rev-parse
,我们得到:
$ git rev-parse 0ca71b3737cbb26fbf037aa15b3f58735785e6e3^!
0ca71b3737cbb26fbf037aa15b3f58735785e6e3
也就是说,git rev-parse
对提交说“是”,对所有的父母说“不”,但是没有任何父母,所以它什么都不说!
如果你把它提供给——git diff
只有一个提交哈希——git diff
命令会认为:啊,你想将给定的提交与你的工作树中的任何内容进行比较。这就是你得到的差异。
请注意,后缀会为提交的所有父级^!
生成“非” 。对于合并提交,至少有两个(通常正好是两个)父级:
$ git show -s a562a11983
commit a562a119833b7202d5c9b9069d1abb40c1f9b59a
Merge: 7fa92ba40a ad6f028f06
Author: Junio C Hamano ...
所以:
$ $ git rev-parse a562a11983^!
a562a119833b7202d5c9b9069d1abb40c1f9b59a
^7fa92ba40abbe4236226e7d91e664bbeab8c43f2
^ad6f028f067673cadadbc2219fcb0bb864300a6c
当您提供一个扩展为三个或更多git diff
提交的修订说明符时,它有时会做一些不同的事情。但是,在这种特殊情况下,它只是将提交本身与第一个父级进行比较。默认情况下,该命令将生成一个组合差异,在这种情况下根本不显示任何内容,因为组合差异旨在向您显示合并可能发生冲突的位置。git show
推荐阅读
- c# - 如何通过 netcore 项目获取所有隐式引用的 dll?
- ruby - 用于计算数据集中任何给定距离的经过时间的算法或公式?
- python - 以编程方式运行 ipyvuetify 按钮
- python - 在 .query 函数中使用变量
- ios - UIApplication.isIdleTimerDisabled 中的崩溃
- java - 如何在另一个类中使用一个类?
- svelte - 你可以在 svelte 条件语句中添加可选的 _outer_ 标签吗?
- android - 如何动画隐藏和显示功能
- javascript - NextJS getInitialProps
- python - SpriteCollide 每次碰撞只运行一次