如何找到在特定提交哈希后提交的所有可从 HEAD 访问的提交?

  • 本文关键字:提交 访问 HEAD 何找 哈希 git
  • 更新时间 :
  • 英文 :


我正在尝试从特定提交开始提取特定分支上 git 中更改的所有文件。

我不在乎血统,只关心可以从HEAD到达。

从本质上讲,我正在尝试构建自提交 X 以来已更新、修改和删除的文件列表(因为这意味着日期/时间),以便我可以对这些文件进行操作。

我不在乎提交 B 在技术上是否可以从提交 A 到达。 我只关心提交 B 是在提交 A 之后提交的,并且可以从 HEAD 访问。

考虑我正在做的事情的另一种方法是,我想对自推送特定提交的日期/时间以来在 git 存储库中添加或修改的每个文件执行 cp -R。

目前我正在执行以下操作,但对我来说看起来不对:

git log --pretty=oneline --ancestry-path 05de9827fe31905b7ef98f3bbe331e922977de4d..master --date-order

任何人都可以给我有关如何执行此操作的提示/技巧吗? 我读到的关于 2 点和 3 点符号的所有内容都是关于根据可达性排除事物,这具体不是我想要的。

然而,我也不是最强的git人,所以如果我误解了,我很乐意接受这方面的教育。

可能的快捷方式:请记住,提交是完整快照。 所有在master的提示中不同的文件,与提交A中的内容,都可以通过一个简单的单一的提交git diff来观察,Amaster的提示提交。 参见杰克·沃思的答案。 这不会显示已更改然后更改回来的文件;要获取这些文件,请继续阅读。


你是对的,--ancestry-path做了一些非常不同的事情:

...--o--A--*--*--*--*   <-- master
/
...--o--o--o

下行的提交不是提交A的后代,将被消除,而是master尖端的祖先,您可能希望包含它们。

请记住,每次提交中有两个日期和时间戳。 这些是作者日期和提交者日期1git log --pretty=fuller将显示每个提交的两个时间戳。

您可以使用--since--min-age将修订遍历限制为提交时间戳高于某个最小值的提交。 如果您对作者日期感兴趣,那(要)难得多(git rev-list缺少使用它使用作者日期的选项)。

我只关心提交 B 是在提交 A 之后推送的,并且可以从 HEAD 访问。

没有可用的"推送">

,因为提交中没有"推送"日期。 可以在五年前进行提交(因此其提交日期是 2014 年)并在今天推送。 (你也可以伪造提交者日期,当然,即使你不伪造它,也取决于计算机的时钟是否正确。 但总的来说,人们不会弄乱他们的提交者时间戳,所以如果你相信它们足够好,你可以使用它们。

综上所述,您需要首先从提交A中提取提交者时间戳:

git log --no-walk --pretty=format:%ci A

将以 ISO-8601 格式检索提交者时间戳。 请参阅git log文档PRETTY FORMATS部分中的格式指令列表,了解各种替代方案。--since日期分析器采用多种输入形式。

(注意时区问题,但我忘记了 Git 实际上是如何处理时区问题的。


1作者日期旨在表示更改的首次撰写时间。 提交者日期用于保存创建该特定提交(由提交的哈希 ID 标识的提交)的时间。 这两个时间戳最初是相同的,但是如果您变基或git cherry-pick某些提交,它将保留其创作日期,同时在变基或挑选副本(也会获得新的提交哈希 ID)时获得新的(当前时间)提交者日期。

正因为如此,如果一个提交是在一个月前首次编写的,但在今天提交之前必须修改几次,那么它的作者日期将是一个月前的,提交者日期是"今天"。 因此,查找提交者日期≥作者日期是非常典型的。

我不确定这是否是您要查找的,但是"我正在尝试构建自提交 X 以来已更新、修改和删除的文件列表"将得到--name-only的支持,从您想回顾的任何提交运行:

$ git diff <commit X SHA> --name-only
file_one
file_two
file_three

最新更新