0

我正在尝试撤消过去的不良 git 做法,并且在这样做的过程中,我想获取特定文件的提交列表,比某个时间戳更新(对这些文件的较旧提交被精心挑选到主分支,考虑到原始分支还远未完成,我现在意识到这是一个非常糟糕的主意)。图解简化:

A---A1-...-CB1--CB2-...-CBm--A5--A6 | master
 \
  B1--B2--B3-...-Bm-...-Bn          | topic
 \
  B1--B2_3--B4-...-Bn                | topic-R
  • 提交 B1..Bm 不久前从主题分支中被精心挑选到 master 中,此处显示为 CB1、CB2 等。
  • 在原始主题分支中继续处理文件(主分支未触及它们),此处为 Bm+1..Bn
  • 我最近创建了 topic-R 分支作为 topic 分支的副本,并在 merge-base 之上与 master 交互地重新建立它以清理历史记录(压缩和修复)。

我现在想从 topic-R 中获取提交 Bm+1..Bn 的列表git rev-list。所以我找到了提交 CBm,在 topic-R 的历史记录(和 rev-list 输出)中,它显示了我期望的日期,大约 9 个月前。

git rev-list --after "2020-08-07" <A>..topic-R --reverse -- <file list>

因此,我将其提供给rev-list并且令人惊讶的是,我得到了所有提交,就好像--after/--since过滤器被忽略了一样。传递--prettyrev-list仍会在 Date 下显示预期日期- 几个月前的日期,即编写代码时的日期。但是当我传递--timestamp到时,我会看到列表中所有rev-list提交的最新时间戳——从几天前我重新设置 topic-R 分支时开始。

这里发生了什么?有没有办法告诉rev-list通过原始时间戳进行过滤,这显然仍然可用?

我知道我可以只使用 topic-R 中的 Bm+1 的哈希来限制列表,但我很好奇 git 跟踪哪些类型的时间戳以及是否可以按原始时间戳进行过滤。

4

1 回答 1

1

每个提交都有两个日期和时间戳。一个称为作者日期,一个称为提交者日期

当您以通常的方式进行新提交时,使用且不使用git commit诡计,两者都设置为相同的值。Git 从您的计算机时钟中检索当前时间,如果准确,则新提交的两个日期戳为“现在”。

当您使用git cherry-pick或内部使用cherry-pick 机制(例如git rebase)进行提交时,Git 通常会保留提交的原始作者和原始作者日期。您成为提交者,“现在”是提交者日期。

要使用 来查看两个时间戳,请git log使用打印两者的任何格式选项。最简单的使用是git log --pretty=fuller.

和(或--since和)选项仅使用提交者日期。(我认为应该有一种方法可以指定作者日期,但没有。)--until--after--beforegit log

于 2021-05-27T01:02:24.627 回答