Git Rebase 规整分支杂乱的 commit

文章目录

    今天才知道可以用

    git rebase -i <branch>
    

    来将当前分支的多个 commit,合并成1个或者指定几个 commit。

    可以使合并到团队主分支时,你的提交历史更清晰。隐藏掉杂乱的 update,tmp 之类的临时提交。

    git rebase -i HEAD~n 这个参数 n 数起来太麻烦了吧

    绝大多数情况下,你想整理的是“当前分支相对于主分支(main)的所有新增提交”。此时直接用分支名作为参数:

    git rebase -i main
    

    原理:Git 会自动找出当前分支与 main 的分叉点,只把分叉点之后的提交列出来。你完全不需要知道有几个,Git 帮你数。

    git rebase -i HEAD~n 中的参数 -i 代表什么

    -i 是 –interactive(交互式)的缩写。

    这个参数是 git rebase 最强大的“灵魂”所在。加上它,Git 会打开一个文本编辑器(比如 Vim、Nano 或 VS Code),让你在真正执行变基之前,手动干预并修改提交列表。

    pick squash fixup 的区别

    这三个命令的本质区别在于:合并提交时,如何处理被合并的那条“提交说明”(Commit Message)

    为了让你秒懂,我们先假设变基列表里有相邻的两行:

    pick  A  “添加用户登录功能”
    pick  B  “修复登录功能的拼写错误”
    

    现在,你想把 B 合并进 A,看看三种操作的结果:


    1. pick(保留)

    • 含义原封不动地保留该提交,什么都不做。
    • 代码变化:保留。
    • 提交说明:保留。
    • 结果:上面两行依然是 两个独立的提交

    2. squash(压缩 + 保留注释)

    • 含义:将该提交合并上一个(即 A)提交中。重点:合并后,Git 会强制弹出编辑器,让你把 A 和 B 的注释混在一起重新编辑。
    • 代码变化:B 的改动合并进 A。
    • 提交说明保留 B 的注释(供你手动编辑融合)。
    • 结果:变成了 1 个提交。你需要在编辑器里写下类似 feat: 添加登录功能 (修复拼写) 的新注释。

    3. fixup(压缩 + 丢弃注释)

    • 含义:将该提交合并上一个(即 A)提交中。重点:合并后,Git 直接丢掉 B 的注释,只保留 A 的原始注释,不再弹出编辑器打扰你。
    • 代码变化:B 的改动合并进 A。
    • 提交说明彻底丢弃 B 的注释。
    • 结果:变成了 1 个提交,且注释依然是 “添加用户登录功能”

    核心差异一览表

    命令 是否合并代码? 是否弹出编辑器让你改注释? 最终提交注释来自哪里?
    pick ❌ 不合并,保留独立 ❌ 不弹出 各自保留原样
    squash ✅ 合并到上一个 弹出 A + B 融合(需手动整理)
    fixup ✅ 合并到上一个 不会弹出(静默执行) 只保留 A,丢弃 B

    到底什么时候用哪个?(实战选择指南)

    • pick:你希望保留每一个开发步骤,按逻辑拆分成多个干净的提交(比如“添加接口”、“添加单元测试”、“添加文档”分开)。
    • squash:你写了一个功能,中间有 3 次临时提交(savetmpfix bug),但你想重新取一个有意义的最终名字(比如把三个拼成一个叫 feat: 大功能上线)。因为 squash 逼你重写注释,能防止你忘记改掉 tmp 这种烂名字。
    • fixup:你刚提交完 A,马上发现有个字母拼错了,紧急补了一个 B(fix typo)。你不需要在合并后的注释里保留“修复拼写”这种废话,直接用 fixup,干净的 A 注释就留下来了,效率最高

    💡 进阶小技巧
    如果你确定要把某个提交设为 fixup,甚至不用进编辑器手动改单词。你可以在平时提交时就提前标记:

    git commit --fixup A的哈希值
    

    之后执行 git rebase -i main --autosquash,Git 会自动把那个提交标记为 fixup 并排到 A 下面,你只需保存退出,全程不用手敲 squashfixup。需要我展开讲讲这个 --autosquash 的完整配置流程吗?😊

    Unlink of file xxx failed

    Unlink of file ‘.git/objects/pack/pack-25024388ac3f483813c14bb68efeb3fc9adc1fee.idx’ failed. Should I try again?

    大概率是文件被安全软件占用,关闭 vscode,或者重启电脑

    git rebase --continue
    

    不要保留多行 message

    commit xxx (HEAD -> login)
    Author: Zhongwei Sun <zhongwei_sun@xxx>
    Date:   Wed Jul 15 19:53:52 2026 +0800
    
        替换 logo
    
        英文字体
    
        背景图压缩
    

    最好是编辑修改成一行,或者在 message 里加上 # 注释掉不想保留的内容。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式