我正在尝试从特定提交开始提取特定分支上 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
来观察,A
与master
的提示提交。 参见杰克·沃思的答案。 这不会显示已更改然后更改回来的文件;要获取这些文件,请继续阅读。
你是对的,--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