我正在处理源代码中的回归。我想告诉Git:“根据参数化日期/时间检查来源”。这可能吗?
我目前的观点中也有我不想丢失的变化。理想情况下,我想在当前的源代码之间来回切换,以及我之前根据之前的日期感兴趣的一些版本。
答案 0 :(得分:306)
您可以使用git stash
将您的工作隐藏起来,而无需提交。您
不如使用git stash pop
来取回它。或者你可以(如 carleeto 所说)git commit
将它发送到一个单独的分支。
您可以使用rev-parse
按特定日期签出提交,如下所示:
git checkout 'master@{1979-02-26 18:30:00}'
有关可用选项的更多详细信息,请参阅git-rev-parse
。
如评论中所述,此方法使用reflog查找历史记录中的提交。默认情况下,这些条目为expire after 90 days。虽然使用reflog的语法不那么详细,但您只能回溯90天。
另一个不使用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`
答案 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,即使您没有对要检查的日期进行更新,它似乎也能正常工作!!!