Git Squash Merge 使用指南
一、什么是 squash merge
squash merge 是 Git 中一种:
只合并代码,不合并提交历史
的合并方式。
适用于:
- 个人开发分支
- 临时功能分支
- 不希望暴露开发过程
- 不希望远程出现大量 commit
- 想保持提交记录干净
二、为什么使用 squash merge
假设:
huawei 分支
text
A---Bdev 分支
text
A---B---C---D---E其中:
- C D E 是自己开发过程中的提交
如果直接:
bash
git merge dev最终:
text
A---B--------M
\ /
C----D----E远程会看到:
- 所有开发记录
- merge commit
- 分支关系
提交历史会越来越乱。
三、squash merge 的效果
执行:
bash
git merge --squash dev最终:
text
A---B---X其中:
- X 是一个新的提交
- C D E 不会进入远程历史
效果相当于:
把 dev 的所有代码压缩成一次提交。
四、核心特点
| 特点 | squash merge |
|---|---|
| 合并代码 | ✅ |
| 合并 commit 历史 | ❌ |
| 产生 merge commit | ❌ |
| 提交记录干净 | ✅ |
| 适合个人开发 | ✅ |
五、推荐开发流程
1. 切换到公共分支
bash
git checkout huawei2. 拉取最新代码
bash
git pull确保本地分支最新。
3. squash 合并 dev
bash
git merge --squash dev执行后:
- 代码会进入暂存区
- 但不会自动 commit
- 不会生成 merge commit
4. 查看状态
bash
git status会看到:
text
Changes to be committed说明代码已经进入暂存区。
5. 提交代码
bash
git commit -m "新增xxx功能"此时:
- 会生成一个全新的 commit
- 不会保留 dev 的历史记录
6. 推送远程
bash
git push远程只能看到:
text
新增xxx功能看不到:
- dev 分支
- dev 的 commit
- merge 历史
六、完整操作示例
当前情况
huawei
text
A---Bdev
text
A---B---C---D---E执行
bash
git checkout huawei
git pull
git merge --squash dev
git commit -m "新增用户功能"
git push最终结果
text
A---B---X其中:
- X 包含了 C D E 的所有代码
- 但不会暴露开发过程
七、常见问题
1. squash merge 后为什么没有自动 commit?
因为:
bash
git merge --squash只会:
- 合并代码
- 放入暂存区
不会自动提交。
需要手动:
bash
git commit2. squash merge 会删除 dev 分支吗?
不会。
只是:
- 复制代码
- 不影响 dev 分支
3. squash merge 后还能继续开发吗?
可以。
dev 分支不会受到影响。
4. squash merge 会产生 merge commit 吗?
不会。
这是它最大的优点之一。
八、推荐使用场景
适合:
- 个人开发分支
- 功能开发分支
- 实验分支
- 临时分支
- 提交记录需要干净的项目
九、不推荐直接 merge 的原因
直接:
bash
git merge dev会:
- 暴露开发过程
- 出现大量 commit
- 出现 merge commit
- 提交记录混乱
尤其多人协作时:
Git 图会越来越复杂。
十、推荐命令速查
squash merge
bash
git merge --squash dev提交代码
bash
git commit -m "新增功能"推送远程
bash
git push查看提交图
bash
git log --oneline --graph十一、最佳实践(推荐)
bash
# 更新公共分支
git checkout huawei
git pull
# 合并个人开发代码
git merge --squash dev
# 提交
git commit -m "新增xxx功能"
# 推送
git push十二、总结
| 方案 | 是否暴露开发历史 | 是否产生 merge commit | 提交记录 |
|---|---|---|---|
| merge | 会 | 会 | 复杂 |
| rebase | 会 | 不会 | 较干净 |
| squash merge | 不会 | 不会 | 最干净 |
十三、结论
对于:
- 本地个人开发分支
- 不想提交 dev 历史
- 希望远程提交干净
最推荐:
bash
git merge --squash dev