如何查找在特定提交哈希之后提交的,可从HEAD到达的所有提交?

时间:2019-06-03 20:04:26

标签: git

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

我不在乎祖先,只是可以从HEAD到达。

本质上,我正在尝试构建自提交X之后已更新,修改和删除的文件的列表(因为这意味着日期/时间),所以我可以使用这些文件。

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

思考我正在做什么的另一种方法是,我想对自从特定提交被推送的日期/时间以来在git repo中添加或修改的每个文件执行cp -R。

当前我正在执行以下操作,但它对我而言并不正确:

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

任何人都可以给我有关如何执行此操作的提示/技巧吗?我所读到的有关2点和3点表示法的所有内容都是根据可访问性排除事物,而这并不是我想要的。

但是,我也不是最强的git人,因此,如果我误解了,我很乐意接受这一方面的教育。

2 个答案:

答案 0 :(得分:2)

可能的快捷方式:请记住,提交是完整快照master提示中所有与提交A中不同的文件都可以通过提交git diff与提示中的简单A来观察master的提交。参见Jake Worth's answer。这不会显示已更改的文件,然后 back; 更改以获取这些文件,请继续阅读。


您是正确的,--ancestry-path所做的事情与众不同:

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

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

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

您可以使用--since--min-age将修订遍历限制为 committer 时间戳大于某个最小值的提交。如果您对作者日期感兴趣,则(更)困难(git rev-list使其无法使用作者日期)。

  

我只关心提交B在提交A之后被推送,并且可以从HEAD到达。

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

所有这些,您需要首先从提交A中提取提交者时间戳:

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

将以ISO-8601格式检索提交者时间戳。有关各种选择,请参见the git log documentation PRETTY FORMATS section中的格式指令列表。 --since日期解析器采用许多输入形式。

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


1 作者日期旨在建议何时首次进行更改。提交者日期用于保留创建该特定提交的时间,该特定提交由提交的哈希ID标识。这两个时间戳最初是相同的,但是如果您重新设置基准或git cherry-pick某个提交,则它会保留其作者日期,而在重新设置基准或进行自动选择复制时会获得一个新的(当前)提交日期(还会获得一个新的提交哈希ID)。

由于所有这些,如果一个提交是在一个月前首次编写的,但是在今天被提交之前必须进行几次修改,那么它的作者日期将是一个月大,而提交者的日期是“今天”。 ”。因此,找到committer-date≥author-date是很典型的。

答案 1 :(得分:0)

我不确定这是否是您要查找的内容,但是{{1将支持“我正在尝试构建自提交X之后已被更新,修改和删除的文件的列表” }},从您想回溯的任何提交中运行:

--name-only