bin/git-trail
#!/bin/sh -e
#
# https://leahneukirchen.org/blog/archive/2013/01/a-grab-bag-of-git-tricks.html
#
# git trail [-r] [-t] [COMMIT] - show all branching points in Git history
[ "$1" = -r ] && shift || REMOTES="-e refs/remotes/"
[ "$1" = -t ] && shift || TAGS="-e refs/tags/"
COMMIT=$(git rev-parse --no-flags --default HEAD "$@")
{ git for-each-ref | grep -v -e '^$' $TAGS $REMOTES
git log --date=short --format="%cd %h %H" "$@"
} | awk '
$2 == "commit" || $2 == "tag" {
"git merge-base '"$COMMIT"' " $1 | getline mb
merge[mb] = merge[mb] " " $3
}
{
if ($3 in merge) {
split(merge[$3], mbs, " ")
for (i in mbs) {
"git name-rev --name-only --refs=\"" mbs[i] "\" " $3 | getline nr
if (nr != "undefined") print $1, $2, nr # skip unreachable commits
}
}
}' | git -p column # paginate output