背景
假设main分支为生产环境代码,开发任务在dev分支上实现,开发完成后合并main分支并在生产服务器上部署。此时同事反馈main上有bug,dev分支有新commit但还未完成测试,需要临时修复main分支bug。
整体思路
在main分支的基础上临时创建一个分支,修复bug并合并到main分支,后续再考虑如何处理dev分支。
操作步骤
- 从main新建一个临时分支修复bug
git checkout main
git pull origin main
git checkout -b hotfix/main-bug-fix
checkoutb -b 后的分支名可按需更改,文中以hotfix为例。
- 在新创建的hotfix分支上修改代码,专注于修复main上的问题
- 修改后提交推送到远程:
git add .
git commit -m "fix:修复main分支上的...问题"
git push origin hotfix/main-bug-fix
- 提交合并请求(Pull Request / Merge Request),目标分支是main,合并代码。
至此main分支上的bug已处理完毕,部署代码生效即可。
dev上代码处理方式
- 如果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继续开发,否则会冲突
- 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
这样不会影响你正在进行中的开发。
浙公网安备 33010602011771号