The best answers to the question “Visualizing branch topology in Git” in the category Dev.
I’m playing with Git in isolation on my own machine, and I find it difficult to maintain a mental model of all my branches and commits. I know I can do a
git log to see the commit history from where I am, but is there a way to see the entire branch topography, something like these ASCII maps that seem to be used everywhere for explaining branches?
.-A---M---N---O---P / / / / / I B C D E \ / / / / `-------------'
It just feels like someone coming along and trying to pick up my repository would have difficulty working out exactly what was going on.
I guess I’m influenced by AccuRev’s stream browser…
I usually use
git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"
With colors (if your shell is Bash):
git log --graph --full-history --all --color \ --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"
This will print text-based representation like this:
* 040cc7c (HEAD, master) Manual is NOT built by default * a29ceb7 Removed offensive binary file that was compiled on my machine and was hence incompatible with other machines. | * 901c7dd (cvc3) cvc3 now configured before building | * d9e8b5e More sane Yices SMT solver caller | | * 5b98a10 (nullvars) All uninitialized variables get zero inits | "https://stackoverflow.com/" * 1cad874 CFLAGS for cvc3 to work successfully | * 1579581 Merge branch 'llvm-inv' into cvc3 | |\ | | * a9a246b nostaticalias option | | * 73b91cc Comment about aliases. | | * 001b20a Prints number of iteration and node. | "https://stackoverflow.com/"/| | * 39d2638 Included header files to cvc3 sources | * 266023b Added cvc3 to blast infrastructure. | * ac9eb10 Initial sources of cvc3-1.5 |/ * d642f88 Option -aliasstat, by default stats are suppressed
(You could just use
git log --format=oneline, but it will tie commit messages to numbers, which looks less pretty IMHO).
To make a shortcut for this command, you may want to edit your
[alias] gr = log --graph --full-history --all --color --pretty=tformat:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m"
However, as Sodel the Vociferous notes in the comments, such long formatting command is hard to memorize. Usually, it’s not a problem as you may put it into the
~/.gitconfig file. However, if you sometimes have to log in to a remote machine where you can’t modify the config file, you could use a more simple but faster to type version:
git log --graph --oneline
git log --graph or
gitk. (Both also accept
--all, which will show all the branches instead of just the current one.)
For branch names and a compact view, try:
git log --graph --decorate --oneline
To any of these recipes (based on git log or gitk), you can add
--simplify-by-decoration to collapse the uninteresting linear parts of the history. This makes much more of the topology visible at once. I can now understand large histories that would be incomprehensible without this option!
I felt the need to post this because it doesn’t seem to be as well-known as it should be. It doesn’t appear in most of the Stack Overflow questions about visualizing history, and it took me quite a bit of searching to find–even after I knew I wanted it! I finally found it in this Debian bug report. The first mention on Stack Overflow seems to be this answer by Antoine Pelisse.
I have 3 aliases (and 4 alias-aliases for quick usage) that I normally throw in my
[alias] lg = lg1 lg1 = lg1-specific --all lg2 = lg2-specific --all lg3 = lg3-specific --all lg1-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)' lg2-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' lg3-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset) %C(bold cyan)(committed: %cD)%C(reset) %C(auto)%d%C(reset)%n'' %C(white)%s%C(reset)%n'' %C(dim white)- %an <%ae> %C(reset) %C(dim white)(committer: %cn <%ce>)%C(reset)'
git lg1 looks like this:
git lg2 looks like this:
git lg3 looks like this:
It should be noted that this isn’t meant as a end-all-be-all solution— it’s a template for you to change, add to and fix up to your liking. If you want to use these, my recommendation is to:
- Add them to your
- Customize to your liking (different color choices, different line arrangements for the 2- and 3-line versions, etc.),
- And then save a copy to a Gist or other code snippet tool so you can copy & paste it into
.gitconfigs in the future (or alternatively version control your dotfiles, of course).
Note: Answer copied from and improved upon the answer at stackoverflow.com/questions/1057564/pretty-git-branch-graphs since it’s far more appropriate here than it was there. Left the copy on the other question for historical reasons— it’s closed now, and the answer’s referenced by a bunch of other answers.