Git Graph (提交图 / 分支拓扑图)

一句话:把提交历史画成有向无环图 (DAG)——commit 是节点,父子关系是边,分支的分叉与合并一目了然。

1. 定义

git graph 不是一条独立命令,而是指提交历史的可视化呈现:Git 内部用有向无环图(Directed Acyclic Graph)记录 commit 之间的父子关系,graph 视图把这些关系画成树/网,让你看清分支在哪里 fork、在哪里 merge。

类比:像家谱图,一眼看出谁是谁的「祖先」、哪些分支在哪合流。

2. 核心概念 / 能做什么

概念说明
commit 节点图里的每个圆点,对应一次提交(SHA-1)
父子边箭头指向父提交,体现「谁基于谁」
分支指针main / feat 等标签标在最新 commit 上
合并节点有两个父节点的 commit,是分支合流点
--all画出所有分支,而不只是当前分支

解决什么问题:纯 git log 是线性列表,多分支并行时看不出拓扑;graph 把「分叉 / 合流」结构显式画出来,review 历史、定位 merge 冲突来源时极有用。

3. 工作原理 / 在系统中的位置

*   a1b2c3 (HEAD -> main)       合并提交:两个父节点
|\
| * d4e5f6 (feat/login)         feat 分支的独立提交
* | 7a8b9c (fix/typo)            main 上的提交
|/
*   1234ab 初始提交

* 是 commit 节点,| / \ 是连接线,(分支名) 是分支指针标注。这张图直接来自 .git 里存的对象依赖关系。

4. 基本用法 / 常用命令

# 终端:最常用的一行 DAG 视图
git log --graph --oneline --all --decorate
 
# 加时间线,更直观
git log --graph --oneline --all --decorate --since="2 weeks ago"
 
# GUI 工具(不占终端,可点选、可比对)
gitk --all                      # Git 自带
# VSCode 扩展「Git Graph」、lazygit、GitKraken 等

--oneline 精简成一行,--decorate 显示分支/标签名,--all 包含全部分支;三者常一起用。

5. 对比辨析表

维度git graph(可视化)git log(列表)git worktree(工作区)
是什么历史的历史的文本列表并行的工作目录
用途看分支拓扑 / 合流点看提交顺序 / 搜 commit多分支同时干活
改不改仓库❌ 只读❌ 只读✅ 创建/删除目录
和 agent 关系排查历史用排查历史用多 agent 隔离机制

一句话区分:graph 是「看历史」,worktree 是「并行干活」,两者完全不冲突,经常一起用。

6. 典型工作流

  • 接手老仓库:先 git log --graph --all --oneline 看全貌,搞清有哪些长期分支、在哪合流。
  • review PR / merge 冲突:用 graph 定位冲突提交是哪个分支引入的。
  • 日常在 VSCode:装 Git Graph 插件,点点点就能看每次提交的 diff,比命令行更省事。

7. 常见误区

  • graph 是独立命令 → 错。它是 git log --graph 的视图形态,或 GUI 工具的功能,不是 git graph 这条命令。
  • graph 会改仓库 → 不会,纯只读可视化,随便跑。
  • 只看当前分支就够 → 多分支并行时漏看 --all 会丢掉其他分支的拓扑,误以为历史是直线的。

8. 延伸阅读 / 关联概念

  • git-worktree — 多 agent 并行干活的机制(与 graph 互补)
  • git-branch基础 — 分支指针、HEAD 的本质
  • 官方文档:git help log(查 --graph / --decorate 选项)