Feature 分支开发过程中有很多中间提交(WIP、调试提交、临时提交),合入主分支时不想保留这些历史,只希望主分支看到 Feature 的最终结果。
如果你的目标是:
Feature 分支开发过程中有很多中间提交(WIP、调试提交、临时提交),合入主分支时不想保留这些历史,只希望主分支看到 Feature 的最终结果。
有几种常见做法。
方法1:Squash Merge(最推荐)
假设:
main
A --- B --- C
feature
A --- B --- C --- D --- E --- F --- G
↑ ↑ ↑
很多中间提交
合并时:
git checkout main
git merge --squash feature
Git 会:
- 将 D~G 的所有修改一次性应用到 main
- 不保留 D~G 的提交历史
- 等待你重新提交
然后:
git commit -m "Add XXX feature"
``
最终:
main
A --- B --- C --- H
feature
A --- B --- C --- D --- E --- F --- G
主分支只有一个提交:
H = Add XXX feature
这是企业开发中最常见的做法。
方法2:Pull Request 使用 Squash Merge
GitHub、GitLab、Azure DevOps 都支持:
Create PR
↓
Squash and merge
最终结果与:
git merge --squash feature
``
完全一样。
例如:
feature
├─ fix compile
├─ update config
├─ debug log
├─ fix typo
└─ final implementation
合并后:
main
└─ Implement PCIe hot reset support
主分支历史非常干净。
方法3:Feature 分支先 Rebase/Squash
合并前整理历史:
git checkout feature
git rebase -i main
例如:
pick D
pick E
pick F
pick G
改成:
pick D
squash E
squash F
squash G
完成后:
feature
A --- B --- C --- X
然后:
git checkout main
git merge feature
结果:
A --- B --- C --- X
主分支也只有一个提交。
方法4:直接取最终状态(最彻底)
如果 feature 历史完全不重要,仅关心最终文件内容:
git checkout main
git checkout feature -- .
或者:
git restore --source=feature .
提交:
git commit -m "Import feature final version"
本质上:
只拷贝最终文件状态
不带任何feature历史
适用于:
- 大量重构
- 第三方代码导入
- Framework迁移
方法5:生成一个新 Commit(推荐大改动)
找到共同祖先:
git merge-base main feature
假设输出:
abc123
创建一个最终补丁:
git diff abc123 feature > feature.patch
切回:
git checkout main
git apply feature.patch
git commit -m "Feature final implementation"
这样主分支只产生:
1个提交
且不带 feature 历史。
实际项目推荐
如果走PR
直接选择:
Squash and Merge
如果命令行操作
git checkout main
git merge --squash feature
git commit -m "XXX Feature"
这是最简单、最安全、最符合团队协作习惯的方案。
查看最终会提交什么
合并前先确认:
git diff main..feature
或者:
git log --oneline main..feature
确认最终差异没问题后:
git merge --squash feature
即可把几十个甚至上百个中间提交压缩成主分支上的一个提交。
Time is like a fleeting show!
posted on 2026-09-25 21:06 ENGINEER-F 阅读(2) 评论(0) 收藏 举报
浙公网安备 33010602011771号