如何理解交叉Git日志?

How to understand crossover Git log?

谁能告诉我 0ab11dd 和 bd7278a 之间发生了什么? 还有 27ac7b7 和 95b2c48 之间? 为什么这些提交中存在交叉?

* xxxxxxx (HEAD -> f-1, origin/f-1) 
* xxxxxxx fix merge conflicts
*   13751d5 Merge branch 'master' into feature/DP-1
|\  
| *   f3efc9d (origin/master, origin/HEAD, master) Merge pull request #9 from fix
| |\  
| | * 83c0b15 (origin/fix) 
| |/  
| *   be24ce6 Merge pull request 
| |\  
| | *   0ab11dd merge
| | |\  
| | |/  
| |/|   
| * |   bd7278a Merge pull request 
| |\ \  
| | * | 14399e2 
| | | * xxxxxxx  
| | | * xxxxxxx 
| | | *   27ac7b7 merge
| | | |\  
| | |_|/  
| |/| |   
| | | * 95b2c48 (origin/f-3) 
| | | * xxxxxxx 

尤其是这个

| | |_|/  
| |/| |   

为什么有out分支却没有commit?

关于"crossovers"

这正是图形工具表示合并的方式:从右到左(左边的那个是 "receiving" 合并的那个)。因此,当必须将提交系列(而不是在这里可能会造成混淆的分支)合并到另一个恰好当前以图形方式表示在其右侧的提交系列时,该工具会绘制一条线,是的,该线与其他线交叉以使其连接到合并提交从右边

所以这只是一个图形约定。


关于竖线 (评论后)

分支(可选地,使用 --decorate)在它们当前指向的提交处添加到图中,但不要忘记你的 repo 树实际上并不需要它们中的任何一个。这些提交系列是你的树的主体,其中 "branches" 实际上只是提示,这就是比喻有点崩溃的地方......


(我承认这是一个非常 low-tech 的表示,...但我们也承认,信息丰富的提交消息会使事情变得更加清晰。)

这将是一条评论,但没有空间,需要格式化。

此时的部分:

| | | *   27ac7b7 merge
| | | |\  
| | |_|/  
| |/| |   
| | | * 95b2c48 (origin/f-3) 
| | | * xxxxxxx 

不完整。如果你继续浏览图表,它最终可能会像这样自行解决:

| | | * xxxxxxx 
| | |/
| | * yyyyyyy
| |/
| * zzzzzzz
|/
* sssssss

(但我们真的猜不出来,可能比那复杂得多)。

有了足够的附加图表,我们可以对提交 27ac7b7 说更多。目前我们所知道的是它是一个合并,有两个父级,第一个父级是 95b2c48(标记为 origin/f-3)。我们在这里看不到第二个父提交的哈希 ID,但是沿着图形线,您最终会到达第二个父提交。

(您询问的第一个提交——0ab11dd——是与父 xxxxxxx 的合并提交,是跟随 direct-downward 行到该提交的结果,并提交 bd7278a,沿着最初向右下降然后立即反转并向下交叉到 bd7278a 的线的结果。git log --graph 通过绘制 not-first 强调 first/not-first 亲子关系向右链接。一些图形绘制方法,包括我通常使用的方法,根本不区分。区分何时以及是否有用是另一个话题,但请参阅 --first-parent 选项 git log.)