show-branch: make the current branch and merge commits stand out.

This changes the character used to mark the commits that is on the
branch from '+' to '*' for the current branch, to make it stand out.
Also we show '-' for merge commits.

When you have a handful branches with relatively long diversion, it
is easier to see which one is the current branch this way.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 2006-01-11 14:02:38 -08:00
parent 54f9734ec8
commit ebedc31952
5 changed files with 64 additions and 49 deletions

View File

@ -81,13 +81,14 @@ OUTPUT
------ ------
Given N <references>, the first N lines are the one-line Given N <references>, the first N lines are the one-line
description from their commit message. The branch head that is description from their commit message. The branch head that is
pointed at by $GIT_DIR/HEAD is prefixed with an asterisk '*' pointed at by $GIT_DIR/HEAD is prefixed with an asterisk `*`
character while other heads are prefixed with a '!' character. character while other heads are prefixed with a `!` character.


Following these N lines, one-line log for each commit is Following these N lines, one-line log for each commit is
displayed, indented N places. If a commit is on the I-th displayed, indented N places. If a commit is on the I-th
branch, the I-th indentation character shows a '+' sign; branch, the I-th indentation character shows a `+` sign;
otherwise it shows a space. Each commit shows a short name that otherwise it shows a space. Merge commits are denoted by
a `-` sign. Each commit shows a short name that
can be used as an extended SHA1 to name that commit. can be used as an extended SHA1 to name that commit.


The following example shows three branches, "master", "fixes" The following example shows three branches, "master", "fixes"
@ -95,7 +96,7 @@ and "mhf":


------------------------------------------------ ------------------------------------------------
$ git show-branch master fixes mhf $ git show-branch master fixes mhf
! [master] Add 'git show-branch'. * [master] Add 'git show-branch'.
! [fixes] Introduce "reset type" flag to "git reset" ! [fixes] Introduce "reset type" flag to "git reset"
! [mhf] Allow "+remote:local" refspec to cause --force when fetching. ! [mhf] Allow "+remote:local" refspec to cause --force when fetching.
--- ---
@ -109,13 +110,13 @@ $ git show-branch master fixes mhf
+ [mhf~6] Retire git-parse-remote. + [mhf~6] Retire git-parse-remote.
+ [mhf~7] Multi-head fetch. + [mhf~7] Multi-head fetch.
+ [mhf~8] Start adding the $GIT_DIR/remotes/ support. + [mhf~8] Start adding the $GIT_DIR/remotes/ support.
+++ [master] Add 'git show-branch'. *++ [master] Add 'git show-branch'.
------------------------------------------------ ------------------------------------------------


These three branches all forked from a common commit, [master], These three branches all forked from a common commit, [master],
whose commit message is "Add 'git show-branch'. "fixes" branch whose commit message is "Add 'git show-branch'. "fixes" branch
adds one commit 'Introduce "reset type"'. "mhf" branch has many adds one commit 'Introduce "reset type"'. "mhf" branch has many
other commits. other commits. The current branch is "master".




EXAMPLE EXAMPLE

View File

@ -32,16 +32,16 @@ merge introduced 5 commits or so:


------------------------------------------------ ------------------------------------------------
$ git show-branch --more=4 master master^2 | head $ git show-branch --more=4 master master^2 | head
! [master] Merge refs/heads/portable from http://www.cs.berkeley.... * [master] Merge refs/heads/portable from http://www.cs.berkeley....
! [master^2] Replace C99 array initializers with code. ! [master^2] Replace C99 array initializers with code.
-- --
+ [master] Merge refs/heads/portable from http://www.cs.berkeley.... - [master] Merge refs/heads/portable from http://www.cs.berkeley....
++ [master^2] Replace C99 array initializers with code. *+ [master^2] Replace C99 array initializers with code.
++ [master^2~1] Replace unsetenv() and setenv() with older putenv(). *+ [master^2~1] Replace unsetenv() and setenv() with older putenv().
++ [master^2~2] Include sys/time.h in daemon.c. *+ [master^2~2] Include sys/time.h in daemon.c.
++ [master^2~3] Fix ?: statements. *+ [master^2~3] Fix ?: statements.
++ [master^2~4] Replace zero-length array decls with []. *+ [master^2~4] Replace zero-length array decls with [].
+ [master~1] tutorial note about git branch * [master~1] tutorial note about git branch
------------------------------------------------ ------------------------------------------------


