dsh-ide-git
JetBrains-style Git tool window for the sidebar: branch tree with ahead/behind badges, commit graph with text/author/date/path filters, per-file line diff, changes list and commit box, plus branch, tag and stash actions, merge, rebase, cherry-pick, reset and fetch/pull/push.
Install
dsh plugin --profile web add dsh-ide-git
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-ide-git

简体中文 | [English](README_EN.md)
给 DeepSeek Harness (DSH) 的侧边栏装一个 IDE 级的 Git 工具窗口——左边分支树、中间提交图谱、右边变更与提交详情,操作方式对齐 JetBrains 系 IDE 的 Git 面板;以 dsh-better-sidebar 原生 Tab 的形式注册,右侧栏与底部面板都能用;v0.13.0 起还可挂在主对话区(「对话 / 轨迹」旁边的 Git 标签页,设置里可关)。
DSH 自带的 Git 面板覆盖「暂存 / 提交 / 还原 / 看历史」;dsh-ide-git 补齐 IDE 用户习惯的那一层:分支树 + 右键分支操作 + 提交图谱 + 提交详情 + 变更列表 + 提交框。
它解决什么
- 分支管理没有树:内置面板只有一个分支下拉。这里给出
HEAD(当前分支) / 本地 / 远程 / 标签的分组树,每个分支带 ahead/behind 角标、上游、worktree 占用标记(W)。 - 历史只是列表:这里画出提交图谱(lane 拓扑 + 分支/标签 ref 徽章),支持无限滚动加载、框选批量选中与过滤(文本 / 哈希 / 作者 /「我」);历史范围可在当前分支 / 全部分支 / 任意本地或远程分支之间切换——别的分支领先的提交不再因为不在当前分支祖先链上而看不见;双击分支直接浏览该分支历史(不强制签出),有合并关系时自动定位到两分支最近的合并点。
- 想看某个提交改了什么:点提交直接进详情——作者、日期、完整提交信息、变更文件(含 +/− 行数),点文件看逐行 diff(红绿 + 行号 + hunk 高亮)。
- 想指给 AI 一段代码:在 diff 窗里选中几行、右键,把「哪个文件哪几行」(附提交或工作区上下文)直接发进当前会话的输入框。
- 想比较分支:分支右键即可与当前分支比较,结果按文件与提交数汇报。
- 操作要够全:签出、从任意分支/提交新建分支、重命名、删除、合并到当前(默认 /
--no-ff/--squash/--no-ff --no-commit)、变基当前到此、新建标签、cherry-pick、还原提交、重置(保留/丢弃)、fetch / pull --ff-only / push(确认后);留下待提交的合并后,可在「更多操作 → 提交 → 中止合并」退出。 - 输入框里就能看 Git:输入框工具条上有仓库与分支胶囊(着色的未提交 / 可拉取 / 待推送计数),点击弹出可搜索的切换器——仓库按名称/路径过滤,分支按
/折成文件夹树(fix/xxx一眼看清),输入即滤、方向键 + Enter 可选;多仓库工作区两边都能切,切换与面板实时联动,设置里可关(默认开)。切到新会话也不用等——插件会在你点开会话时就预热首屏数据,面板秒开。
效果
下面这些图取自一个只装了两个插件(dsh-better-sidebar+ 本插件)的干净 DSH,绑定在一个虚构的演示仓库上(见scripts/demo-repo.mjs),画面里没有真实工作区、没有壁纸插件、也没有其它面板。
<table>
<tr>
<td align="center" width="58%"><img src="docs/screenshots/1-bottom-workbench.png" alt="底部工作台:分支树 / 提交图谱 / 变更与提交"/></td>
<td valign="top"><b>底部工作台(宽扁 → 三栏)</b><br/>左列是 IDEA 式动作条:按<b>自身高度</b>决定放几个按钮,放不下的收进 <code>⋯</code>,末尾 <code>⚙</code> 可调顺序与显隐;中列是提交列表——列序与 IDEA 一致(<b>日期 → 提交人 → 图谱 → 分支标签 → 提交信息</b>),上方一排筛选(文本/哈希、分支或标签、提交人、日期、路径)与排序方向;右列是变更分组与提交框。</td>
</tr>
</table>
<table>
<tr>
<td align="center" width="58%"><img src="docs/screenshots/2-commit-menu.png" alt="提交右键菜单"/></td>
<td valign="top"><b>提交右键</b><br/>详情、复制修订号、签出该修订、在此新建分支、新建标签、优选(Cherry-Pick)、还原提交、重置到此(保留/丢弃更改)——破坏性项标红,菜单在面板内定位,底部工作台里同样能弹出来。</td>
</tr>
<tr>
<td align="center" width="58%"><img src="docs/screenshots/3-branch-undo.png" alt="删除分支后的撤回浮窗"/></td>
<td valign="top"><b>删除可撤回</b><br/>删除分支/贮藏是<b>真删除</b>,但宿主在动手前记下了对象 id:右下角浮窗点「撤回」即可恢复(一次性、30 分钟内有效);错过浮窗还有顶栏的「最近可撤回的操作」入口。删除 <code>main</code>/<code>master</code> 需要输入分支名确认。</td>
</tr>
</table>
<table>
<tr>
<td align="center" width="58%"><img src="docs/screenshots/4-rail-settings.png" alt="动作条设置:排序与显隐"/></td>
<td valign="top"><b>动作条可配置</b><br/>拖动或用箭头调整顺序、眼睛图标逐项显隐,配置只存「排列 + 隐藏」并做过归一化,以后新增动作不会打坏旧配置。</td>
</tr>
<tr>
<td align="center" width="58%"><img src="docs/screenshots/5-commit-detail.png" alt="提交详情与逐行 diff"/></td>
<td valign="top"><b>提交详情</b><br/>完整提交信息、作者与日期、变更文件列表(带 +/− 行数),点文件看逐行 diff(行号 + hunk 高亮 + 红绿底)。</td>
</tr>
</table>
<table>
<tr>
<td align="center" width="58%"><img src="docs/screenshots/6-right-sidebar.png" alt="原生右侧栏里的同一面板"/></td>
<td valign="top"><b>同一个注册,两种布局</b><br/>窄而高的<b>原生右侧栏</b>改用堆叠布局:动作条铺成顶部一行、变更在先、提交列表随后——面板只量自己的尺寸,从不猜自己在哪个容器里。截图顺序、演示仓库与干净环境都由 <code>scripts/screenshots.mjs</code> 复现。</td>
</tr>
</table>
右键发送到对话
面板里的一切都能右键塞进当前会话的输入框——走 DSH 官方的 composer 插入通道(不动你已输入的文字,追加在末尾;发送中或服务不在时自动退化为复制到剪贴板并提示,绝不死点击):
- 提交 →
git 提交 47ad017「提交标题」(仓库 xxx):短哈希 + 提交信息 + 仓库,一段话指名一个修订; - 分支 →
git 分支 main(仓库 xxx); - 文件(变更列表与提交详情的文件行)→ 一个
@路径文件引用 chip(DSH 原生 @ 语法,含空格的路径自动加引号),或者只发文件路径; - diff 选中行:在提交详情或工作区变更打开的 diff 窗里选中一段文本再右键 → 「发送选中行到对话」:
@文件chip + 行号说明——提交场景是「第 N–M 行(提交 47ad017「标题」@ 当前分支)」,工作区场景是「第 N–M 行(工作区已暂存 / 未提交)」。行号由选区所在的 diff 行按 hunk 头换算成新文件行号;选中的全是删除行时用旧号并标注「旧行号」。选区落不到可定位的 diff 行上时,菜单退化为「发送选中片段到对话」(原文截断 600 字符),不编造行号;菜单里同时有「复制选中引用」。没有选区时右键保持浏览器默认菜单。
配套已经就位的几件事:变更文件行与详情文件行的行首图标按扩展名着色(DSH 自家 FileTypeIcon);diff 预览用 DSH 自家 DiffBlock 组件渲染(红绿底、复制 / 换行工具栏,视觉与宿主一致);diff 窗高度可拖拽调节并按位置记忆;整个面板还可以挂进主对话区——「对话 / 轨迹」旁的 Git 标签页,插件设置里可关。
挂在哪里:两个宿主,一个面板
本插件只注册一次,落到哪个面上由宿主决定,两条通道互斥:
宿主 · 条件 · 你得到什么
dsh-better-sidebar(底座,可选) · 装了它 · 它的 Tab 系统:右侧栏里的原生 Tab 加上底部工作台;它的设置页 侧边卡片 里能看到本插件的卡片
DSH 原生右侧栏 · 没装底座时自动接管 · 右侧栏 Guide 页里的 Git 胶囊 → 点开就是同一个面板
主对话区标签页(v0.13.0 起) · 总是可用(可在设置里关闭) · 会话顶部「对话 / 轨迹」旁多一枚 Git 标签,点它整块主对话区变成 Git 工具窗口;开关在插件设置 →「面板放置」
底座在场时以它为准(它还带底部工作台);底座晚到会顶掉原生注册再挂到它那边。所以只装本插件也能用,没有任何前置要求。
同一个面板会出现在形态完全不同的面上,所以布局靠量而不是猜:
面 · 形态 · 本插件的布局
右侧栏(原生的,或底座桥接过来的) · 窄而高 · stack:变更区在上,下方是「历史 / 差异」双页签(点变更文件自动切到差异),分支树可收起
底部工作台(底座自有) · 宽而扁 · columns:分支树 · 提交图谱 · 变更与提交框,三栏并排——就是 JetBrains Git 工具窗口的样子
侧栏被拖得很窄(< 400px) · 窄 · compact:变更列表在上,下方是「历史 / 差异」双页签,分支树可收起
插件不猜自己在哪儿,而是用 ResizeObserver 量自己的容器:宽 ≥ 600px 且宽 ≥ 高 × 1.15 走三栏,宽 < 400px 走紧凑页签,其余走纵向堆叠(宽度说了算,高度没有否决权);两种纵向布局都把「历史 / 差异」做成页签,点变更文件自动切到差异。自由浮窗、移动端抽屉同样自适应。
功能一览
区域 · 能力
动作条 · IDEA 式左侧竖排(底部工作台)/ 顶栏下一行横排(右侧栏):刷新、新建分支、签出、删除、比较、显示差异、贮藏、新建标签、收藏、抓取、拉取、推送。按可用空间自动决定放几个,放不下的收进 ⋯ 更多;末尾 ⚙ 设置 可拖动排序、逐项显隐(存进插件行 Config 的每个动作布尔 + railOrder;空串表示默认顺序)。每个按钮按当前状态点亮/置灰(没有其他分支就不能删除/签出/比较,没有远程就不能抓取/推送,没有上游就不能拉取,没有变更就没有差异可看)
窄栏页签 · 宽度 < 600px 的两种纵向布局里:变更列表固定在上方,下方是「历史 / 差异」两个页签——点变更文件自动切到「差异」,历史列表与它的滚动位置都不再被顶走;两区之间的分隔条可拖动、双击复位(尺寸与 dsh-ide-git.panes.v1 其它面板同一份存储)
悬停提示 · 鼠标停在图标按钮上 120ms,指针旁弹出它的操作名——竖排动作条里在图标右侧(跟着该行垂直居中,贴窗口右缘时翻到左侧),其余在下方;置灰的动作连原因一起给出(如 隐藏 · 当前状态不可用)。提示卡挂在窗口层,底部工作台裁不到;扫过一排图标不闪,按住鼠标拖拽 / 滚动 / 缩放时立即收起
状态行 · 当前分支、上游、↑ahead ↓behind、stash 数量、忙碌指示
输入框状态条 · 宿主输入框工具条里的仓库/分支胶囊(着色 ±未提交 / ↓可拉取 / ↑待推送),点击切换仓库与分支,与面板双向联动;单仓库只切分支,多仓库两边都切;设置可关(默认开)
仓库/分支切换器 · 面板顶部与输入框胶囊共用同一个可搜索选择器:仓库按名称、路径、克隆目录或当前分支过滤,并标出各仓当前分支;分支按 / 折成文件夹树,输入时自动展开命中的目录,方向键 + Enter 可选,过滤器为空时目录可手动折叠
分支树 · HEAD / 本地 / 远程 / 标签 分组(可折叠)、过滤框、星标当前分支、ahead/behind 角标、worktree 占用标记;本地蓝 / 远程紫 / 标签黄 / HEAD 绿
工作树 · 动作条新增「工作树」视图:列出主工作树与全部链接工作树(当前 / 主工作树 / 已锁定 / 可清理标记、分支、短 HEAD、路径),可新建(新分支或挂
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::77,最后更新 2026-11-06