首页/开发/Git 与协作速查/公共分支不要改写历史
合并变基与冲突71 条

公共分支不要改写历史

在已推送并被他人拉取的分支上做变基,会让旧提交与重写后的提交并存,制造分叉与重复变更;公共分支只追加提交。

Git 与协作速查开发更新于 2026-10-13

这条原则说的是什么

在已经推送、并且别人可能已经拉取过的分支上做变基或其它改写历史的操作,会让旧提交与重写后的提交同时存在,协作者手里就会出现两条互不相干的历史。公共分支(主干、开发线、发布线)的正确做法是只追加提交,改写留给私有分支。

怎么判断分支是不是私有的

最直接的判断是看有没有别人引用过它,而不是凭印象。可以查看远端分支里是否包含某个提交,也可以看这条分支上有没有他人的提交记录。另一个明显信号是有没有对应的合并请求:一旦开了 PR,就等于对外声明了这条分支的历史,后续不应该再改写。

基本信息

适用平台Git 工作流通用原则,与托管平台无关
适用对象主干、开发线、发布线等共享分支
私有分支可以变基、整理、强推
判断方法git branch -r --contains <提交> 查看谁引用了它
补救方式让协作者按变基方式拉取,或尽快合并后停止改写
制度配套分支保护规则可以从机制上禁止改写

典型使用场景

  • 制定规范:在贡献指南里写清哪些分支禁止改写历史
  • 评审前自查:准备强推前确认分支是否已被他人引用
  • 事故善后:同事遇到历史分叉时如何恢复对齐
  • 保护主干:用平台的分支保护规则挡掉强推
  • 拆分工作:把整理提交的活儿挪到私有分支上进行

常用示例

常用示例
git log --oneline origin/feature | head   # 查看远端分支顶部的提交
git branch -r --contains <提交>           # 远端分支里是否包含它
git for-each-ref --contains <提交> --format='%(refname:short)'
git reflog show feature | head            # 本地是否有改写痕迹
git fetch --prune                         # 同步远端分支现状

分支类型与允许的操作

分支类型允许改写典型操作
主干与发布分支否只追加提交,走 PR 或 MR 合入
长期开发分支否追加提交,定期合并
私有功能分支是变基、amend、安全强推
已开合并请求的分支基本不变改写前先与评审人沟通
变基已经发生的补救方式:让协作者用变基方式拉取以便对齐,或者尽快把分支合并掉并停止继续改写历史。
「只我一人用这条分支」的判断经常过期。动手前再查一次谁引用了它,尤其是在多人协作的仓库里。

易错点

  • 「只我一人用这条分支」的判断经常过期,动手前再查一次谁引用了它
  • 对公共分支强推后旧提交进入悬空状态,在回收之前仍会干扰排查与对比
  • 开了合并请求之后再改写历史,会让评审页面上的提交线索对不上
  • 把整理历史的习惯带到共享分支上,会迫使所有协作者手动对齐,代价常被低估

数据来源与参考

  • Git 官方文档:git-rebase(Recovering from Upstream Rebase)
  • Pro Git 2nd Edition · 3.6 变基
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