按date结账

我正在处理源代码中的回归。 我想告诉git:“根据参数化date/时间检出源”。 这可能吗? 我目前的观点也发生了变化,我不想失去。 理想情况下,我想在当前源和我感兴趣的某个版本之间根据以前的date来回切换。

保持你目前的变化

你可以保留你的工作,而不用提交,用git stash 。 你会比使用git stash pop回来。 或者,你可以(如carleeto所说)把它交给一个单独的分支。

使用rev-parse按date结帐

您可以使用rev-parse检查特定date的提交,如下所示:

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

有关可用选项的更多细节可以在git-rev-parse

如注释中所述,此方法使用reflog在您的历史logging中查找提交。 默认情况下,这些条目在90天后过期 。 尽pipe使用reflog的语法不太详细,但是只能回溯90天。

使用rev-list按date结帐

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

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

安迪的解决scheme不适合我。 在这里我find了另一种方式

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

Git:按date结账

看起来你需要一些东西: 基于date的Git结帐

换句话说,您使用rev-list来查找提交,然后使用checkout来实际获取它。

如果你不想失去你的阶段性变化,最简单的事情就是创build一个新的分支并将它们提交给那个分支。 你总是可以在分支之间来回切换。

编辑:链接closures,所以这里是命令:

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

对那些喜欢用pipe道来replace的人来说

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

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

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

我需要find生产服务器上给定date的代码。 这为我find了。

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

git rev-list -1 –before =“2012-01-15 12:00”主人

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

git checkout SHA

如果你感兴趣的date提交date ,@Andy提出的git rev-parse解决scheme可以正常工作。 但是,如果您想基于作者的date结账,则rev-parse将不起作用,因为它不提供使用该date来select提交的选项。 相反,您可以使用以下内容。

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" )。

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

其他答案提供了一些技术,可以在某个特定时间将存储库返回到分支中最近的提交 – 但它们可能并不总是足够的。 例如,如果你从一个分支构build,然后删除这个分支,或者从一个稍后被重新分支的分支构build,那么你从那个分支构build的提交可能会在git中变得“不可达”。 在压缩存储库时,最终可能会删除git中无法访问的对象。

在提交上添加一个标签意味着它永远不会变得无法访问,不pipe你以后如何处理分支(禁止删除标签)。

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

拿打印的string(例如XXXX),然后:

 git checkout XXXX