首页/开发/Git 与协作速查/变基中的空提交与 --empty
合并变基与冲突71 条

变基中的空提交与 --empty

重放后内容已被上游包含的提交会变成空提交;用 --empty=drop|keep|stop 控制行为,避免历史里出现无意义空提交或意外停下。

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

变基中的空提交是什么

变基会把分支提交逐个重放到新基点:内容已经被上游包含的提交重放后会变成空变更。用 --empty=drop|keep|stop 控制这类提交的处理;已被应用过的提交会先以 skipped previously applied commit 的提示被跳过。分清这两种来源,才能解释变基输出与结果差异。

基本信息

两种来源已被上游包含(直接跳过并提示)、重放后变为空(由 --empty 控制)
显式控制git rebase --empty=drop|keep|stop <上游>
旧参数--keep-empty 等价于保留空提交
默认行为非交互默认丢弃;交互模式遇到变空会停下待处理
相关提示skipped previously applied 与 --reapply-cherry-picks
预判手段git cherry 按补丁对比上游是否已包含某提交

典型使用场景

  • 分支落后很久再同步:大量提交已被上游包含,批量跳过是预期行为
  • 清理重复提交:确认空提交无价值后让 drop 保持历史干净
  • 交互变基中途变空:根据提示判断是继续、跳过还是保留
  • 谨慎审查:用 --empty=stop 逐条确认再继续
  • 变基前预判:用 git cherry 查看哪些提交已被上游包含

常用示例

常用示例
git rebase --empty=drop origin/main    # 空提交直接丢弃
(非交互模式的默认即如此)
git rebase --empty=keep origin/main    # 保留空提交,旧写法 --keep-empty
git rebase --empty=stop origin/main    # 遇空提交停下,人工判断
git rebase -i origin/main              # 交互模式默认在变空处停下

遇空提交怎么办

情况判断依据动作
提交改动已在上游提示 patch contents already upstream让它丢弃,无需处理
重放后变空但本应有改动解决冲突时内容可能被吃掉停下检查,不要急着跳过
确认无价值的空提交历史清理场景--empty=drop 保持干净
想保留提交结构发布演练或审计要求--empty=keep
交互变基在空提交处停下时,提示可用 git commit --allow-empty 保留或 git rebase --skip 跳过,按场景二选一,处理完继续用 git rebase --continue 推进剩余提交。
大量空提交通常说明分支与主干有重叠:先确认这次变基是否必要,避免把同步问题包装成操作问题,可先看分支与上游的提交交集再决定。

易错点

  • stop 在批量场景卡住:每个空提交都停下等人工处理,脚本化流程先想清楚要用 drop 还是 keep
  • drop 掩盖真实问题:本该有改动却重复的提交被静默丢弃时要排查来源,例如 cherry-pick 重复或补丁已在别处合入
  • 混淆两种跳过:skipped previously applied 与 dropping 空提交的提示不同,排查先读完整输出
  • 依赖默认值写脚本:非交互与交互模式的默认不同,团队脚本要显式指定 --empty

数据来源与参考

  • Git 官方文档:git-rebase(--empty)
  • Git 2.26 Release Notes
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