Git 按特定日期签出不起作用(忽略指定日期并显示整个提交历史记录)

Git checkout by specific date doesn't work (ignores specified date and presents the whole commit history)

我看过很知名的linkHow to checkout in Git by date? 命令 git rev-list 对我不起作用 - 我总是得到提交的整个历史记录,我的情况似乎忽略了指定的日期时间值。

步骤:
我在我的分支mynewbranch1

git log 呈现这些提交:

**commit 1250c4c2 (HEAD -> mynewbranch1)**
Author: john <>
Date:   Tue May 10 11:27:45 2022 +0200
    text1`

**commit ae99ff**
Author: john
Date:   Mon May 9 17:22:37 2022 +0200
    text2`

**commit 84e85**
Author: alex <>
Date:   Mon May 9 16:13:47 2022 +0200
    text3`

**commit 41b35**
Author: alex <>
Date:   Mon May 8 16:11:31 2022 +0200
    text4`

现在我执行以下命令:

git checkout $(git rev-list -n 1 --first-parent --before="2022-05-09 16:13:47" mynewbranch1)

我也试过反引号:

git checkout `git rev-list -n 1 --first-parent --before="2022-05-09 16:13:47" mynewbranch1`

现在我想从中创建一个新分支:

git checkout -b some_branch_from_above_date

但是当我在我的新分支上执行 git logsome_branch_from_above_date 我可以再次看到所有提交!我希望只有上面列表中的第 3 次和第 4 次提交,因为只有那些在指定日期之前:2022-05-09 16:13:47

我必须通过脚本执行此操作,所以我需要按日期结帐! 为了测试目的,我什至尝试使用字符串语法 -900 天前 但我仍然得到最近的提交!请帮忙!

git checkout -b mynewbranch2 `git rev-list -n 1 --before="900 days ago" mynewbranch1`

更新感谢@LeGEC 此问题的原因是因为 rev-list 过滤器仅基于 CommitDate。虽然我的 AuthorDate 不同,因为我在 git commit 命令中使用 --date 选项明确设置了 dat。这可以通过 git log --format=fuller 命令看到。

AuthorDate: Thu May 9 16:13:47 2022 +0200
CommitDate: Wed May 11 13:48:07 2022 +0200

有一个已知的陷阱,其提交日期为:

一个提交实际上有 两个 日期:作者日期和提交者日期。

  • 当创建一个全新的提交时,它会将其作者日期和提交者日期设置为 now()
  • 对于 git commit --amendgit cherry-pickgit rebase 等命令,git 使用新的 committer/committer 日期创建新提交,但保留 author/author “复制”提交的日期。

不幸的是:git log默认显示的日期是作者日期,但--before/--after过滤器中使用的日期是提交者日期...

AFAIK,目前只有 git 之外的方法可以按作者日期过滤:例如,请参见这两个答案:


明确查看两个日期的快速方法是使用 git log --format=fuller.

或者使用 %ad%cd 编写自定义格式字符串:

git log --graph --format="%h author=%an %ad (committer=%cn %cd) %s"

您在评论中指定您是 re-creating 来自外部来源的提交。

在创建提交时,您还可以使用环境变量覆盖提交者:

GIT_AUTHOR_NAME=alex \
GIT_AUTHOR_EMAIL=alex@somewhere \
GIT_AUTHOR_DATE="2022-05-09 13:47:00" \
GIT_COMMITTER_NAME=alex \
GIT_COMMITTER_EMAIL=alex@somewhere \
GIT_COMMITTER_DATE="2022-05-09 13:47:00" \
git commit -m "..."

https://git-scm.com/docs/git-commit#_commit_information

如果您已经迁移了部分历史记录,则可以重写现有提交,例如使用 git rebase -x ...git-filter-repo (link to docs: check the CALLBACKS section)。


另外:我强烈建议您在 git 提交消息中添加一些内容(您以前的系统似乎有一些“事务 ID”?),以便更精确地匹配已迁移的提交。