Unexpected underscore in git log –graph output

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:

 \ \ \         \ \ \
 / / /         / / /
| _ /         | / /
|  /          |/ /
| |           | |
| |           | |

  • View git log without merge commits
  • explanation on the logic for git log command git log master-1.0.83..HEAD
  • Get git log range of remote branch
  • How can a patchfile created with `git-log -p <filename>` be applied to create all the commits included?
  • Git log outputs in a specific revision range
  • how to pre-fix a piece of text in github “git log” using shell-script
  • How to configure 'git log' to show 'commit date'
  • git log the difference between 1 branch from another
  • 2 Solutions collect form web for “Unexpected underscore in git log –graph output”

    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

    / /
    | _


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

    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.

    Git Baby is a git and github fan, let's start git clone.