如何按日期在Git结账?

Ami*_*ani 286 git git-checkout

我正在处理源代码中的回归.我想告诉Git:"根据参数化日期/时间检查来源".这可能吗?

我也在目前的观点中进行了改变,我不想失去.理想情况下,我想在当前源和我之前根据之前的日期感兴趣的某些版本之间来回切换.

And*_*ndy 336

保持当前的变化

你可以把你的工作藏起来,而不是随便做git stash.你会用git stash pop它来取回它.或者你可以(如carleeto所说)git commit它到一个单独的分支.

使用rev-parse按日期结帐

您可以使用以下方式在特定日期之前签出提交rev-parse:

git checkout 'master@{1979-02-26 18:30:00}'
Run Code Online (Sandbox Code Playgroud)

有关可用选项的更多详细信息,请参阅git-rev-parse.

如注释中所述,此方法使用reflog在历史记录中查找提交.默认情况下,这些条目在90天后过期.虽然使用reflog的语法不那么详细,但您只能回溯90天.

使用rev-list按日期结帐

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

git checkout `git rev-list -n 1 --first-parent --before="2009-07-27 13:37" master`
Run Code Online (Sandbox Code Playgroud)

如果您只想要您的历史记录而不是合并带来的版本,请注意--first-parent.这就是你通常想要的.

  • 注意:根据您的回程距离,这可能无效,因为它使用了reflog(在一段时间后过期).你会看到'警告:登录'master'只能回到......'.Rocky的解决方案始终有效.git checkout`git rev-list -n 1 --before ="2009-07-27 13:37"master` (13认同)
  • @Rocky:问题是参数需要用引号括起来,否则bash会分隔空格中的参数.试试`git co'master @ {2天前}'`. (7认同)
  • 我编辑了你的答案,因为反引号已被弃用且难以阅读.子壳`$(...)`是首选. (3认同)
  • @Andy 40 岁生日快乐,安迪!(假设这就是 1979-02-26 的意思:)) (3认同)
  • @Rocky你能告诉我们Rocky的更多细节吗?你在命令行上输入了什么,为什么你说它不起作用?您收到错误消息了吗? (2认同)

Roc*_*cky 114

安迪的解决方案对我不起作用.在这里我发现了另一种方式

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
Run Code Online (Sandbox Code Playgroud)

Git:按日期结帐

  • 当我执行上面的命令时,我收到 `error: unknown switch \`n'` 任何想法如何解决这个问题? (4认同)
  • 你应该使用“--max-count=1”而不是“-n 1” (2认同)
  • 这在 Windows 的 GIT 上根本不起作用!(GIT 版本 2.30.1)。看起来 rev-list 命令总是忽略任何此类输入命令行选项。:-\ (2认同)

Car*_*arl 14

看起来你需要一些基于这样的东西: 基于日期的Git结账

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

如果您不想丢失分阶段更改,最简单的方法是创建一个新分支并将它们提交到该分支.您始终可以在分支之间来回切换.

编辑:链接已关闭,所以这是命令:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
Run Code Online (Sandbox Code Playgroud)

  • 很棒的链接!所以`git checkout branch @ {date }`在reflog过期时停止工作,但你可以使用`git checkout \`git rev-list -n 1 --before ="2009-07-27 13:37"master \` `. (2认同)

Von*_*onC 11

提醒,自 Git 2.23(2019 年 8 月)起

在 2021/2022 年不要使用旧的、过时的和令人困惑的git checkout命令git switchgit restore准确描述他们正在做什么(仅使用 的分支git switch,并且仅使用 的文件git restore

不要使用``:更喜欢更现代的$(command substitution)语法而不是过时的反引号语法。


小智 10

对于那些喜欢管道来命令替换的人

git rev-list -n1 --before=2013-7-4 master | xargs git checkout
Run Code Online (Sandbox Code Playgroud)


Bar*_*zKP 9

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

git rev-list -1 --before="2012-01-15 12:00" master
Run Code Online (Sandbox Code Playgroud)

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

git checkout SHA
Run Code Online (Sandbox Code Playgroud)


Dio*_*lis 5

git rev-parse如果您感兴趣的日期提交日期,@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 }
)
Run Code Online (Sandbox Code Playgroud)

(如果您还想$1 >= "2016-04-12" && $2 >= "11:37"awk谓词中指定时间使用。)


Mur*_*dla 5

要从签出创建新分支,请使用 -b 选项和新分支名称。

git checkout -b 19July2021 `git rev-list -n1 --before=2021-7-19 master`
Run Code Online (Sandbox Code Playgroud)

git switch当您处于“分离头”状态时,您可以避免