这是一个很好的 Git 工作流问题!让我给你分析一下:
🔄 三分支工作流分析
你的工作流:dev_01 → uat → main
📊 Merge vs Rebase 对比
Merge(合并)
优点:
✅ 保留完整历史,可以看到合并点
✅ 不重写历史,更安全
✅ 适合公共分支(uat、main)
✅ 可以清楚看到功能分支的开发时间线
缺点:
❌ 会有 merge commit(如果分叉)
❌ 历史稍显复杂
Rebase(变基)
优点:
✅ 线性历史,更清晰
✅ 避免不必要的 merge commit
✅ 更容易定位问题(线性追踪)
缺点:
❌ 重写历史,改变 commit hash
❌ 在共享分支上很危险(可能影响他人)
🎯 推荐策略
根据你的工作流,我建议混合使用:
1. dev_01 → uat: 使用 Rebase ⭐
# 在 dev_01 分支
git checkout dev_01
git rebase uat # 将 dev_01 的提交变基到 uat 上
git checkout uat
git merge dev_01 # 快进合并
为什么用 Rebase?
uat 是测试环境,dev_01 是你自己的开发分支
保持线性历史,更容易追踪问题
没有协作风险(你自己用)
2. uat → main: 使用 Merge ⭐⭐⭐
# 在 main 分支
git checkout main
git merge uat --no-ff # 使用 --no-ff 创建 merge commit
为什么用 Merge?
✅ --no-ff (no fast-forward) 会创建合并节点
✅ 保留发布历史,清楚看到什么时候 uat 合并到 main
✅ 更安全,不会破坏 main 分支的历史
✅ 方便回滚,可以轻松 revert 整个合并
✅ 符合团队协作最佳实践
💡 最佳实践总结
操作 推荐方式 原因
dev_01 → uat Rebase 保持线性,你自己用,安全
uat → main Merge + --no-ff 保留发布历史,安全,可回滚
🔧 具体操作示例
场景 1: dev_01 测试通过 → 合并到 uat
# 1. 确保在 dev_01 分支
git checkout dev_01
# 2. 先拉取 uat 最新代码
git fetch origin uat
# 3. Rebase 到 uat(保持线性)
git rebase origin/uat
# 4. 如果有冲突,解决后继续
git add .
git rebase --continue
# 5. 推送到远程(需要 force,因为是 rebase)
git push origin dev_01 --force-with-lease
# 6. 切换到 uat,合并 dev_01
git checkout uat
git merge dev_01 # 快进合并
git push origin uat
场景 2: uat 验证完成 → 发布到 main
# 1. 切换到 main
git checkout main
# 2. 合并 uat(使用 --no-ff)
git merge uat --no-ff
# 3. 打标签(可选,但推荐)
git tag -a v1.0.0 -m "Release v1.0.0"
# 4. 推送到远程
git push origin main
git push origin --tags
⚠️ 重要原则
永远不要 Rebase 公共分支(uat、main 已推送的)
--no-ff 对 main 很重要,保留合并节点
定期同步:dev_01 经常 rebase uat,避免大量冲突
发布前打标签,方便回滚和版本管理