StGit补丁操作实战:edit、squash、fold、rename精准管理补丁的完整手册

📅 2026/8/24 9:02:28
StGit补丁操作实战:edit、squash、fold、rename精准管理补丁的完整手册
StGit补丁操作实战edit、squash、fold、rename精准管理补丁的完整手册【免费下载链接】stgitStacked Git项目地址: https://gitcode.com/gh_mirrors/st/stgitStGitStacked Git是在 Git 之上实现的补丁栈工具让你把开发拆成一个个可独立编辑的补丁。它的四大补丁操作命令——stg edit、stg squash、stg fold、stg rename——能让你像编辑文件一样修改补丁的描述与内容、合并零散提交、把 diff 折叠进补丁并重命名补丁是打造干净提交历史的核心手段。本文将带你快速上手这四条命令掌握补丁管理的实用技巧。 四大补丁操作命令速览在深入之前先用一张表了解每条命令的定位它们都属于 StGit 的 Patch Manipulation 命令类别命令作用典型场景stg edit编辑补丁的描述、作者、diff 内容修改提交信息、修正补丁代码stg squash把两个及以上补丁合并为一个把修复typo并入功能补丁stg fold把外部 diff 文件折叠进当前补丁把评审反馈直接合入补丁stg rename重命名补丁补丁名更贴切地表达内容 与git rebase -i相比这些命令作用于栈中已存在的命名补丁操作目标明确、可重复执行新手更容易掌握。✏️ stg edit如何修改补丁的描述和代码stg edit默认编辑栈顶补丁。不加任何选项时它会打开编辑器让你交互式修改补丁细节——包括补丁消息、作者甚至补丁的 diff 本身。编辑补丁描述直接运行即可进入编辑器stg edit # 交互式编辑栈顶补丁 stg edit fix-login # 编辑指定补丁可用名字或编号定位常用参数--edit / -e明确指定进入编辑器编辑描述--diff / -d编辑时把补丁的 diff 附加到描述末尾方便你边看改动边改描述注意直接编辑这段 diff 若无法应用回补丁父提交StGit 不会改动补丁而是把编辑内容存成文件供你修正后用--file回喂--message / -m msg非交互式直接用命令行指定的消息替换--file / -f path从文件读取消息-表示从标准输入读取--author Name email修改补丁作者保存模板供外部工具使用--save-template file是一个进阶技巧不真正执行编辑只把补丁描述模板写到文件里。适合驱动脚本——先保存模板、让用户编辑再配合--file完成修改。相关实现src/cmd/edit.rs补丁编辑的通用参数定义在src/patch/edit/args.rs。️ stg squash如何把多个补丁合并成一个开发中经常产出实现功能 修复笔误 调整格式这样一串琐碎补丁stg squash能把它们合并为一个干净的补丁。stg squash fix-typo fix-login # 合并两个补丁 stg squash fix-typo fix-login --name add-login # 指定合并后的新名字它的执行流程源码中清晰可见分五步弹出待合并的补丁及其上方的所有补丁按命令行给定顺序重新压入形成包含全部改动的树用一个新合并补丁替换原来的补丁打开编辑器让你交互式编辑新补丁的提交信息默认会附上每个原始补丁的消息作为参考重新压入之前弹出的其余补丁几点实用说明至少要给两个补丁否则报错--name / -n不指定时默认沿用其中一个补丁的名字压入过程中可能出现冲突命令会暂停等待你手工解决——解决后重新执行即可同样的补丁编辑选项-m、--signoff等也适用实现位置src/cmd/squash.rs。 stg fold如何把 diff 文件折叠进补丁stg fold的作用是把一个 GNU diff 文件或标准输入应用到当前栈顶补丁上非常适合收到评审意见 → 修改 → 直接合入补丁的工作流stg fold review.diff # 把 diff 文件折叠进栈顶补丁 git diff tmp.diff stg fold tmp.diff # 工作区临时改动也可以这样合入可选参数--threeway / -t以栈顶补丁的父提交为基准做三方合并比直接打补丁更宽容--base / -b committish指定其他基准提交做三方合并-p n剥离 diff 路径中前 n 层目录默认 1-C n为每个改动保留 n 行匹配上下文--reject应用失败的 hunk 写入.rej文件而不是直接失败注意执行前要求工作区是干净的stg fold会检查状态且至少有一个已应用的补丁。实现位置src/cmd/fold.rs。️ stg rename如何重命名补丁补丁名是补丁栈的导航标签命名不贴切时随时可以改stg rename old-name new-name # 重命名指定补丁 stg rename new-name # 只给新名字重命名栈顶补丁要点省略旧名字时默认操作栈顶补丁最常用新名字不能与栈中已有补丁重名也不能与其他补丁的编号等定位符冲突StGit 会提前检测并拒绝如提示 patchxxxalready exists实现位置src/cmd/rename.rs⚠️ 别和stg name混淆name是用来查询补丁名字的输出命令见src/cmd/name.rs不是修改命令。⚡ 补丁编辑通用选项速查stg edit和stg squash共享一套Patch Edit Options定义于src/patch/edit/args.rs掌握它们两条命令都受益选项说明--edit / -e调用编辑器编辑补丁描述--diff / -d编辑时显示 diff--message / -m直接指定消息跳过编辑器--file / -f从文件读取消息-为 stdin--author设置作者 姓名 邮箱--signoff / -s追加 Signed-off-by 尾注可重复使用--ack / --review追加 Acked-by / Reviewed-by 尾注--authdate now把作者日期设为当前时间--no-verify跳过 commit-msg 钩子--save-template只保存描述模板后退出 最佳实践与避坑指南随时可以后悔StGit 的所有补丁操作都会记录事务误操作后用stg undo一键回退可用stg redo重做大胆实验即可。squash 前先排序stg squash按命令行参数顺序合并先用stg float调好补丁顺序再合并结果更符合预期。fold 前检查工作区stg fold要求工作区和索引干净脏工作区会直接报错。命名规范补丁名用小写连字符风格如fix-login-timeout重命名前先想好名字避免多次stg rename。冲突是正常现象squash 和带--threeway的 fold 都可能产生冲突命令会暂停并保留现场手工解决冲突标记后重新执行同一命令即可继续。命令分类四条命令中 edit/fold/rename 属于补丁操作Patch Manipulationsquash 属于栈操作Stack Manipulation完整命令列表可参考官方文档 Documentation/stg.txt。 相关文件索引内容路径edit 命令实现src/cmd/edit.rssquash 命令实现src/cmd/squash.rsfold 命令实现src/cmd/fold.rsrename 命令实现src/cmd/rename.rs补丁编辑通用参数src/patch/edit/args.rs交互式编辑逻辑src/patch/edit/interactive.rs官方文档源文件Documentation/stg.txt掌握stg edit、stg squash、stg fold、stg rename这四条命令你就拥有了 StGit 补丁管理的核心工具箱描述随时改、零散提交随手合、外部 diff 一键并入、补丁名字随时优化。配合stg undo的安全网从第一条补丁开始就能养成干净的提交历史习惯。【免费下载链接】stgitStacked Git项目地址: https://gitcode.com/gh_mirrors/st/stgit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考