跳到主要内容

04 · 提交与提交信息

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

提交框​

Source Control 视图中每个仓库分节的底部是提交框:

  • 消息输入框(多行,可按需展开),带 ✨ 生成按钮。
  • 主操作 Commit(Ctrl/Cmd+Enter)。下拉菜单按顺序提供:
    • Commit——仅提交已暂存内容;
    • 提交并推送——在推送对话框中选择远端(第 05 页);
    • 暂存全部并提交;
    • 修订 · 保留原提交信息、修订 · 编辑提交信息、修订 · 包含工作区中的更改——见下。
  • Sign-off 开关(追加 Signed-off-by:);GPG 签名为 [Later]。
  • 提交过程中,hook 输出(如 pre-commit、commit-msg)流式显示在面板中。失败时消息保留在输入框里——什么都不丢,修完重试即可。
  • 不受信工作区中,提交框显示**"此工作区未启用 Git 钩子"**,提交在无 hook 的情况下执行(第 01 页)。

Amend​

  • 三个修订入口的差别在于如何处理提交信息与工作树:保留原提交信息沿用现有消息重新提交,编辑提交信息会预填上一条提交消息供你修改,包含工作区中的更改先把全部改动暂存。
  • 对已推送的提交执行 amend 会给出警告并要求确认。

修改更早的提交(历史改写)​

"快速修改指定提交的提交信息 / 提交人 / 提交时间"背后的功能:

  • 入口:在提交图中右键某提交,或点提交详情面板的 "…" 菜单 → "编辑提交…"。
  • 可改字段:提交信息、作者姓名与邮箱、作者时间、提交时间。
  • 批量修改:在图中多选提交 → "编辑 N 个提交…",一次操作完成全部修改。
  • 前置条件与安全:
    • 工作树有未提交改动不会阻塞改写:编辑当前提交时你的未提交改动保持原样;回放更早的提交则由 Git 自带的自动贮藏(rebase.autoStash)处理,改写完成后自动恢复(第 07 页)。
    • 分支已推送时给出强烈警告("将改写已发布历史")并要求显式确认。
    • 改写前会自动创建 backup ref;完成后操作可以撤销(细节与恢复见第 06 页"安全网")。
  • 改写过程在后台执行,不阻塞窗口;完成后提交图自动刷新。

提交信息生成​

  • 提交框中的 ✨ 按钮根据暂存区 diff 产出可编辑的草稿。它绝不自行提交;如果输入框里已经有你打的字,会先弹确认再替换。
  • 离线模式(默认)——无网络、零配置:
    • 从 commitlint 配置、.gitmessage 模板、以及最近约 100 条非 merge subject 的风格(conventional commits 前缀、大小写、平均长度、subject 语言——中/英)中探测仓库的提交约定。
    • 基于暂存区 diff 构建草稿:推断的 type 与 scope、概括主体变更的 subject、以及按变更统计分组的 body 条目。
    • 探测不到约定时,草稿走中性、描述性的路线,而不是硬猜前缀。
  • 重新生成会再产出一个变体;只要存在多于一个草稿,输入框下方就会出现**"备选"**供切换。
  • LLM 模式(可选开启)——对复杂 diff 文案质量更好:
    • 在 设置 → Commit message 中一次性配置:provider(OpenAI 兼容)、base URL、模型、temperature、API key。
    • 密钥存 OS 钥匙串(Windows 凭据管理器 / macOS 钥匙串 / Linux keyring)。Linux 无钥匙环时密钥仅保留在本次会话——会有提示解释原因。
    • 对某 host 的首次请求会弹确认,说明暂存区 diff 将发送至 <host>;每个 host 批准一次。
    • 响应流式写入输入框、可取消;超时(默认 30 秒)或网络失败时自动回落到离线草稿并明确告知。
  • 两种模式下草稿都完全可编辑,提交按钮永远由你按。

边界情况​

  • 未暂存任何内容时提交:Commit 不暂存任何东西并给出说明(或改用 "Stage all & commit")。
  • 存在未解决冲突时:提交框禁用,并指向冲突横幅(第 06 页)。
  • rebase/merge "continue" 流程中的提交:只能通过操作横幅进行,以保证序列一致。