I\'ve already looked at the relevant docs from git-scm.com and gitref.org, but I can\'t seem to figure this out.
Let\'s say I want to get all commits for Tuesday, N
I usually check my git log and see what I was working on a specific day and update my timesheet based on that, but it's a pain in the ass to type in the full date in ISO format so I just do it like this
git log --after=jun9 --before=jun10
and I add --author
to only print my commits
git log --since=jun9 --until=jun10 --author=Robert
This prints commits that happened on the last 9th of June (so for 2016 in this case and not for 2015 or 2014 and so on).
The --since/--after
and --until/--before
parameters can also take stuff like 3 days ago
, yesterday
, etc.
Nothing wrong with the accepted answer (which I upvoted), but... we're here for science!
The output below can be expanded/customised with pretty=format:<string>
placeholders:
git log --pretty='format:%H %an %ae %ai' | grep 2013-11-12
Not 100% immune to errors as the same string could have been entered by a user. But acceptable depending on which placeholders are used. The snippet above would not fail, for instance.
One could as well just parse the whole git log
to JSON
and consume/manipulate its data to one's heart content. Check https://github.com/dreamyguy/gitlogg out and never look back!
Disclaimer: that's one of my projects.
This script displays the available date range of commits for the current repo, then prompts for the date that you want to see commits from. It displays a short SHA and the full SHA, the author, the commit timestamp, and the comments in single quotes.
The script keeps prompting for dates until you press Enter or Control-D.
Mac users: requires gnu date.
#!/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
I called the script commitsOnDates
, and here it is in action. The first date I enter has no commits, so the response is just an empty line:
$ 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:
Thanks John Bartholomew!
The answer is to specify the time, e.g. git log --after="2013-11-12 00:00" --before="2013-11-12 23:59"
I made a git alias for that specific purpose:
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"
Usage:
git commitsAtDate 2017-08-18