I will maybe someday get around to dusting off my C and making these changes myself unless someone else does it first.
Imagine a long-running development branch periodically merges from master. The
git log --graph --all --topo-order
is not as simple as it could be, as of git version 1.7.10.4.
It doesn't seem like a big deal in this example, but when you're trying to follow the history trails in ASCII and you've got several different branches displayed at once, it gets difficult quickly.
To simulate:
git init example
cd example
git commit --allow-empty -m "initial empty commit"
git branch dev
for x in `seq 4`; do
echo 1 >> 1.txt
git add 1.txt
git commit -m "commit"
git checkout dev
git merge --no-ff --no-edit master
git checkout master
done
The result:
$ git log --graph --all --topo-order --decorate --oneline --boundary
* a9f8d93 (dev) Merge branch 'master' into dev
|\
| * 5f32650 (HEAD, master) commit
* | b511501 Merge branch 'master' into dev
|\ \
| |/
| * 4e6810e commit
* | 2cd55b4 Merge branch 'master' into dev
|\ \
| |/
| * 4f74695 commit
* | 372799e Merge branch 'master' into dev
|\ \
| |/
| * 076669f commit
|/
* 7382440 initial empty commit
What I would like it to display:
$ git log --graph --all --topo-order --decorate --oneline --boundary
* a9f8d93 (dev) Merge branch 'master' into dev
|\
| * 5f32650 (HEAD, master) commit
* | b511501 Merge branch 'master' into dev
|\|
| * 4e6810e commit
* | 2cd55b4 Merge branch 'master' into dev
|\|
| * 4f74695 commit
* | 372799e Merge branch 'master' into dev
|\|
| * 076669f commit
|/
* 7382440 initial empty commit
Sometimes I'm faced with a very complex mess of merges and branches. I'd like to be able to ask git log to show me the graph, but to always set commits from specific branches into specific columns in the output. This might make for more line-drawing to connect the commits, but that's okay in this situation.
Using the very same repo above, I'd like to say "make left-most columns for master and dev, in that order" and see:
$ git log --graph --all --topo-order --decorate --oneline --boundary --force-branch-columns=master,dev
.-- master
| .-- dev
v v
* a9f8d93 (dev) Merge branch 'master' into dev
/|
* | 5f32650 (HEAD, master) commit
| * b511501 Merge branch 'master' into dev
|/|
* | 4e6810e commit
| * 2cd55b4 Merge branch 'master' into dev
|/|
* | 4f74695 commit
| * 372799e Merge branch 'master' into dev
|/|
* | 076669f commit
\|
* 7382440 initial empty commit
Maybe that doesn't seem like it's of much value, but let's throw another branch into the mix and see what it might look like.
Branch from somewhere in the middle of dev
, create two commits, then merge from master
:
git checkout -b newbranch dev~3
echo 2 >> 2.txt; git add 2.txt; git commit -m "commit"
echo 2 >> 2.txt; git add 2.txt; git commit -m "commit"
git merge --no-ff --no-edit master
The unmodified result:
$ git log --graph --all --topo-order --decorate --oneline --boundary
* f745bf5 (HEAD, newbranch) Merge branch 'master' into newbranch
|\
* | 7031537 commit
* | 416ab2c commit
| | * a9f8d93 (dev) Merge branch 'master' into dev
| | |\
| | |/
| |/|
| * | 5f32650 (master) commit
| | * b511501 Merge branch 'master' into dev
| | |\
| | |/
| |/|
| * | 4e6810e commit
| | * 2cd55b4 Merge branch 'master' into dev
| | |\
| |/ /
|/| /
| |/
| * 4f74695 commit
* | 372799e Merge branch 'master' into dev
|\ \
| |/
| * 076669f commit
|/
* 7382440 initial empty commit
What's most striking to me about the as-is unmodified output is the frequency with which we see this cross-legged pattern:
* b511501 Merge branch 'master' into dev
|\
|/
/|
* | 4e6810e commit
* 2cd55b4 Merge branch 'master' into dev
Is the output perhaps intentionally like this to show which parent of a merge commit is the "first" parent? If so, that may be useful sometimes, so I wouldn't want to see that style completely removed in favor of my suggestion.
With different line-drawing logic and forced columns, it might look like this:
$ git log --graph --all --topo-order --decorate --oneline --boundary --force-branch-columns=master,dev
.-- master
| .-- dev
v v
* f745bf5 (HEAD, newbranch) Merge branch 'master' into newbranch
/|
/ * 7031537 commit
/ * 416ab2c commit
| * | a9f8d93 (dev) Merge branch 'master' into dev
|/| |
* | | 5f32650 (master) commit
| * | b511501 Merge branch 'master' into dev
|/| |
* | | 4e6810e commit
| * | 2cd55b4 Merge branch 'master' into dev
|/|/
| /
|/|
* | 4f74695 commit
| * 372799e Merge branch 'master' into dev
|/|
* | 076669f commit
\|
* 7382440 initial empty commit
I think that it is much easier with that visualization to track which commits are in master and dev, and see the points at which other branches forked from and merged with them.