我正在源代码中的回归工作。我想告诉Git:“根据参数化的日期/时间签出源代码”。这可能吗?

我目前的观点也有阶段性的变化,我不想失去这些变化。理想情况下,我希望在当前源文件和基于之前日期的某个我感兴趣的版本之间来回切换。


当前回答

在我的例子中,-n 1选项不起作用。在Windows上,我发现下面的命令序列工作得很好:

git rev-list -1 --before="2012-01-15 12:00" master

这将返回给定日期的适当提交的SHA,然后:

git checkout SHA

其他回答

如果你感兴趣的日期是提交的日期,@Andy提出的git rev-parse解决方案可以很好地工作。然而,如果你想根据作者的日期签出,rev-parse将不起作用,因为它没有提供使用该日期来选择提交的选项。相反,您可以使用以下方法。

git checkout $(
  git log --reverse --author-date-order --pretty=format:'%ai %H' master |
  awk '{hash = $4} $1 >= "2016-04-12" {print hash; exit 0 }
)

(如果你还想指定时间,在awk谓词中使用$1 >= "2016-04-12" && $2 >= "11:37")

进一步使用rev-list选项,如果你想找到最近的合并提交从你的主分支到你的生产分支(作为一个纯粹的假设的例子):

git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`

我需要找到特定日期的生产服务器上的代码。这为我找到了它。

在我的例子中,-n 1选项不起作用。在Windows上,我发现下面的命令序列工作得很好:

git rev-list -1 --before="2012-01-15 12:00" master

这将返回给定日期的适当提交的SHA,然后:

git checkout SHA

如果你达到reflog的限制,你只需要做一点改变(从其他笔记来看,你克隆回购的日期或90天的历史)

git checkout `git rev-list -1 --before="Jan 17 2020" HEAD`

你也可以用

git checkout `git rev-list -1 --before="Jan 17 2020 8:06 UTC-8" HEAD`

它会检查之前的提交与日期或你输入的日期-时间相关,看到你可以使用日期修饰符,我猜如果你不使用UTC+-N它只使用UTC时间。

看到我只把master改为HEAD,即使你没有reflog到你想要检查的日期,它似乎也能工作!!

安迪的解决办法对我没用。在这里,我找到了另一种方法:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

Git:按日期结帐