【问题标题】:How do I view all commits for a specific day?如何查看特定日期的所有提交?
【发布时间】:2013-11-28 00:30:13
【问题描述】:

我已经查看了来自 git-scm.comgitref.org 的相关文档,但我似乎无法弄清楚这一点。

假设我想要获取 2013 年 11 月 12 日星期二的所有提交。以现有的 repo 为例,我知道我在那天有提交,以及前一天和当天的提交后。

使用2013-11-112013-11-12

以下所有内容都为我提供了 11 月 11 日和 12 日的提交:

  • git log --after="2013-11-11" --until="2013-11-12"
  • git log --since="2013-11-11" --until="2013-11-12"
  • git log --after="2013-11-11" --before="2013-11-12"
  • git log --since="2013-11-11" --before="2013-11-12"

仅限2013-11-12

以下所有内容都没有提交:

  • git log --since="2013-11-12" --until="2013-11-12"
  • git log --since="2013-11-12" --before="2013-11-12"
  • git log --after="2013-11-12" --until="2013-11-12"
  • git log --after="2013-11-12" --before="2013-11-12"

使用2013-11-122013-11-13

正如预期的那样(根据上面 2013-11-112013-11-12 的结果),以下所有内容都给出了 11 月 12 日和 13 日的结果:

  • git log --since="2013-11-12" --before="2013-11-13"
  • git log --after="2013-11-12" --before="2013-11-13"
  • git log --since="2013-11-12" --until="2013-11-13"
  • git log --after="2013-11-12" --before="2013-11-13"

...等等等等。我觉得我已经尝试了sinceafterbeforeuntil 的所有可能组合,但仍然找不到答案,我也不明白这些选项是包容性的还是排斥性的,因为它们如果两个日期不同,则似乎具有包容性,但如果它们在同一天,则具有排斥性。我错过了什么/我做错了什么?!

【问题讨论】:

  • 我发现 git 的since/after/until/before 自己处理很奇怪,所以我不知道答案,但是您是否尝试过指定日期+时间(例如,--since=" 2013-11-12 00:00")?另外,您的(任何)提交是否有不同的提交者和作者日期?
  • 你明白了!指定工作时间。我什至没有想过要花时间尝试一下。谢谢!至于提交者与作者的日期——在这些日期期间没有应用补丁,所以不是这样。
  • 在我看来 'git log --boundary' 应该为你做这件事,所以 'git log --boundary --after="2013-11-12" --before="2013 -11-12"' 将仅显示一个提交(您认为它会的那个 :))。

标签: git git-log


【解决方案1】:

我为此创建了一个git alias

commitsAtDate = "!f() { git log --pretty='format:%C(yellow)%h %G? %ad%Cred%d %Creset%s%C(cyan) [%cn]' --decorate --after=\"$1 0:00\" --before=\"$1 23:59\" --author \"`git config user.name`\"; }; f"

用法:

git commitsAtDate 2017-08-18

【讨论】:

  • 您也可以指定此别名的相对日期,即git commitsAtDate yesterday2 days ago等。
【解决方案2】:

此脚本显示当前 repo 的可用提交日期范围,然后提示您输入要查看提交的日期。它显示短 SHA 和完整 SHA、作者、提交时间戳和单引号中的 cmets。

脚本会一直提示输入日期,直到您按 Enter 或 Control-D。

Mac 用户:需要 gnu 日期。

#!/bin/bash

COMMITS=`git log --abbrev-commit --pretty="format:%h %H %ai" | sort -k3 -k4`
FIRST=`echo "$COMMITS" | head -n 1`
LAST=`echo "$COMMITS" | tail -n 1`
echo "First commit: $FIRST"
echo "Last commit: $LAST"
printf "Date to search for commits: "
read DATE
while [[ "$DATE" ]]; do
  NEXT_DATE=`date +%Y-%m-%d -d "$DATE +1 day"`
  #echo "Searching for commits from $DATE to $NEXT_DATE"
  echo `git log --after="$DATE" --before="$NEXT_DATE" --pretty="format:%h %H %an %ci '%s'"`
  printf "\nDate to search for commits: "
  read DATE
