跳到主要内容

09 · 提交图

状态:✅ 已实现 · 范围:v1 · 工程参考:../spec.md

打开​

  • 每个仓库一个提交图标签(标题形如 <仓库名> (Graph)):从活动栏的提交图按钮(作用于当前仓库)、图工具栏的仓库选择器、Source Control 区头按钮、命令面板("打开提交图")、仓库行右键菜单,或 Explorer 中任意属于某仓库的文件夹/文件行右键菜单打开。最多约 5 个图标签同时存活(LRU);重新打开瞬时完成。
  • 工具栏的仓库选择器一键切到其他仓库的图(可输入筛选,回车选中第一项),并同步把该仓库设为当前仓库,状态栏与 Source Control 随之跟随。选择器旁边的 … 按钮打开仓库操作菜单(与 Repos 视图行菜单同一套,不含提交图那一项),常用操作不必离开提交图。
  • 提交图默认覆盖全部 ref:本地分支、远端分支、tag 与 HEAD。
  • 工具栏最左侧的范围切换可以把同一个面板换成整个工作区的时间线(见下方"工作区时间线")。

你会看到​

  • 带泳道的提交行,按开发线着色;ref 标签(HEAD、分支名、origin/…、tag)挂在它们指向的提交上。
  • 每行的 subject、作者、相对时间;行高为"宽松"时,第二行以更小的灰色字展示压成一行的提交正文,便于在列表里看清带着说明的提交。
  • 相对当前分支 upstream 的 incoming / outgoing 标记——哪些提交尚未推送、哪些尚未拉取。
  • 当前分支的顶点高亮;点击任意行打开详情面板(右侧):完整 message、作者与提交者的时间戳、带逐文件统计的变更文件列表。点击文件在编辑区打开该提交对该文件的 diff。

加载行为与规模​

  • 首页加载 1 000 个提交;向下滚动按 2 000 条分块流入更早历史——提交图绝不等待全量历史。
  • 历史多于窗口上限时,加载停在窗口内最新的这些提交,工具栏会明确提示("超大仓库 — 仅显示最新的 10000 个提交");用筛选把窗口缩小到你关心的范围。窗口大小本身是一项设置:设置 → Git → "提交图窗口"(graph.windowSize,1000 – 200000 个提交,默认 10000);调大后会从中断处继续加载更早历史。
  • 泳道列自适应:泳道不多时按自然宽度展示;分支/合并密集的仓库改为压缩泳道间距,而不是把提交文字挤没(提交文字始终保留自己的列)。
  • 可拖拽:拖动泳道列右缘可自定义宽度,宽度会被记住并跨会话保留。用过滤器减少泳道(如"仅当前分支")即可让出空间。
  • 行高:紧凑 / 正常 / 宽松,可在图工具栏或 设置 → 外观("提交图密度")中切换;默认 正常。
  • 线条样式:泳道连线可选 平滑曲线 / 折线——泳道切换时画成平滑 S 曲线或保持直线段——可在图工具栏或 设置 → 外观("提交图线条样式")中切换;默认 平滑曲线。
  • 性能目标:已加载 5 000+ 行时滚动顺滑(60 fps);1 万提交仓库的首页在 1.5 秒内完成首帧。

过滤​

工具栏过滤器(可组合):ref 多选(分支/远端/tag)、作者、路径、日期区间、消息文本搜索,以及**"仅当前分支可达"**(隐藏无关历史)。过滤状态按标签保存并记忆。

工作区时间线(所有勾选的仓库)​

图工具栏最左侧是范围切换:仓库 看单个仓库的泳道,工作区 把所有勾选仓库的最近提交合成一条时间线。这个选择跨会话记住;命令面板("打开工作区活动时间线")能从任意仓库直接切过去。

  • 范围:与 Source Control 共用同一套逐仓库勾选(第 01 页)。工具栏显示当前合入了多少个仓库;在 Repos 视图取消勾选,该仓库的提交就从时间线消失。
  • 行:相对时间、仓库标签、subject 与作者,按天分组加日期表头。只走每个仓库的 HEAD,因此这条时间线回答的是"我在跟的这些仓库最近在发生什么",而不是所有分支。
  • 时间窗:最近 7 / 30 / 90 / 365 天(默认 30),另有消息与作者过滤器和重新读取按钮;行高沿用同一套密度设置。
  • 说清边界:某个仓库在窗口内还有更早的提交时会说明;读取失败的仓库在警告条里点名,其余仓库照常展示;一个仓库都没勾选时时间线会指回 Repos 视图的勾选框;窗口内没有提交也有对应空态。
  • 点击某行打开该仓库的提交图标签,选中并滚动到那个提交、同时打开详情面板——该标签回到 仓库 范围。
  • 范围内任一仓库的 HEAD 移动(提交、检出、拉取)都会自动刷新时间线。

提交上的操作​

右键任意提交(或使用详情面板):

操作说明
检出该提交detached HEAD,附"在此创建分支"横幅
在此创建分支 / 创建 tag选择器对话框
Cherry-pick / Revert单个提交或 Ctrl/Cmd 多选的批量,带 --no-commit 选项(第 06 页)
把当前分支重置到此处soft / mixed / hard(第 06 页)
把当前分支 rebase 到该提交
自此交互式 rebase列表编辑器(第 06 页)
编辑提交…改写 message / 作者 / 时间,带备份与撤销(第 04 页)
复制 SHA / 复制 ref 名
选择用于对比再右键另一提交 → "与所选对比"——两个提交间的 diff 在编辑区打开

Ctrl/Cmd 点选多行可以同时选中多个提交,此时菜单会为整份选区提供拣选、revert 和提交编辑。

键盘​

  • ↑ / ↓ 逐行移动,Enter 打开详情,Esc 关闭详情面板。
  • Ctrl/Cmd+F 聚焦过滤栏;输入即实时过滤消息。

边界情况​

  • Detached HEAD:图中以 chip 显示游离位置;仅限分支的操作隐藏。
  • reflog 条目(无任何 ref 可达的提交)v1 不展示。[Later]
  • 历史改写(amend / rebase / 编辑提交)后图自动刷新。改写前的状态仍可通过 backup ref 找回——它们不会作为普通 ref 出现在图中;入口是"从备份恢复…"(第 06 页)。