The '--more=4' above means "after we reach the merge base of refs, The '--more=4' above means "after we reach the merge base of refs,
@ -193,8 +193,8 @@ $ git show-branch --more=1 master pu rc
+ [pu~4] Document "git cherry-pick" and "git revert" + [pu~4] Document "git cherry-pick" and "git revert"
+ [pu~5] Remove git-apply-patch-script. + [pu~5] Remove git-apply-patch-script.
+ [pu~6] Redo "revert" using three-way merge machinery. + [pu~6] Redo "revert" using three-way merge machinery.
+ [rc] Merge refs/heads/master from . - [rc] Merge refs/heads/master from .
+++ [master] Revert "Replace zero-length array decls with []." ++* [master] Revert "Replace zero-length array decls with []."
+ [rc~1] Merge refs/heads/master from . - [rc~1] Merge refs/heads/master from .
+++ [master~1] Merge refs/heads/portable from http://www.cs.berkeley.... ... [master~1] Merge refs/heads/portable from http://www.cs.berkeley....
------------------------------------------------ ------------------------------------------------

View File

@ -968,8 +968,8 @@ $ git show-branch master mybranch
* [master] Merge work in mybranch * [master] Merge work in mybranch
! [mybranch] Some work. ! [mybranch] Some work.
-- --
+ [master] Merge work in mybranch - [master] Merge work in mybranch
++ [mybranch] Some work. *+ [mybranch] Some work.
------------------------------------------------ ------------------------------------------------


The first two lines indicate that it is showing the two branches The first two lines indicate that it is showing the two branches
@ -979,7 +979,8 @@ top-of-the-tree commits, you are currently on `master` branch
the later output lines is used to show commits contained in the the later output lines is used to show commits contained in the
`master` branch, and the second column for the `mybranch` `master` branch, and the second column for the `mybranch`
branch. Three commits are shown along with their log messages. branch. Three commits are shown along with their log messages.
All of them have plus `+` characters in the first column, which All of them have non blank characters in the first column (`*`
shows an ordinary commit on the current branch, `.` is a merge commit), which
means they are now part of the `master` branch. Only the "Some means they are now part of the `master` branch. Only the "Some
work" commit has the plus `+` character in the second column, work" commit has the plus `+` character in the second column,
because `mybranch` has not been merged to incorporate these because `mybranch` has not been merged to incorporate these
@ -1024,7 +1025,7 @@ $ git show-branch master mybranch
! [master] Merge work in mybranch ! [master] Merge work in mybranch
* [mybranch] Merge work in mybranch * [mybranch] Merge work in mybranch
-- --
++ [master] Merge work in mybranch -- [master] Merge work in mybranch
------------------------------------------------ ------------------------------------------------




@ -1199,9 +1200,9 @@ $ git show-branch --more=3 master mybranch
! [master] Merge work in mybranch ! [master] Merge work in mybranch
* [mybranch] Merge work in mybranch * [mybranch] Merge work in mybranch
-- --
++ [master] Merge work in mybranch -- [master] Merge work in mybranch
++ [master^2] Some work. +* [master^2] Some work.
++ [master^] Some fun. +* [master^] Some fun.
------------ ------------


Remember, before running `git merge`, our `master` head was at Remember, before running `git merge`, our `master` head was at
@ -1223,8 +1224,8 @@ $ git show-branch
! [mybranch] Some work. ! [mybranch] Some work.
-- --
+ [mybranch] Some work. + [mybranch] Some work.
+ [master] Some fun. * [master] Some fun.
++ [mybranch^] New day. *+ [mybranch^] New day.
------------ ------------


Now we are ready to experiment with the merge by hand. Now we are ready to experiment with the merge by hand.
@ -1743,8 +1744,8 @@ $ git show-branch
+ [diff-fix] Fix rename detection. + [diff-fix] Fix rename detection.
+ [diff-fix~1] Better common substring algorithm. + [diff-fix~1] Better common substring algorithm.
+ [commit-fix] Fix commit message normalization. + [commit-fix] Fix commit message normalization.
+ [master] Release candidate #1 * [master] Release candidate #1
+++ [diff-fix~2] Pretty-print messages. ++* [diff-fix~2] Pretty-print messages.
------------ ------------


