根据日期检查来自 git 的旧提交

Checkout old commit from git based on date

由于与另一个项目(共享此代码)不兼容,我正在尝试从 git 检索旧提交。 git 存储库是 OpenZWave。

我在 SO 上发现 post 说要发出命令:

git checkout @{14.days.ago}

但这会导致:

warning: Log for '' only goes back to Wed, 23 May 2018 08:02:05 -0400.
HEAD is now at 77a05ed... Update hs-ms100plus.xml

我不知道出了什么问题 - 显然有比今天日期更早的提交。这个命令有什么问题? (该命令是否会导致我的克隆被 14 天前的代码替换)

为什么没有成功?

git checkout @{14.days.ago} 尝试根据 reflog(过去 HEAD 指向的所有提交的记录)在给定时间恢复 特定存储库 的本地状态。如果这是一个新的克隆,它将无法工作。

所以,好的语法将不起作用,您需要找到一些一年前完成的提交,并通过哈希检查它。怎么做?

如何查找一年前提交的提交?

我会尝试在 gitk 中找到合适的提交,在大多数情况下滚动浏览一年的提交应该不是问题。但是,您也可以像这样 grep 日志:

git log --date=iso | grep -C3 2017-05-

或者,如果您知道在特定日期提交了提交,如下所示:

git log --date=iso | grep -C3 2017-05-23

简短说明:

  • --date=iso 确保日期以易于 greppable 的方式显示。
  • -C3 选项使 grep 包括上下相邻的 3 行,这样对于每次提交,我们都会捕获带有哈希的行和提交消息的第一行。

语法 @{XXX.days.ago} 指的是 reflog,除了显示的历史之外,Git 保存的本地历史。 git log。因此,@{14.days.ago} 表示 "where HEAD pointed to 14 days ago on this repository, on my computer",而不是 "the commit made 14 days ago"(这可能是在另一台计算机上的另一个存储库中创建的)。

您可以改为:

  • 获取提交 ID,例如
git log --before 14.days.ago -1
  • 检查此提交:
git checkout