git log --graph 输出中出现了意外的下划线

9

当我在我的Linux内核副本上运行git log --graph时,我看到一个下划线在图表中出现了,但是它似乎不应该出现。

那个下划线代表什么意思?

我使用的具体命令如下:

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

输出结果如下图所示:

git log --graph output

我尝试在gitk中查看这个区域,但似乎没有什么异常。

我认为这不是一个分支点,因为如果是分支点,那么应该在右边显示,而不是在左边(左边应该与上面的图片匹配):

I see:        I'd expect for
              normal branching:

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

3
这是一堆相当大的树枝… - twalberg
你只是在问渲染方面的问题吗?我认为提交历史没有任何问题(即紫色分支在那一点上分成两个部分)。 - gcbenison
@gcbenison:您可以在该图像中看到一些分支分成了两个,它们被渲染为|/(竖线斜杠),而不是| _(竖线空格下划线)。如果这就是意思,我想知道这种分裂与正常分裂之间的区别;如果它有不同的含义,我也想知道。 - me_and
@me_and 我认为它并没有什么不同的含义;我认为这只是呈现方式上的差异。 - gcbenison
@gcbenison:那么,为什么会呈现不同的方式?是什么逻辑使其决定与正常呈现不同,而选择这种方式来呈现呢? - me_and
3个回答

4

从 Git 源代码中的 ack "'_'" 来看,下划线是在 graph.c 的第 1120 行 打印出来的,在 graph_output_collapsing_line 函数内部:

/*
 * 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], '/');

    }
}

但是仔细考虑后,这样做也并没有太多意义。下划线是一个符号,表示从当前分支向左穿过一个无关的分支,以到达更远处的某个分支点。您的屏幕截图中其他地方也可以看到这种情况,但这条下划线似乎真的失落了。


我同意这个下划线看起来很迷失。你指向的代码所在的提交(v1.6.3-rc1-19-geaf158f)是为了压缩穿过屏幕的图形线,应该在两侧有/;但这只有右边一个。这意味着这是一个错误,或者有其他东西打印出这个特定的下划线。 - me_and

3
对我来说,这似乎是一种渲染问题。很可能,控制台输出有一些逻辑来防止这样的情况发生。
/ /
| /

这可能是因为此代码片段无法准确地显示分支操作发生的位置,从而防止出现错误。因此,设计人员可能选择了

/ /
| _

相反,我可能在这里是错误的,这似乎是应该在代码中检查的内容。

我认为不是这样的:我可以创建一个简单的四次提交示例存储库,其中显示了每个斜杠直接位于彼此上方的图形。每个斜杠和下面的斜杠之间始终会有一个空格,但是如果您查看此图像,如果将“_”替换为“/”,则还会有一个空白字符。 - me_and

1
非常古老的问题,但今天我在编写 git 图形输出解析器时遇到了这个问题。起初,我也认为它与代码中左侧的分支直接连接有关,但在尝试一些更大型的仓库后,我发现它的意思是:连接到左侧的 | 分支之一。为什么会呈现出这样的形式对我来说完全是一个谜。请参见下面的示例。

git log --graph --date-order --all --pretty=format:"%h %p %s"

git_weirdness


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接