GIT 日志图的最佳方法,每个分支都有单独的行

Best Approach for GIT log graph with separate and individual line for every branch

我想在 git 中使用 git-flow 作为工作流程。但是我对 see git log --graph 有疑问。例如我有四个分支:

 -master-    -develop-    -feature/sms-    -release/v1.0
    |            |             |                 |

我想看到每个分支都是单独的和单独的,就像下面的图片:

我该怎么办?或哪个工具适合我的需要?

一般情况下,您确实无法做到这一点。您可以针对特定情况伪造它,这对您来说可能已经足够了;但是你必须自己做,因为 Git 不会。

原因很简单:您显示的图表是谎言。它试图假装 Git 向前工作。 Git 不会:Git 向后工作。

在 Git 中,提交通常不会 在单个分支上 。相反,提交在 多个分支上同时进行 。这是同一张图的文本表示:

master:    A--B-----------------------P--...
               \                     /
release:        \                K--M
                 \              /    \
develop:          C-----F------I------R--...
                   \     \    /
feature1:           D--E-----H
                           \
feature2:                   G--J--L--N--...

这也是一个谎言:它暗示提交 A,例如, master。事实上,提交 A 每个 分支上。

由于有 ... 部分我们看不到,因此很难确定提交 G-J-L-N-... 是否在多个分支上:我们需要从末尾开始,例如 Git 确实如此,看到现实而不是谎言。不过,我们可以说,这些提交现在肯定在 feature2 上。同时,提交 CF feature2 develop 上。我们无法确定包含 D-E-H 序列的唯一分支是 feature2:所有这四个提交都是 definitely on feature1,而且 肯定develop,因为 Idevelop 并且 I 回到 H。同时提交 Krelease,但由于 K 返回到 II 也在 release;因为 I 可以追溯到 FH,所以这两个提交也在 release.

简而言之,这里的问题是我们正试图向前工作。 Git 不向前工作。 Git 向后工作 ,从分支上的 last 提交开始。让我们假设我们确实有这些最后的提交,并重新绘制所有内容:

A--B-----------------------P   <-- master
    \                     /
     \                K--M
      \              /    \
       C-----F------I------R   <-- develop
        \     \    /
         D--E-----H
                \
                 G--J--L--N   <-- feature2

这幅画是真实的,而不是谎言(好吧,大概是在某个时间的某些存储库中)。

我在此处添加的三个名称是我们需要保留显示的所有提交的唯一名称,因为它们是仅有的三个最后提交。我们可以添加另一个名称,例如 feature1,指向,比如说,提交 H,以及我们喜欢的更多名称:

A--B-----------------------P   <-- master
    \                     /
     \                K--M   <-- release
      \              /    \
       C-----F------I------R   <-- develop
        \     \    /
         D--E-----H   <-- feature1
                \
                 G--J--L--N   <-- feature2

最后一张图是(不一定the,但a)真实的画法。名称 release 标识提交 M,并且从 M,我们和 Git 可以向后工作以找到提交 K,然后从 KI,并同时到 FH。然后从 FH 我们可以同时回到 CE,然后回到 D (也可以回到 C) ;从 C 我们可以走回 B,然后再到 A。因此提交 A-B-C-D-E-F-H-I-K-M 都可以从 release.

访问

如果我们删除名称release,提交不会发生任何变化。所有提交都仍然存在。它们只是不再包含在 release 分支中,该分支不再存在。它们仍然包含在 master 中,因为 master 开始于—结束于?—P,它向后工作到 MB。由于 P 达到 M,每个可从 M 到达的提交也可从 P.

到达

如果您认为这是在单行道网络中沿着单行道行驶,那么您就走上了启蒙之路。对于(更多)关于此的更多信息,我建议通过网站 Think Like (a) Git. Pay close attention to the idea that what you want is to have your tools hide (some) commits from you (on the Making Sense of the Display 页面进行工作。

请注意,还有其他版本控制系统可以按照您希望 Git 的方式工作。特别是 Mercurial,它与 Git 非常相似,只是提交 在它们所在的分支上,永远 。每个提交仅在 one 分支上。无论您如何处理分支名称,包含分支的提交都保持不变。在 Git 中,因为 names 移动而提交保持不变,所以包含任何给定提交 的 分支集一直在变化!如果你不准备在Git中发生这种情况,你在使用Git时会很痛苦。