git diff changes with name only正确显示更改,但不包括在提交开始时更改的文件



我有几个提交从午夜开始

假设我有以下提交(假设change23等是SHA提交散列):

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

change23

change24

change25

change26

change27(当前主分支中提交的所有内容都是最新的)

所以我想要的是

git diff --name-only change23..master

所以我可以得到从change23, 24, 25, 26和27(即自午夜以来)更改的所有文件

,这工作得很好,但它不包括change23中更改的文件,它只包括24、25、26和27中更改的文件

我错过了一个概念吗?

I can do

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

~1的工作,包括变化也在change23,但我不完全理解这一点,我害怕会错过一些东西,由于不理解祖先和父概念。

注意这些都在主分支上。不涉及其他分支

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和Revision Selection。

将源代码更改为change23~,以从change23的父节点开始。它不会在change23中列出更改,因为它本质上是您的基树。如果它没有从change23更改,那么它不是一个更改,否则它只是列出git repo中的每个文件。

你也可以从change22开始得到你想要的东西,因为你想要在change23中包含更改,这意味着自change22以来的更改

相关内容

  • 没有找到相关文章