乐闻世界logo
搜索文章和话题

How to output pretty git branch graphs?

8 个月前提问
4 个月前修改
浏览次数107

6个答案

1
2
3
4
5
6

在Git中,我们可以通过在命令行使用git log命令的不同参数来打印一个漂亮的分支图。这里有几种方法:

基本分支图

最简单的分支图可以使用如下命令生成:

sh
git log --graph --oneline --all
  • --graph 参数会显示ASCII图形表示的分支图。
  • --oneline 参数将每个提交放在一行显示,这样的输出更为紧凑。
  • --all 参数显示所有的分支,而不只是当前分支。

带有更多信息的分支图

如果你希望在分支图中显示更多信息,比如提交者的名字和提交的日期,可以使用:

sh
git log --graph --oneline --all --decorate
  • --decorate 参数会添加指向分支名、标签等的指针。

定制化的分支图

你还可以使用--pretty=format:来定制输出格式。例如:

sh
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --all
  • 格式字符串可以定制颜色、提交哈希、分支名、提交信息、提交日期和作者等信息的显示方式。
  • %Cred, %Creset, %C(yellow), 等命令用于定制颜色。
  • %h 显示缩略的提交哈希。
  • %d 显示装饰器(分支名、标签)。
  • %s 显示提交信息。
  • %cr 显示相对时间(比如,“3 days ago”)。
  • %an 显示作者名字。
  • --abbrev-commit 缩短哈希长度。

使用别名

因为这些命令可能会变得很长,所以你可能想要在Git中为它们设置别名。例如,设置一个叫做graph的别名:

sh
git config --global alias.graph "log --graph --oneline --all --decorate"

这样,以后你就可以简单地使用git graph来打印漂亮的分支图了。

示例

下面是一个直观的例子,展示了当你在具有几个分支的仓库中使用命令git log --graph --oneline --all --decorate时,可能会得到的输出:

sh
* e2a6f7b (HEAD -> master, origin/master, origin/HEAD) Merge pull request #2 from feature/xyz |\ | * 4e5c111 (feature/xyz) Added XYZ feature | * 5f4e3d2 Improved XYZ feature * | 9c0f3f9 Modified README |/ * c1f2e9e Initial commit

这是一个简单的树形结构,它将显示提交的顺序和分支之间的关系。每个*|字符构成ASCII艺术,代表提交和分支。最左边的线表示当前分支的直接历史,而右边的线则代表其他分支的提交。

2024年6月29日 12:07 回复

更新:我已经针对Git问题中的可视化分支拓扑发布了此答案的改进版本,因为它在那里更合适。出于历史(和代表,我承认)原因留下这个答案,尽管我真的很想删除它。

我的两分钱:我通常在~/.gitconfig文件中放入两个别名:

shell
[alias] lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)' --all lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' lg = lg1

git lg/git lg1看起来像这样:

git lg1

看起来git lg2像这样:

git LG2


(注意:这个问题现在有更多适用的答案,例如fraczJubosHarry Lee!)

2024年6月29日 12:07 回复

这里的许多答案都很好,但对于那些只想要一个简单的一行到点答案而无需设置别名或任何额外内容的人来说,这里是:

shell
git log --all --decorate --oneline --graph

不是每个人都会git log一直这样做,但是当你需要它时,请记住:

一只狗” = git log -- a ll -- d ecorate -- o neline -- graph

在此输入图像描述

如果您输入

shell
git config --global alias.adog "log --all --decorate --oneline --graph"

在命令提示符下一次,您可以使用

shell
git adog

即使您关闭并重新打开它,也不会出现该提示。

2024年6月29日 12:07 回复

对于文本输出,您可以尝试:

shell
git log --graph --abbrev-commit --decorate --date=relative --all

或者:

shell
git log --graph --oneline --decorate --all

或者:这是用于绘制DAG图的Graphviz别名。

2024年6月29日 12:07 回复

Gitgraph.js允许在没有存储库的情况下绘制漂亮的 Git 分支。只需编写一段 JavaScript 代码来配置您的分支并提交并在浏览器中呈现它。提供交互式文档。

shell
var gitGraph = new GitGraph({ template: "blackarrow", mode: "compact", orientation: "horizontal", reverseArrow: true }); var master = gitGraph.branch("master").commit().commit(); var develop = gitGraph.branch("develop").commit(); master.commit(); develop.commit().commit(); develop.merge(master);

使用 Gitgraph.js 生成的示例图

或者使用metro模板:

GitGraph.js 地铁主题

或者使用提交消息、作者和标签:

带有提交消息的 GitGraph

使用JSFiddle进行测试。

使用 @bsara 的Git Grapher生成它。

2024年6月29日 12:07 回复

构建在TikZ 和 PGF之上,gitdags是一个小型 LaTeX 软件包,可让您轻松生成矢量图形提交图等。

自动生成现有存储库的提交图_不是_目的gitdags;它生成的图表仅用于_教育目的_。

我经常使用它来生成 Git 问题答案的图表,作为 ASCII 提交图的替代方案:

下面是一个此类图表的示例,展示了简单变基的效果:

在此输入图像描述

shell
\documentclass{article} \usepackage{subcaption} \usepackage{gitdags} \begin{document} \begin{figure} \begin{subfigure}[b]{\textwidth} \centering \begin{tikzpicture} % Commit DAG \gitDAG[grow right sep = 2em]{ A -- B -- { C, D -- E, } }; % Tag reference \gittag [v0p1] % node name {v0.1} % node text {above=of A} % node placement {A} % target % Remote branch \gitremotebranch [origmaster] % node name {origin/master} % node text {above=of C} % node placement {C} % target % Branch \gitbranch {master} % node name and text {above=of E} % node placement {E} % target % HEAD reference \gitHEAD {above=of master} % node placement {master} % target \end{tikzpicture} \subcaption{Before\ldots} \end{subfigure} \begin{subfigure}[b]{\textwidth} \centering \begin{tikzpicture} \gitDAG[grow right sep = 2em]{ A -- B -- { C -- D' -- E', {[nodes=unreachable] D -- E }, } }; % Tag reference \gittag [v0p1] % node name {v0.1} % node text {above=of A} % node placement {A} % target % Remote branch \gitremotebranch [origmaster] % node name {origin/master} % node text {above=of C} % node placement {C} % target % Branch \gitbranch {master} % node name and text {above=of E'} % node placement {E'} % target % HEAD reference \gitHEAD {above=of master} % node placement {master} % target \end{tikzpicture} \subcaption{\ldots{} and after \texttt{git rebase origin/master}} \end{subfigure} \caption{Demonstrating a typical \texttt{rebase}} \end{figure} \end{document}
2024年6月29日 12:07 回复

你的答案