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

 

即可把几十个甚至上百个中间提交压缩成主分支上的一个提交。

posted on 2026-09-25 21:06  ENGINEER-F  阅读(2)  评论(0)    收藏  举报