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?

  • Git: removing a file from being versioned, but not deleting it
  • Default filters in SourceTree history
  • Why does my git history look like a christmas tree?
  • automate usage of SSH local key for git deployment with ansible
  • graph contributor empty
  • Link latest file on Bitbucket Git repository
  • 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:
     \ \ \         \ \ \
     / / /         / / /
    | _ /         | / /
    |  /          |/ /
    | |           | |
    | |           | |

  • How can I create a custom cleanup mode for git?
  • Why do I get a warning after I say “git commit .”
  • Git hook to update various web folders based on branch pushed to remote server
  • Could not find rake-10.3.2 in any of the sources (Bundler::GemNotFound) on HTTPS push
  • git workflows: how to integrate and test feature branches without continuous delivery?
  • GIT and SSH, which key is used?
  • 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.