git - 可视化git日志树时如何指定最左边(感兴趣的主要分支)?

标签 git user-interface tree git-log

我正在使用 Sourcetree,但我在其他 Git GUI 工具中看到了同样的问题,所以我不确定是否有任何工具可以满足我的需求。

这个问题的主要原因是有时我需要查看特定的发布版本分支并查看所有其他分支以及相对于感兴趣的分支的所有提交。

目前,它可能会令人困惑,因为即使我检查分支,它也不会在树形可视化中显示为一条直线,这使得跟踪此分支何时以及为何拆分或 merge 变得复杂。如果我可以将特定的分支视为一条垂直的直线,并且所有其他分支都围绕它排列,那会容易得多。

例如,我有分支 A,然后从它创建一个分支 B,然后将一些内容提交到 B 中,并将其他内容提交到 A。当我查看日志时,我希望能够指定分支 A 是我感兴趣的分支,因此分支 A(而不是分支 B)应显示为一条直线。但目前我不知道该怎么做 - 看起来,Git(或 Sourcetree)决定将哪个分支显示为一条直线(最有可能的是,它是最新提交的分支?)以及将显示哪些分支作为从当前选择的“主分支”中分离出来的。

最佳答案

因为 Git 将提交存储在 中D 导演 一个 循环 G raph 或 DAG,你在这里真正拥有的是 graph (DAG) visualization problem .有各种外部程序,例如Graphviz ,这可能很有用,但所有这些都是外部工具,不是 Git 内置的,所以你必须在这里自己做一些工作。另见 Pretty git branch graphs .

这里有一个次要问题。当您将提交视为“在”某个分支上时,您可能会认为,如果您在分支 B 上进行提交,那么它们从那时起就“属于”分支 B。这在 Mercurial 中是正确的,但在 Git 中却是错误的。任何给定的提交都在该提交可到达的所有分支上,其中可达性是一个技术术语(有关可达性问题的详细描述,请参阅 Think Like (a) Git)。这最终对您的问题意味着没有可靠的方法来识别“主线”。如果你所有的程序员在进行 merge 时都很小心,你可以在 merge 提交时使用 Git 的第一个父属性来识别这条主线,但如果有人使用过 git pull ,他们将创造一些所谓的Foxtrot Merges ,这与主线概念困惑。

每个 Git-graph-drawing 工具(例如 Git-GUI 或 gitk 或 SourceTree)都有自己的方法来枚举图中的提交,因此每个工具都有自己的绘制 DAG 的方式。对于 git log --graph ,这是相当粗略的,dvaergiller's comment很有趣,但请注意,在使用 --graph 时, git log将排序顺序从其原始的“最新优先”更改为“拓扑”。大多数图形绘制程序必须进行某种拓扑排序以最小化线交叉。

最后,您可能会发现 git log --graph --branches --tags --decorate --simplify-by-decoration基本上无需您付出额外的努力,即可获得超过 90% 的所需。 “通过装饰简化”模式告诉git log丢弃任何未标记(没有分支或标签名称)且不需要显示图形结构的提交。所以你会得到 fork 和 merge 点,因为你需要它们作为结构,加上分支和标签的名称,向你展示一个非常好的“大图”绘图,即使线条不是很直。

关于git - 可视化git日志树时如何指定最左边(感兴趣的主要分支)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51553292/

相关文章:

algorithm - Max-Heapify 中的最坏情况——如何获得 2n/3?

c# - 为类型 T 的复杂对象创建自定义比较器

git - 撤消导致 merge 冲突的 git stash pop

regex - 如何找到所有 .git\config 文件?

java - 多个面板彼此下方

c - 测试树的圆度?

git - 使用 Visual Studio 2019 将更改推送到子存储库

git - 如何回滚之前的两次提交?

java - 如何在 eclipse kepler 中动态重新加载 GUI?

java - Eclipse WindowBuilder 更改 GUI 中的字体大小