git - 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 分支上的所有内容。没有其他分支机构有问题
解决方案
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和修订选择。
推荐阅读
- mysql - 在 mySQL 中将返回值格式化为小数点后 2 位
- go - 如何修改未知类型结构中的字段?
- javascript - 词法作用域和 JavaScript 的 `this` 有什么关系?
- javascript - 伪经典继承相对于函数继承(工厂函数)有哪些技术优势?
- python - 为棋盘游戏的 Keras 模型生成适当的输出层
- spring - 在配置中有关于 DispatcherServletPath 的错误
- python - flask-sqlalchemy 查询具有不同值的多行
- java - 在 Android 中将字符串转换为字符串数组
- android-intent - intent.getStringExtra 不能为空
- security - 通过身份验证限制 Heroku 应用程序的使用?