git代码压缩合并

241 阅读5分钟

好的,没问题。这是一篇详细的指南,教你如何将 Git 的 main 分支上的多次提交压缩(Squash)并部署到生产分支(例如 productionprod)。文章包含了每一步的命令说明和示意图。


如何将 Git Main 分支的提交压缩合并到生产分支

在团队协作开发中,mainmaster 分支通常记录了完整的、细粒度的开发历史,包含了很多“修复 typo”、“临时调试”之类的提交。但直接将这些琐碎的提交记录带到生产环境既不整洁,也不利于回滚和排查问题。

“压缩提交”(Squash and Merge) 是一种最佳实践,它可以将一个功能分支或一段时间内的所有提交合并为一个清晰、单一的提交,再部署到生产环境。这样做的好处是:

  • 历史清晰:生产分支的提交历史只包含一个个完整的版本更新点。
  • 易于回滚:回滚一个版本就等于回滚整个功能,而不是某个功能的某个小修复。
  • 降低冲突:合并时处理冲突的次数更少。

下面我们通过一个完整的示例和图片来说明这个过程。


整体流程概览

整个流程可以分为三个主要步骤,如下图所示:

flowchart TD
    A[从main分支切出功能分支<br>进行开发] --> B[开发完成<br>功能分支合并回main分支<br>产生大量细碎提交]
    B --> C[从main分支切出生产分支]
    C --> D{生产发布}
    D -- 方案一:常规合并<br>历史不整洁 --> E[直接合并<br>不推荐]
    D -- 方案二:压缩提交<br>历史清晰 --> F[交互式变基<br>压缩提交]
    F --> G[强制推送到远端<br>git push origin prod --force-with-lease]
    G --> H[干净的生产分支历史]

我们将按照上述流程中的“方案二”来展开详细步骤。


第一步:准备工作(在 main 分支上)

假设你的 main 分支已经经过了一段时期的开发,有了新的提交,准备发布到生产环境。我们首先基于 main 分支创建一个专门的生产分支 prod

  1. 确保本地 main 分支是最新的

    git checkout main
    git fetch origin
    git pull origin main
    
  2. 创建并切换到生产分支 prod

    git checkout -b prod
    # 现在你就在本地的 prod 分支上了,它的内容与 main 分支完全相同
    

第二步:压缩提交(在 prod 分支上)

这是最核心的一步。我们将使用 Git 的 interactive rebase(交互式变基)来压缩提交。

  1. 找到要压缩的提交范围。 你需要找到一个基准点,即上一次生产发布时的提交。使用 git log 来查看历史。假设你找到的那个基准提交的哈希值是 a1b2c3d(在实际使用时替换为你的真实提交哈希)。

  2. 执行交互式变基命令

    git rebase -i a1b2c3d
    

    -i 代表交互模式。这个命令会打开一个文本编辑器(如 Vim 或 VSCode),列出所有自 a1b2c3d 之后的提交。

  3. 编辑变基指令: 编辑器打开后,你会看到类似这样的内容:

    pick 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):将此提交压缩到前一个提交中,但丢弃本提交的提交消息。

    我们的目标是保留最上面的一条消息(通常是最重要的功能说明),将后面的压缩进去。修改如下:

    pick 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
    

    保存并关闭编辑器。

  4. 编写新的提交消息: 接着,Git 会打开另一个编辑器窗口让你为这个全新的、压缩后的提交编写一条消息。你可以保留第一条消息,并酌情添加或修改详情。

    编辑好后保存关闭。至此,本地 prod 分支的提交历史已经被重写,所有提交被压缩成了一个。

  5. (可选)验证历史: 使用 git log --oneline 查看,你会发现凌乱的历史变成了一条干净的新提交。


第三步:推送到远程仓库

由于你使用 rebase 改写了提交历史,直接使用 git push 会失败。必须使用强制推送

重要:强制推送非常危险,因为它会用你的本地版本覆盖远程版本。确保你是唯一一个在这个分支上工作的人!

  1. 强制推送 prod 分支
    git 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) 作为备份,方便出错时恢复。

通过以上步骤,你就可以得到一个干净、整洁、易于管理生产版本的生产分支了!