我正在处理源代码中的回归。我想告诉Git:“根据参数化日期/时间检查来源”。这可能吗?
我也在目前的观点中进行了一些改变,我不想失去。理想情况下,我想在当前源和我之前根据之前的日期感兴趣的某个版本之间来回切换。
你可以用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。这就是你通常想要的。
安迪的解决方案对我不起作用。在这里我发现了另一种方式
git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
看起来你需要这样的东西:Git checkout based on date
换句话说,您使用rev-list
查找提交,然后使用checkout实际获取它。
如果您不想丢失已暂存的更改,最简单的方法是创建一个新分支并将其提交到该分支。您始终可以在分支之间来回切换。
编辑:链接已关闭,所以这是命令:
git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
对于那些喜欢管道来命令替换的人
git rev-list -n1 --before=2013-7-4 master | xargs git checkout
在我的情况下,-n 1
选项不起作用。在Windows上我发现以下命令序列工作正常:
git rev-list -1 --before="2012-01-15 12:00" master
这将返回给定日期的相应提交的SHA,然后:
git checkout SHA
进一步使用rev-list
选项,如果要查找从主分支到生产分支的最新合并提交(作为纯粹假设的示例):
git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`
我需要查找截至给定日期的生产服务器上的代码。这找到了我。
如果您感兴趣的日期是提交日期,@ 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"
。)
如果您希望能够在构建时返回到存储库的精确版本,则最好标记从中进行构建的提交。
其他答案提供了将存储库返回到某个时间段的分支中最近提交的技术 - 但它们可能并不总是足够。例如,如果您从分支构建,稍后删除分支,或者从稍后重新分支的分支构建,则您构建的提交可能会在任何当前分支的git中变得“无法访问”。当压缩存储库时,最终可能会删除git中无法访问的对象。
在提交上添加标记意味着它永远不会变得无法访问,无论您以后使用分支做什么(禁止删除标记)。
git rev-list -n 1 --before="2009-07-27 13:37" origin/master
取印刷的字符串(例如XXXX)并执行:
git checkout XXXX