我有几个提交从午夜开始
假设我有以下提交(假设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以来的更改