git log --graph 是最轻量可靠的分支合并关系查看方式,配合 --oneline --all 可直观显示所有分支的拓扑结构、合并顺序及分叉再合并情况。

git log --graph 看分支合并关系最直接
想一眼看清哪些分支合进了 main、谁先谁后、有没有分叉再合并,git log --graph 是最轻量也最可靠的方式。它不依赖外部工具,所有 Git 客户端都支持,而且输出是纯文本拓扑结构,不会因终端宽度或编码问题崩掉。
常见错误是只敲 git log,结果全是线性列表,看不出任何合并点;或者加了 --oneline 但漏掉 --graph,图就没了。
-
git log --graph --oneline --all:显示所有分支的简略提交 + 图形化连接(推荐日常用) -
git log --graph --decorate --simplify-by-decoration:只显示带分支/标签标记的提交,适合整理发布历史 - 如果看到
|和/、\连线歪斜或断开,大概率是终端宽度不够,加--no-pager或缩小字体再试
git show-branch 查合并基础点更准
git show-branch 不画图,但它能明确标出两个分支的共同祖先(merge base),这对判断“这个 PR 到底有没有把 feature-X 的改动带进来”特别管用。比肉眼数 git log --graph 的连线靠谱得多。
典型场景:CI 报“main 上跑不过”,你切到 feature 分支本地一跑却没问题——这时候就得确认 feature 是不是真的基于最新 main 合并的。
-
git show-branch main feature/login:列出两分支各自独有的提交,并在共同祖先行标! -
git show-branch -a:显示所有本地分支,快速扫一遍哪些分支长期没跟 main 同步 - 注意:
git show-branch默认不显示远程分支,要看 origin/main 得显式写origin/main
git log --merges 只看合并提交本身
当你要审计“谁在什么时候把哪个分支合进了 main”,git log --merges 比翻全量日志高效十倍。它过滤掉所有普通提交,只留 merge 类型,还能配合 --first-parent 排除掉被合并分支里的内部提交干扰。
容易踩的坑是默认不显示被合并分支名。光看 Merge branch 'dev' 不知道是 dev 的哪次提交被合进来了,得加 --stat 或 --pretty=fuller 才能看到完整上下文。
-
git log --merges --first-parent --oneline main:只看 main 上的合并动作(忽略 merge 提交里带进来的 dev 分支细节) -
git log -1 --merges --simplify-by-decoration:查最近一次合并,常用于 CI 脚本判断当前构建是否来自 merge - 如果
git log --merges没输出,说明当前分支上确实没有 merge 提交——可能一直是 rebase 流水线,也可能压根没合过
别信 GUI 工具自动渲染的“漂亮图”
很多 IDE 或 Git GUI(比如 GitHub Desktop、Sourcetree)会把分支历史渲染成带箭头的二维流程图,看着清楚,但它们默认启用 --simplify-by-decoration 或隐藏 merge 提交,导致你以为 A 和 B 是并行开发,其实 B 是从 A 的某个中间提交分出去的,只是图上没画出来。
真实协作中,图形失真会误导代码溯源和回滚决策。尤其涉及 cherry-pick、rebase 后 force-push 的仓库,GUI 图可能完全丢失关键路径。
- 查关键问题时,务必回到终端敲
git log --graph --all --simplify-by-decoration对照看 - GitHub/GitLab 的 Web 界面分支图默认不显示未 push 的本地合并,而
git log --graph能立刻反映本地真实状态 - 如果团队用
git rebase -i整理历史,--graph输出会变“直”,但实际 commit hash 全变了——这时候不能只看图,得比对git merge-base结果
图形化本身不难,难的是图里省略的那些隐含条件:谁 push 了、有没有 force-push、rebase 是否污染了公共分支……这些都不会在连线里标出来。











