我正在源代码中的回归工作。我想告诉Git:“根据参数化的日期/时间签出源代码”。这可能吗?
我目前的观点也有阶段性的变化,我不想失去这些变化。理想情况下,我希望在当前源文件和基于之前日期的某个我感兴趣的版本之间来回切换。
我正在源代码中的回归工作。我想告诉Git:“根据参数化的日期/时间签出源代码”。这可能吗?
我目前的观点也有阶段性的变化,我不想失去这些变化。理想情况下,我希望在当前源文件和基于之前日期的某个我感兴趣的版本之间来回切换。
当前回答
如果你达到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,即使你没有reflog到你想要检查的日期,它似乎也能工作!!
其他回答
进一步使用rev-list选项,如果你想找到最近的合并提交从你的主分支到你的生产分支(作为一个纯粹的假设的例子):
git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`
我需要找到特定日期的生产服务器上的代码。这为我找到了它。
git rev-list -n 1 --before="2009-07-27 13:37" origin/master
取打印出来的字符串(例如XXXX),然后做:
git checkout XXXX
如果你达到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,即使你没有reflog到你想要检查的日期,它似乎也能工作!!
下面是我用来按相对时间签出的别名版本:
[alias]
parsedate = "!set -x ;arg1=\"$1\" && shift && which gdate &> /dev/null && gdate -d \"$arg1\" || date -d \"$arg1\""
codate = "!d=\"$(git parsedate \"$1\")\" && shift && git checkout \"$(git rev-list -n1 --first-parent --before=\"$d\" HEAD)\""
这允许您使用以下命令将2个月前的更改检出到名为test的新分支中:
git codate '2 months ago' -b test
这不会工作在一个浅克隆,所以不浅它首先与:
git fetch --unshallow
如果你得到一个非浅错误,你可能会从git fatal: error in object: unshallow中找到帮助
需要GNU coreutils,并使用brew在Linux和macOS上工作。
使用brew Install coreutils在macos上安装。
如果希望在特定日期签出单个文件,可以将文件路径传递给两个命令。
git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master FILEPATH` FILEPATH