I want to tweak the default output of git reflog
, but I first need the format string to reproduce the default output. Specifically, I'm having trouble with the coloring of the different refnames:
Can someone more knowledgable with Git help me out?
By default, the reflog expiration date is set to 90 days. An expire time can be specified by passing a command line argument --expire=time to git reflog expire or by setting a git configuration name of gc. reflogExpire .
The "show" subcommand (which is also the default, in the absence of any subcommands) shows the log of the reference provided in the command-line (or HEAD , by default). The reflog covers all recent actions, and in addition the HEAD reflog records branch switching.
Under --pretty=oneline , the commit message is prefixed with this information on the same line. This option cannot be combined with --reverse . See also git-reflog[1]. Under --pretty=reference , this information will not be shown at all.
The default format string for reflog
is something like this:
git reflog --format='%C(auto)%h %gd: %gs (%s)'
Colors can be modified with %C
. For example, to change the initial yellow to magenta:
git reflog --format='%C(magenta)%h%C(reset) %gd: %gs (%s)'
Note that %C(reset)
is absolutely necessary because coloring is achieved using ANSI escape sequences
and they must be correctly terminated. If you're curios look into color.h
in git
code to see how these sequences look like.
For all possible format strings see format:<string>
in man git-log
:
· format:<string> The format:<string> format allows you to specify which information you want to show. It works a little bit like printf format, with the notable exception that you get a newline with %n instead of \n. E.g, format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" would show something like this: The author of fe6e0ee was Junio C Hamano, 23 hours ago The title was >>t4119: test autocomputing -p<n> for traditional diff input.<< The placeholders are: · %H: commit hash · %h: abbreviated commit hash · %T: tree hash · %t: abbreviated tree hash · %P: parent hashes · %p: abbreviated parent hashes · %an: author name · %aN: author name (respecting .mailmap, see git-shortlog(1) or git-blame(1)) · %ae: author email · %aE: author email (respecting .mailmap, see git-shortlog(1) or git-blame(1)) · %ad: author date (format respects --date= option) · %aD: author date, RFC2822 style · %ar: author date, relative · %at: author date, UNIX timestamp · %ai: author date, ISO 8601-like format · %aI: author date, strict ISO 8601 format · %cn: committer name · %cN: committer name (respecting .mailmap, see git-shortlog(1) or git-blame(1)) · %ce: committer email · %cE: committer email (respecting .mailmap, see git-shortlog(1) or git-blame(1)) · %cd: committer date (format respects --date= option) · %cD: committer date, RFC2822 style · %cr: committer date, relative · %ct: committer date, UNIX timestamp · %ci: committer date, ISO 8601-like format · %cI: committer date, strict ISO 8601 format · %d: ref names, like the --decorate option of git-log(1) · %D: ref names without the " (", ")" wrapping. · %e: encoding · %s: subject · %f: sanitized subject line, suitable for a filename · %b: body · %B: raw body (unwrapped subject and body) · %N: commit notes · %GG: raw verification message from GPG for a signed commit · %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 · %GS: show the name of the signer for a signed commit · %GK: show the key used to sign a signed commit · %gD: reflog selector, e.g., refs/stash@{1} · %gd: shortened reflog selector, e.g., stash@{1} · %gn: reflog identity name · %gN: reflog identity name (respecting .mailmap, see git-shortlog(1) or git-blame(1)) · %ge: reflog identity email · %gE: reflog identity email (respecting .mailmap, see git-shortlog(1) or git-blame(1)) · %gs: reflog subject · %Cred: switch color to red · %Cgreen: switch color to green · %Cblue: switch color to blue · %Creset: reset color · %C(...): color specification, as described in color.branch.* config option; adding auto, at the beginning will emit color only when colors are enabled for log output (by color.diff, color.ui, or --color, and respecting the auto settings of the former if we are going to a terminal). auto alone (i.e. %C(auto)) will turn on auto coloring on the next placeholders until the color is switched again. · %m: left, right or boundary mark · %n: newline · %%: a raw % · %x00: print a byte from a hex code · %w([<w>[,<i1>[,<i2>]]]): switch line wrapping, like the -w option of git-shortlog(1). · %<(<N>[,trunc|ltrunc|mtrunc]): make the next placeholder take at least N columns, padding spaces on the right if necessary. Optionally truncate at the beginning (ltrunc), the middle (mtrunc) or the end (trunc) if the output is longer than N columns. Note that truncating only works correctly with N >= 2. · %<|(<N>): make the next placeholder take at least until Nth columns, padding spaces on the right if necessary · %>(<N>), %>|(<N>): similar to %<(<N>), %<|(<N>) respectively, but padding spaces on the left · %>>(<N>), %>>|(<N>): similar to %>(<N>), %>|(<N>) respectively, except that if the next placeholder takes more spaces than given and there are spaces on its left, use those spaces · %><(<N>), %><|(<N>): similar to % <(<N>), %<|(<N>) respectively, but padding both sides (i.e. the text is centered)
Per the git reflog
documentation:
git reflog show
is an alias forgit log -g --abbrev-commit --pretty=oneline
which should then send you to the git log
documentation, which says little about --pretty=oneline
, but hides an important bit under the -g
aka --walk-reflogs
description:
With
--pretty
format other thanoneline
(for obvious reasons), this causes the output to have two extra lines of information taken from the reflog. The reflog designator in the output may be shown asref@{Nth}
(whereNth
is the reverse-chronological index in the reflog) or asref@{timestamp}
(with the timestamp for that entry), depending on a few rules:
If the starting point is specified as
ref@{Nth}
, show the index format.If the starting point was specified as
ref@{now}
, show the timestamp format.If neither was used, but
--date
was given on the command line, show the timestamp in the format requested by--date
.Otherwise, show the index format.
Under
--pretty=oneline
, the commit message is prefixed with this information on the same line. This option cannot be combined with--reverse
. See also git-reflog(1).
The "starting point" this alludes to is which reflog entry you gave with your git log -g
command. If you did not give one, git log
defaults to HEAD
, which doesn't have either format, so this falls into rule 3 or 4:
git log --pretty=oneline -g HEAD@{now}
explicitly uses rule 2, but:
git log --pretty=oneline -g HEAD@{0}
explicitly uses rule 1, for instance.
The little it says, or doesn't say, about --pretty=oneline
is that it is roughly equivalent to %H %gd %s
or %h %gd %s
depending on whether you use --abbrev-commit
. But—this also is somewhat missing from the documentation—if you set log.decorate=auto
in your configuration and stdout is going to an interactive device,1 you also get %d
inserted.
1"Interactive device" is whatever is designated a "tty" by the C library isatty
function.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With