Answers:
您可以使用保留工作,而无需提交git stash
。您会习惯于git stash pop
将其取回。或者,您可以(如carleeto所说)将git commit
其转移到另一个分支。
您可以使用以下命令在特定日期之前签出提交rev-parse
:
git checkout 'master@{1979-02-26 18:30:00}'
有关可用选项的更多详细信息,请参见git-rev-parse
。
如评论中所述,此方法使用reflog在历史记录中查找提交。默认情况下,这些条目在90天后过期。尽管使用reflog的语法不太冗长,但您只能追溯到90天。
另一个不使用reflog的选项是用于通过以下rev-list
方式在特定时间点获取提交:
git checkout `git rev-list -n 1 --first-parent --before="2009-07-27 13:37" master`
如果只想要历史记录,而不想要合并带来的版本,请注意--first-parent。那就是你通常想要的。
git co 'master@{2 days ago}'
。
git rev-list -n 1 --before="2009-07-27 13:37" master
$(...)
是首选。
看来您需要以下内容: 基于日期的Git结帐
换句话说,您可以rev-list
先查找提交,然后使用checkout实际获取它。
如果不想丢失分阶段的更改,最简单的方法是创建一个新分支并将其提交到该分支。您始终可以在分支之间来回切换。
编辑:链接已关闭,所以这是命令:
git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
git checkout branch@{date}
,当reflog过期时,它将停止工作,但是您可以使用git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
。
git rev-parse
如果您感兴趣的日期是提交的date,则@Andy提出的解决方案可以很好地工作。但是,如果您要基于作者的日期签出,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 }
)
(如果您还想$1 >= "2016-04-12" && $2 >= "11:37"
在awk谓词中指定时间使用。)
如果您希望在执行构建时能够返回到存储库的精确版本,则最好标记进行构建的提交。
其他答案提供了一些技术,可以使存储库恢复到某个时间的某个分支中的最新提交-但它们可能并不总是足够的。例如,如果您从分支构建,然后删除该分支,或者从后来重新建立基础的分支构建,则您构建的提交可能会在git中从任何当前分支变为“不可访问”。压缩存储库后,最终可能会删除git中无法访问的对象。
在提交上放置标签意味着无论以后对分支做什么(除非删除标签),它都永远不会变得无法访问。
git rev-list -n 1 --before="2009-07-27 13:37" origin/master
取出打印的字符串(例如XXXX)并执行以下操作:
git checkout XXXX
git bisect good
要点。