done

我将脚本称为commitsOnDates,它正在运行。我输入的第一个日期没有提交,所以响应只是一个空行:

$ commitsOnDates
First commit: 375bcfb 375bcfbbf548134a4e34c36e3f28d87c53b2445f 2015-08-03 13:37:16 -0700
Last commit: 1d4c88c 1d4c88ce6a15efaceda1d653eed3346fcae8f5e6 2018-10-13 21:32:27 -0700
Date to search for commits: 2015-08-13


Date to search for commits: 2015-08-03
375bcfb 375bcfbbf548134a4e34c36e3f28d87c53b2445f Mike Slinn 2015-08-03 13:37:16 -0700 'this is a comment'

Date to search for commits: 2018-10-13
1d4c88c 1d4c88ce6a15efaceda1d653eed3346fcae8f5e6 Mike Slinn 2018-10-13 21:32:27 -0700 'a comment' 64d6e16 64d6e16338657b82c91ac94bea8ebf7b80dc4c28 Mike Slinn 2018-10-13 18:28:41 -0700 'nother comment' d5eb26e d5eb26e49fc9dceee9b9f5a2d8fa052bff2cfbbc Mike Slinn 2018-10-13 18:16:20 -0700 'no comment' d8a4992 d8a4992df208ba5efb50728311820bdad5ba5332 Mike Slinn 2018-10-13 12:02:00 -0700 'commented'

Date to search for commits:

【讨论】:

    【解决方案3】:

    Thanks John Bartholomew!

    答案是指定时间,例如git log --after="2013-11-12 00:00" --before="2013-11-12 23:59"

    【讨论】:

    • 不错。但是,该命令将省略第二天 23:59 到 00:00 之间的提交,因此 git log --after="2013-11-12 00:00" --before="2013-11-13 00:00" 更好。如果您安装了 gitk,我相信 gitk --since="2013-11-12 00:00" --until="2013-11-13 00:00" & 也可以使用。
    • 在 git 2.13.0. git log --after="2017-07-25" --before="2017-07-26" 为我提供了有效的结果。
    • 这是当前签出的分支吗?如何查看所有分支?
    • 这是正确的答案,但我仍然对此感到困惑并发布了这个后续问题:stackoverflow.com/questions/59691065/…
    • 如果我也数数会很好
    【解决方案4】:

    我通常会检查我的 git 日志并查看我在特定日期的工作并基于此更新我的时间表,但是以 ISO 格式输入完整日期很麻烦,所以我只是这样做

    git log --after=jun9 --before=jun10
    

    我添加 --author 只打印我的提交

    git log --since=jun9 --until=jun10 --author=Robert 
    

    这会打印 6 月 9 日最后发生的提交(在这种情况下是 2016 年,而不是 2015 年或 2014 年等等)。

    --since/--after--until/--before 参数也可以采用 3 days agoyesterday 等内容。

    【讨论】:

    • 根本不起作用,什么也不输出。我错过了什么吗?我应该指定一个分支吗?
    • @Aurimas 好吧,不知道你到底出了什么问题。如果您的 sinceuntil 值不正确,您肯定不会得到任何输出。首先使用git log,然后尝试根据您所看到的选择sinceuntil 值。没有分支或任何特殊要求。不确定该功能从哪个 Git 版本可用。确保您也有最新版本。
    • 我必须使用空格:git log --after="may 2" --before="may 3"
    【解决方案5】:

    接受的答案没有错(我赞成),但是……我们是为了科学而来的!

    下面的输出可以用pretty=format:<string>placeholders扩展/自定义:

    git log --pretty='format:%H %an %ae %ai' | grep 2013-11-12
    

    不能 100% 避免错误,因为用户可能输入了相同的字符串。 但可以接受,具体取决于使用的占位符。例如,上面的 sn-p 不会失败。

    人们也可以将整个git log 解析为JSON 并根据自己的内心内容消费/操作其数据。检查https://github.com/dreamyguy/gitlogg,永不回头!

    免责声明:这是我的项目之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 2013-11-15
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2021-12-31
      • 2012-02-21
      • 1970-01-01
      相关资源
      最近更新 更多