How can I show a git log output with (at least) this information:
* author
* commit date
* change
I want it compressed to one line per log entry. What's the shortest possible format for that?
(tried --format=oneline
but that does not show the date)
This question is related to
git
formatting
logging
git log --pretty=format:"%H %an %ad"
use --date=
to set a date format
git log --pretty=format:"%H %an %ad" --date=short
All aforementioned suggestions use %s
placeholder for subject. I'll recommend to use %B
because %s
formatting preserves new lines and multiple lines commit message appears squashed.
git log --pretty=format:"%h%x09%an%x09%ai%x09%B"
Try git log --pretty=fuller, it will show you:- Author: Author Date: Commit: Commit Date:
Hope this helps.
Use predefined git alias, i.e.:
$ git work
Created once by command:
$ git config --global alias.work 'log --pretty=format:"%h%x09%an%x09%ad%x09%s"'
https://git-scm.com/book/tr/v2/Git-Basics-Git-Aliases
Or more colored with graph:
$ git config --global alias.work 'log --pretty=format:"%C(yellow)%h %ar %C(auto)%d %Creset %s , %Cblue%cn" --graph --all'
git --no-pager log --pretty=tformat:"%C(yellow)%h %C(cyan)%ad %Cblue%an%C(auto)%d %Creset%s" --graph --date=format:"%Y-%m-%d %H:%M" -25
I use alias
alias gitlog='git --no-pager log --pretty=tformat:"%C(yellow)%h %C(cyan)%ad %Cblue%an%C(auto)%d %Creset%s" --graph --date=format:"%Y-%m-%d %H:%M" -25'
Differences: I use tformat and isodate without seconds and time zones , with --no-pager you will see colors
Note the -10
at the end, to show only the last 10 entries.
Use predefined git alias (hs
- short for history):
git hs
Created once by command:
git config --global alias.hs "log --pretty='%C(yellow)%h %C(cyan)%ad %Cblue%aN%C(auto)%d %Creset%s' --date=relative --date-order --graph"
%h
= abbreviated commit hash
%ad
= author date (format respects --date= option, so you can adjust it later)
%aN
= author name (respecting .mailmap)
%d
= ref names
%s
= subject
tig is a possible alternative to using the git log command, available on the major open source *nix distributions.
On debian or ubuntu try installing and running as follows:
$ sudo apt-get install tig
For mac users, brew to the rescue :
$ brew install tig
(tig gets installed)
$ tig
(log is displayed in pager as follows, with current commit's hash displayed at the bottom)
2010-03-17 01:07 ndesigner changes to sponsors list
2010-03-17 00:19 rcoder Raise 404 when an invalid year is specified.
2010-03-17 00:06 rcoder Sponsors page now shows sponsors' level.
-------------------------- skip some lines ---------------------------------
[main] 531f35e925f53adeb2146dcfc9c6a6ef24e93619 - commit 1 of 32 (100%)
Since markdown doesn't support text coloring, imagine: column 1: blue; column 2: green; column 3: default text color. Last line, highlighted. Hit Q or q to exit.
tig
justifies the columns without ragged edges, which an ascii tab (%x09) doesn't guarantee.
For a short date format hit capital D (note: lowercase d opens a diff view.) Configure it permanently by adding show-date = short
to ~/.tigrc; or in a [tig]
section in .git/configure or ~/.gitconfig.
To see an entire change:
Since tig is separate from git and apparently *nix specific, it probably requires cygwin to install on windows. But for fedora I believe the install commands are $ su
, (enter root password)
, # yum install tig
. For freebsd try % su
, (enter root password)
, # pkg_add -r tig
.
By the way, tig is good for a lot more than a quick view of the log: Screenshots & Manual
git log --pretty=format:'%h %ad %s%x09%ae' --date=short
Result:
e17bae5 2011-09-30 Integrate from development -> main [email protected]
eaead2c 2011-09-30 More stuff that is not worth mentioning [email protected]
eb6a336 2011-09-22 Merge branch 'freebase' into development [email protected]
Constant-width stuff is first. The least important part -- the email domain -- is last and easy to filter.
Run this in project folder:
$ git log --pretty=format:"%C(yellow)%h %ar %C(auto)%d %Creset %s , %Cblue%cn" --graph --all
And if you like, add this line to your ~/.gitconfig:
[alias]
...
list = log --pretty=format:\"%C(yellow)%h %ar %C(auto)%d %Creset %s, %Cblue%cn\" --graph --all
I use these two .gitconfig settings:
[log]
date = relative
[format]
pretty = format:%h %Cblue%ad%Creset %ae %Cgreen%s%Creset
%ad is the author date, which can be overidden by --date
or the option specified in the [log] stanza in .gitconfig.
I like the relative date because it gives an immediate feeling of when stuff was comitted.
Output looks like this:
6c3e1a2 2 hours ago [email protected] lsof is a dependency now.
0754f18 11 hours ago [email protected] Properly unmount, so detaching works.
336a3ac 13 hours ago [email protected] Show ami registration command if auto register fails
be2ad45 17 hours ago [email protected] Fixes #6. Sao Paolo region is included as well.
5aed68e 17 hours ago [email protected] Shorten while loops
This is all of course in color, so it is easy to distinguish the various parts of a log line.
Also it is the default when typing git log
because of the [format] section.
2014 UPDATE: Since git now supports padding I have a nice amendment to the version above:
pretty = format:%C(yellow)%h %Cblue%>(12)%ad %Cgreen%<(7)%aN%Cred%d %Creset%s
This right aligns the relative dates and left aligns committer names, meaning you get a column-like look that is easy on the eyes.
Screenshot2016 UPDATE: Since GPG commit signing is becoming a thing, I thought I'd update this post with a version that includes signature verification (in the screenshot it's the magenta letter right after the commit). A short explanation of the flag:
%G?: show "G" for a good (valid) signature, "B" for a bad signature, "U" for a good signature with unknown validity and "N" for no signature
Other changes include:
git log -g
now contains the reflog selector.3 years, 4..
)%<(7,trunc)
or check out the git .mailmap feature to shorten commiter names)Here's the config:
pretty = format:%C(auto,yellow)%h%C(auto,magenta)% G? %C(auto,blue)%>(12,trunc)%ad %C(auto,green)%<(7,trunc)%aN%C(auto,reset)%s%C(auto,red)% gD% D
All in all column alignment is now preserved a lot better at the expense of some (hopefully) useless characters. Feel free to edit if you have any improvements, I'd love to make the message color depend on whether a commit is signed, but it doesn't seem like that is possible atm.
Screenshotgit log --pretty=format:'%h %ad %s (%an)' --date=short
or
git log --pretty=format:'%h %ad %s | %an' --date=short
...riffing on cdunn2001's answer above: I'd lose the author's e=mail and include just the author's name, as per Jesper and knittl, but in keeping with cdunn2001's idea of maintaining output in columns of constant width for ease of reading (great idea!). In lieu of a separate left justified column for author name, however, I wrap that flag at the end of the command with a parentheses or offset it with a pipe. (Could really be any character that serves as a visual aid in reading the output...albeit might make sense to avoid back or forward slashes in order to reduce confusing the output with a directory or something.)
Sample output:
6fdd155 2015-08-10 Fixes casting error in doSave | John Doe
c4f4032 2015-08-10 Fix for IE save. Add help button. | Jane
29a24a6 2015-08-10 Fixes bug in Course | Mac
To show the commits I have staged that are ready to push I do
git log remotes/trunk~4..HEAD --pretty=format:"%C(yellow)%h%C(white) %ad %aN%x09%d%x09%s" --date=short | awk -F'\t' '{gsub(/[, ]/,"",$2);gsub(/HEAD/, "\033[1;36mH\033[00m",$2);gsub(/master/, "\033[1;32mm\033[00m",$2);gsub(/trunk/, "\033[1;31mt\033[00m",$2);print $1 "\t" gensub(/([\(\)])/, "\033[0;33m\\1\033[00m","g",$2) $3}' | less -eiFRXS
The output looks something like:
ef87da7 2013-01-17 haslers (Hm)Fix NPE in Frobble
8f6d80f 2013-01-17 haslers Refactor Frobble
815813b 2013-01-17 haslers (t)Add Wibble to Frobble
3616373 2013-01-17 haslers Add Foo to Frobble
3b5ccf0 2013-01-17 haslers Add Bar to Frobble
a1db9ef 2013-01-17 haslers Add Frobble Widget
Where the first column appears in yellow, and the 'H' 'm' and 't' in parentesis show the HEAD, master and trunk and appear in their usual "--decorate" colors
Here it is with line breaks so you can see what it's doing:
git log remotes/trunk~4..HEAD --date=short
--pretty=format:"%C(yellow)%h%C(white) %ad %aN%x09%d%x09%s"
| awk -F'\t' '{
gsub(/[, ]/,"",$2);
gsub(/HEAD/, "\033[1;36mH\033[00m",$2);
gsub(/master/, "\033[1;32mm\033[00m",$2);
gsub(/trunk/, "\033[1;31mt\033[00m",$2);
print $1 "\t" gensub(/([\(\)])/, "\033[0;33m\\1\033[00m","g",$2) $3}'
I have aliased to "staged" with:
git config alias.staged '!git log remotes/trunk~4..HEAD --date=short --pretty=format:"%C(yellow)%h%C(white) %ad %aN%x09%d%x09%s" | awk -F"\t" "{gsub(/[, ]/,\"\",\$2);gsub(/HEAD/, \"\033[1;36mH\033[00m\",\$2);gsub(/master/, \"\033[1;32mm\033[00m\",\$2);gsub(/trunk/, \"\033[1;31mt\033[00m\",\$2);print \$1 \"\t\" gensub(/([\(\)])/, \"\033[0;33m\\\\\1\033[00m\",\"g\",\$2) \$3}"'
(Is there an easier way to escape that? it was a bit tricky to work out what needed escaping)
Source: Stackoverflow.com