如何查看特定日期的所有提交?

254

我已经查看了来自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 的组合,但仍然找不到答案。而且我也不明白这些选项是包含还是排除的,因为如果两个日期不同,则它们似乎是包含的,但如果它们在同一天,则是排除的。我错过了什么吗?我做错了什么?


11
我发现git的since/after/until/before处理方式非常奇怪,所以我不知道答案,但是你尝试过指定日期+时间吗(例如,--since="2013-11-12 00:00")?此外,你的提交中是否存在不同的committer和author日期? - John Bartholomew
你明白了!指定工作时间。我甚至没有想到尝试使用时间。谢谢!至于提交者与作者日期 - 在那些日期中没有应用补丁,所以那不是原因。 - 3cheesewheel
我认为 'git log --boundary' 应该可以为您完成此操作,这样 'git log --boundary --after="2013-11-12" --before="2013-11-12"' 就会显示一个提交记录(就像您想的那样 :) )。 - qneill
5个回答

336

17
不错。然而,那个命令将省略在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" & 也可以使用。 - HelloGoodbye
8
在git 2.13.0版本中,使用命令git log --after="2017-07-25" --before="2017-07-26"可以为我提供有效的结果。 - powlo
3
这是针对当前检出的分支吗?如何查看所有分支? - nawfal
这是正确的答案,但我仍然感到困惑,并发布了这个后续问题:https://stackoverflow.com/questions/59691065/what-does-git-log-since-until-do-when-there-is-no-hhmmss-supplied-in-the-v - bgoodr
如果我也能得到计数,那就太好了。 - Ed_

47

通常我会检查我的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天前昨天等内容。


只是不起作用,没有输出。我有什么遗漏吗?我应该指定一个分支吗? - Aurimas
1
@Aurimas,嗯,不确定你那边出了什么问题。如果你的“since”和“until”值不正确,那肯定就没有输出了。首先使用“git log”,并尝试根据所看到的内容选择“since”和“until”值。不需要任何分支或特殊内容。不确定从哪个Git版本开始提供此功能。确保你也有最新版本。 - Kohányi Róbert
10
我必须使用空格:git log --after="五月2日" --before="五月3日" - Connor Clark

23

接受的答案没有问题(我已经点赞了),但是...我们在这里是为了科学!

下面的输出可以使用pretty=format:<string> 占位符进行扩展/自定义:

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

并非100%免于错误,因为用户可能输入相同的字符串。 但根据使用的占位符而言是可以接受的。例如,上面的代码片段不会失败。

也可以将整个git log解析为JSON,并消耗/操作其数据,以满足自己的需求。看看https://github.com/dreamyguy/gitlogg,永不回头!

免责声明:那是我的一个项目。


19

我为了那个特定的目的创建了一个git别名

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

这将产生一个易于扫描的输出:

screenshot of four commits at a specific date by the author


4
你也可以使用相对日期来指定此别名,例如 git commitsAtDate yesterday2 days ago 等。 - voiger
你也可以完全省略日期来获取今天的提交记录,例如 git commitsAtDate。很棒! - Mr_Chimp

-2

此脚本显示当前存储库的可用提交日期范围,然后提示您要查看提交的日期。它显示短SHA和完整SHA、作者、提交时间戳以及单引号中的注释。

该脚本会持续提示输入日期,直到按下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:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接