Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unexpected underscore in git log --graph output

Tags:

git

git-log

When running git log --graph on my copy of the Linux kernel, I'm seeing an underscore in the graph that doesn't look like it should be there.

What does that underscore mean?

The specific command I'm using is thus:

git log --graph --decorate --pretty=oneline --abbrev-commit --all --date-order

And the output looks like this:

git log --graph output

I've tried looking at this area in the graph in gitk, but there doesn't seem to be anything out of the ordinary there.

I don't think this is just showing a branch point, as I'd expect that to be rendered as on the right, not as on the left (the left should match the image above):

I see:        I'd expect for
              normal branching:

 \ \ \         \ \ \
 / / /         / / /
| _ /         | / /
|  /          |/ /
| |           | |
| |           | |
like image 478
me_and Avatar asked Mar 06 '13 14:03

me_and


2 Answers

From ack "'_'" on the Git sources it looks like the underscore is printed in graph.c, line 1120, inside the graph_output_collapsing_line function:

/*
 * Output out a line based on the new mapping info
 */
for (i = 0; i < graph->mapping_size; i++) {
    int target = graph->new_mapping[i];
    if (target < 0)
        strbuf_addch(sb, ' ');
    else if (target * 2 == i)
        strbuf_write_column(sb, &graph->new_columns[target], '|');
    else if (target == horizontal_edge_target &&
         i != horizontal_edge - 1) {
            /*
             * Set the mappings for all but the
             * first segment to -1 so that they
             * won't continue into the next line.
             */
            if (i != (target * 2)+3)
                graph->new_mapping[i] = -1;
            used_horizontal = 1;
        strbuf_write_column(sb, &graph->new_columns[target], '_');
    } else {
        if (used_horizontal && i < horizontal_edge)
            graph->new_mapping[i] = -1;
        strbuf_write_column(sb, &graph->new_columns[target], '/');

    }
}

But after thinking about it for a while it doesn’t make much sense anyway. The underscore is a symbol for crossing an unrelated branch to the left from the current one, to get to a branch point somewhere further to the left. This can be seen on other places in your screenshot, but this particular underscore really looks lost.

like image 98
zoul Avatar answered Sep 21 '22 12:09

zoul


To me, this seems to be a rendering artefact. Most likely, the console output has some logic to prevent something like this

/ /
| /

from happening, as this snippet would not exactly show at which place a branch operation occurred. Thus, the designers probably opted for

/ /
| _

instead.

But I could be wrong here, it seems to be something that should be checked out in the code.

like image 27
Gnosophilon Avatar answered Sep 23 '22 12:09

Gnosophilon