antiqueeeee

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

背景

假设main分支为生产环境代码,开发任务在dev分支上实现,开发完成后合并main分支并在生产服务器上部署。此时同事反馈main上有bug,dev分支有新commit但还未完成测试,需要临时修复main分支bug。

整体思路

在main分支的基础上临时创建一个分支,修复bug并合并到main分支,后续再考虑如何处理dev分支。

操作步骤

  1. 从main新建一个临时分支修复bug
git checkout main 
git pull origin main
git checkout -b hotfix/main-bug-fix

checkoutb -b 后的分支名可按需更改,文中以hotfix为例。

  1. 在新创建的hotfix分支上修改代码,专注于修复main上的问题
  2. 修改后提交推送到远程:
git add .
git commit -m "fix:修复main分支上的...问题"
git push origin hotfix/main-bug-fix
  1. 提交合并请求(Pull Request / Merge Request),目标分支是main,合并代码。
    至此main分支上的bug已处理完毕,部署代码生效即可。

dev上代码处理方式

  1. 如果dev上最近几个commit是“纯粹失败的尝试”,不需要保留,可以直接遗弃
# 查看dev历史
git checkout dev
git log --oneline
# 找到最后一个稳定的 commit(假设是 abc1234),然后回退
git reset --hard abc1234
git push origin dev --force

reset --hard :本地直接丢弃之后的提交
push --force : 强制把远程dev也回退到这个提交,会重新历史,需要团队确认没人基于这些坏commit继续开发,否则会冲突

  1. dev上commit有部分代码有用,不想完全丢
    两种方式可以考虑:
    1) 使用revert,丢弃“坏commit”
git checkout dev
git revert <坏提交1ID> <坏提交2ID> ...
git push origin dev

2) 交互式rebase清理历史(多人协作慎用)

git checkout dev
git rebase -i <最后一个稳定提交的前一个提交ID>

在编辑器中对像丢弃的提交标记为drop,或直接删除哪一行,对想合并整理的commit用squash。

完成后如果要推到远程:

git push origin dev --force

这种方式能让 dev 的历史变得“干净”,但会重写历史,需要团队配合。

hotfix修复好后,main的修复要同步回dev

git checkout dev
git pull origin dev
git merge main   # 或者 git rebase main
  • 如果你希望dev始终在main之上演进,可以使用git rebase main
  • 如何项目已经合并历史很复杂,用git merge main更直观、安全一些。
    解决好冲突后,即可继续在dev上开发。

如果当前已经在dev上开发到一半,还没整理好,可以先stash,将main合并到dev之后,再取出stash:

git stash
# 合并操作省略
git checkout dev
git stash pop

这样不会影响你正在进行中的开发。

posted on 2025-12-04 10:59  Antiqueeeee  阅读(6)  评论(0)    收藏  举报