首页 > 解决方案 > git diff changes with name only 正确显示更改,但不包括从开始的提交中更改的文件

问题描述

自午夜以来,我完成了一些提交

假设我有以下提交(假装 change23 ​​等是 SHA 提交哈希):

change22(太早了,不想包含更改)

改变23

改变24

改变25

改变26

change27(当前的 master 分支是最新的,所有内容都已提交)

所以我想要的是

git diff --name-only change23..master

所以我可以从change23、24、25、26和27(即从午夜开始)更改所有文件

这很好用,但它不包括更改的文件,change23仅包括在 24、25、26 和 27 更改的文件

我错过了一个概念吗?

我可以

git diff --name-only change23~1..master

以及~1在 change23 ​​中包含更改的作品,但我不完全理解这一点,并且由于不了解祖先和父概念,我害怕会错过一些东西。

请注意,这些都是 master 分支上的所有内容。没有其他分支机构有问题

标签: git

解决方案


a..z并不意味着“从 a 到 z 的所有提交”。它是^a z“z 可访问但 a 无法访问的所有提交”的简写。为什么?

Git 历史不是线性的。git log会骗你,让它看起来是线性的,但事实并非如此。git log --graph --decorate会给你真实的历史。分支真的分支。两次提交之间没有明确的“之间”,因此 Git 使用集合论。

考虑这个分支并合并。

z
|
y     <----- merge
|\
x \
|  |
w  c
|  |
v  b
| /
|/
a      <---- branch
|
d

请记住,提交只能看到他们的父母。z 看到 y。y 看到 x 和 c。

如果你要求,c..z你会得到 z、y、x、w、v。没有 b 和没有 a 和没有 d,它们可以从 c 到达。没有 c,c 可以从 c 到达。

如果您要求,a..z您将得到 z、y、c、b、x、w、v。不 a,它可以从自身访问。不 d,它可以从 a 到达。

这就是为什么a^..z基本上是“a 和 z 之间的所有提交”,但它实际上是“z 可以访问的所有提交,而 a 的第一个父级不能访问的所有提交”。

有关更多信息,请参阅Pro Git 中的gitrevisions修订选择


推荐阅读