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选项)