如何按日期在Git结账?

时间:2011-08-09 01:29:04

标签: git git-checkout

我正在处理源代码中的回归。我想告诉Git:“根据参数化日期/时间检查来源”。这可能吗?

我目前的观点中也有我不想丢失的变化。理想情况下,我想在当前的源代码之间来回切换,以及我之前根据之前的日期感兴趣的一些版本。

10 个答案:

答案 0 :(得分:306)

保持当前的更改

您可以使用git stash将您的工作隐藏起来,而无需提交。您 不如使用git stash pop来取回它。或者你可以(如 carleeto 所说)git commit将它发送到一个单独的分支。

使用rev-parse

按日期结帐

您可以使用rev-parse按特定日期签出提交,如下所示:

git checkout 'master@{1979-02-26 18:30:00}'

有关可用选项的更多详细信息,请参阅git-rev-parse

如评论中所述,此方法使用reflog查找历史记录中的提交。默认情况下,这些条目为expire after 90 days。虽然使用reflog的语法不那么详细,但您只能回溯90天。

使用rev-list

按日期结帐

另一个不使用reflog的选项是使用rev-list来获取特定时间点的提交:

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

如果您只想要您的历史记录而不是合并带来的版本,请注意 - first-parent 。这就是你通常想要的。

答案 1 :(得分:107)

安迪的解决方案对我不起作用。在这里,我找到了另一种方式:

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

Git: checkout by date

答案 2 :(得分:14)

看起来你需要这样的东西: Git checkout based on date

换句话说,您使用rev-list查找提交,然后使用checkout 实际上得到它。

如果您不想丢失分阶段的更改,最简单的方法就是 创建一个新分支并将它们提交到该分支。您可以随时切换回来 分支机构之间。

编辑:链接已关闭,所以这是命令:

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

答案 3 :(得分:9)

对那些喜欢管道命令替换的人

git rev-list -n1 --before=2013-7-4 master | xargs git checkout

答案 4 :(得分:8)

在我的情况下,-n 1选项不起作用。在Windows上我发现以下命令序列工作正常:

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

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

git checkout SHA

答案 5 :(得分:3)

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

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

我需要查找截至给定日期的生产服务器上的代码。这找到了我。

答案 6 :(得分:3)

如果你感兴趣的日期是提交的日期,@ 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"。)

答案 7 :(得分:2)

如果您希望能够在构建时返回到存储库的精确版本,则最好标记从中进行构建的提交。

其他答案提供了将存储库返回到特定时间内分支中最近提交的技术 - 但它们可能并不总是足够。例如,如果您从分支构建,稍后删除分支,或者从稍后重新分支的分支构建,则您构建的提交可能会在任何当前分支的git中变得“无法访问”。在压缩存储库时,最终可能会删除git中无法访问的对象。

在提交上加上标记意味着它永远不会变得无法访问,无论你以后使用分支做什么(除非删除标记)。

答案 8 :(得分:1)

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

取印刷的字符串(例如XXXX)并执行:

git checkout XXXX

答案 9 :(得分:0)

如果您达到了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,即使您没有对要检查的日期进行更新,它似乎也能正常工作!!!