好的,没问题。这是一篇详细的指南,教你如何将 Git 的 main
分支上的多次提交压缩(Squash)并部署到生产分支(例如 production
或 prod
)。文章包含了每一步的命令说明和示意图。
如何将 Git Main 分支的提交压缩合并到生产分支
在团队协作开发中,main
或 master
分支通常记录了完整的、细粒度的开发历史,包含了很多"修复 typo"、"临时调试"之类的提交。但直接将这些琐碎的提交记录带到生产环境既不整洁,也不利于回滚和排查问题。
"压缩提交"(Squash and Merge) 是一种最佳实践,它可以将一个功能分支或一段时间内的所有提交合并为一个清晰、单一的提交,再部署到生产环境。这样做的好处是:
- 历史清晰:生产分支的提交历史只包含一个个完整的版本更新点。
- 易于回滚:回滚一个版本就等于回滚整个功能,而不是某个功能的某个小修复。
- 降低冲突:合并时处理冲突的次数更少。
下面我们通过一个完整的示例和图片来说明这个过程。
整体流程概览
整个流程可以分为三个主要步骤,如下图所示:
进行开发] --> B[开发完成
功能分支合并回main分支
产生大量细碎提交] B --> C[从main分支切出生产分支] C --> D{生产发布} D -- 方案一:常规合并
历史不整洁 --> E[直接合并
不推荐] D -- 方案二:压缩提交
历史清晰 --> F[交互式变基
压缩提交] F --> G[强制推送到远端
git push origin prod --force-with-lease] G --> H[干净的生产分支历史]
我们将按照上述流程中的"方案二"来展开详细步骤。
第一步:准备工作(在 main
分支上)
假设你的 main
分支已经经过了一段时期的开发,有了新的提交,准备发布到生产环境。我们首先基于 main
分支创建一个专门的生产分支 prod
。
-
确保本地
main
分支是最新的:bashgit checkout main git fetch origin git pull origin main
-
创建并切换到生产分支
prod
:bashgit checkout -b prod # 现在你就在本地的 prod 分支上了,它的内容与 main 分支完全相同
第二步:压缩提交(在 prod
分支上)
这是最核心的一步。我们将使用 Git 的 interactive rebase
(交互式变基)来压缩提交。
-
找到要压缩的提交范围 。 你需要找到一个基准点,即上一次生产发布时的提交 。使用
git log
来查看历史。假设你找到的那个基准提交的哈希值是a1b2c3d
(在实际使用时替换为你的真实提交哈希)。 -
执行交互式变基命令:
bashgit rebase -i a1b2c3d
-i
代表交互模式。这个命令会打开一个文本编辑器(如 Vim 或 VSCode),列出所有自a1b2c3d
之后的提交。 -
编辑变基指令: 编辑器打开后,你会看到类似这样的内容:
yamlpick e4f5g6h feat: add user profile page pick 7h8i9j0 fix: typo in page title pick k1l2m3n fix: profile image not loading pick o4p5q6r chore: update dependency
指令说明:
pick
:保留该提交。squash
(或s
):将此提交压缩到前一个提交中,并保留提交消息。fixup
(或f
):将此提交压缩到前一个提交中,但丢弃本提交的提交消息。
我们的目标是保留最上面的一条消息(通常是最重要的功能说明),将后面的压缩进去。修改如下:
yamlpick e4f5g6h feat: add user profile page squash 7h8i9j0 fix: typo in page title squash k1l2m3n fix: profile image not loading squash o4p5q6r chore: update dependency
保存并关闭编辑器。
-
编写新的提交消息: 接着,Git 会打开另一个编辑器窗口让你为这个全新的、压缩后的提交编写一条消息。你可以保留第一条消息,并酌情添加或修改详情。
编辑好后保存关闭。至此,本地
prod
分支的提交历史已经被重写,所有提交被压缩成了一个。 -
(可选)验证历史 : 使用
git log --oneline
查看,你会发现凌乱的历史变成了一条干净的新提交。
第三步:推送到远程仓库
由于你使用 rebase
改写了提交历史,直接使用 git push
会失败。必须使用强制推送。
重要:强制推送非常危险,因为它会用你的本地版本覆盖远程版本。确保你是唯一一个在这个分支上工作的人!
-
强制推送
prod
分支 :bashgit push origin prod --force-with-lease
--force-with-lease
比--force
更安全,它会检查远程分支是否有你未知的新提交,如果有则推送失败,防止覆盖他人的工作。
总结与注意事项
步骤 | 命令 | 说明 |
---|---|---|
准备 | git checkout main && git pull |
获取最新代码 |
git checkout -b prod |
创建生产分支 | |
压缩 | git rebase -i <base_commit> |
交互式变基,压缩提交 |
推送 | git push origin prod --force-with-lease |
强制推送(小心!) |
重要提醒:
- 只对个人或发布分支进行变基 :永远不要对公共的
main
分支进行变基,这会给其他协作者带来极大的混乱。 - 沟通:如果你在操作一个共享的生产分支,务必提前告知团队其他成员,让他们暂停对该分支的操作,以免他们的工作被你的强制推送覆盖。
- 备份 :在执行危险操作(如
rebase
)之前,可以给原来的分支打一个标签 (git tag backup-before-squash
) 作为备份,方便出错时恢复。
通过以上步骤,你就可以得到一个干净、整洁、易于管理生产版本的生产分支了!