Both fixes are tested well, and at this point, you want to merge Both fixes are tested well, and at this point, you want to merge
@ -1764,13 +1765,13 @@ $ git show-branch
! [diff-fix] Fix rename detection. ! [diff-fix] Fix rename detection.
* [master] Merge fix in commit-fix * [master] Merge fix in commit-fix
--- ---
+ [master] Merge fix in commit-fix - [master] Merge fix in commit-fix
+ + [commit-fix] Fix commit message normalization. + * [commit-fix] Fix commit message normalization.
+ [master~1] Merge fix in diff-fix - [master~1] Merge fix in diff-fix
++ [diff-fix] Fix rename detection. +* [diff-fix] Fix rename detection.
++ [diff-fix~1] Better common substring algorithm. +* [diff-fix~1] Better common substring algorithm.
+ [master~2] Release candidate #1 * [master~2] Release candidate #1
+++ [master~3] Pretty-print messages. ++* [master~3] Pretty-print messages.
------------ ------------


However, there is no particular reason to merge in one branch However, there is no particular reason to merge in one branch
@ -1797,12 +1798,12 @@ $ git show-branch
! [diff-fix] Fix rename detection. ! [diff-fix] Fix rename detection.
* [master] Octopus merge of branches 'diff-fix' and 'commit-fix' * [master] Octopus merge of branches 'diff-fix' and 'commit-fix'
--- ---
+ [master] Octopus merge of branches 'diff-fix' and 'commit-fix' - [master] Octopus merge of branches 'diff-fix' and 'commit-fix'
+ + [commit-fix] Fix commit message normalization. + * [commit-fix] Fix commit message normalization.
++ [diff-fix] Fix rename detection. +* [diff-fix] Fix rename detection.
++ [diff-fix~1] Better common substring algorithm. +* [diff-fix~1] Better common substring algorithm.
+ [master~1] Release candidate #1 * [master~1] Release candidate #1
+++ [master~2] Pretty-print messages. ++* [master~2] Pretty-print messages.
------------ ------------


Note that you should not do Octopus because you can. An octopus Note that you should not do Octopus because you can. An octopus

View File

@ -545,6 +545,7 @@ int main(int ac, char **av)
int sha1_name = 0; int sha1_name = 0;
int shown_merge_point = 0; int shown_merge_point = 0;
int topo_order = 0; int topo_order = 0;
int head_at = -1;


git_config(git_show_branch_config); git_config(git_show_branch_config);
setup_git_directory(); setup_git_directory();
@ -675,6 +676,8 @@ int main(int ac, char **av)
} }
/* header lines never need name */ /* header lines never need name */
show_one_commit(rev[i], 1); show_one_commit(rev[i], 1);
if (is_head)
head_at = i;
} }
if (0 <= extra) { if (0 <= extra) {
for (i = 0; i < num_rev; i++) for (i = 0; i < num_rev; i++)
@ -703,9 +706,19 @@ int main(int ac, char **av)
shown_merge_point |= ((this_flag & all_revs) == all_revs); shown_merge_point |= ((this_flag & all_revs) == all_revs);


if (1 < num_rev) { if (1 < num_rev) {
for (i = 0; i < num_rev; i++) int is_merge = !!(commit->parents && commit->parents->next);
putchar((this_flag & (1u << (i + REV_SHIFT))) for (i = 0; i < num_rev; i++) {
? '+' : ' '); int mark;
if (!(this_flag & (1u << (i + REV_SHIFT))))
mark = ' ';
else if (is_merge)
mark = '-';
else if (i == head_at)
mark = '*';
else
mark = '+';
putchar(mark);
}
putchar(' '); putchar(' ');
} }
show_one_commit(commit, no_name); show_one_commit(commit, no_name);

View File

@ -118,8 +118,8 @@ cat > show-branch.expect << EOF
* [master] Merged "mybranch" changes. * [master] Merged "mybranch" changes.
! [mybranch] Some work. ! [mybranch] Some work.
-- --
+ [master] Merged "mybranch" changes. - [master] Merged "mybranch" changes.
++ [mybranch] Some work. *+ [mybranch] Some work.
EOF EOF


git show-branch --topo-order master mybranch > show-branch.output git show-branch --topo-order master mybranch > show-branch.output
@ -142,7 +142,7 @@ cat > show-branch2.expect << EOF
! [master] Merged "mybranch" changes. ! [master] Merged "mybranch" changes.
* [mybranch] Merged "mybranch" changes. * [mybranch] Merged "mybranch" changes.
-- --
++ [master] Merged "mybranch" changes. -- [master] Merged "mybranch" changes.
EOF EOF


git show-branch --topo-order master mybranch > show-branch2.output git show-branch --topo-order master mybranch > show-branch2.output