基本概念
BUG分支是通过创建临时分支独立修复问题 ,结合git stash暂存未完成工作 和git cherry-pick跨分支复用修复,实现紧急修复不中断主开发流程的工作模式
原则
- 隔离修复 ------ 每个
Bug应该通过独立临时分支(如issue-xxx)进行修复,避免污染主分支 - 灵活切换 ------ 可以使用
git stash保存未完成的工作现场,随时应对紧急任务 - 高效复用 ------ 可以使用
cherry-pick跨分支复制修复提交,避免重复劳动
原理
初始状态
- 一开始,
master分支上的代码存在bug,dev分支通过master创建新分支继承了该bug - 当前处于
dev分支进行工作,存在未完成的工作

dev 分支暂存工作
-
dev分支在切换到master分支修复Bug前,暂存未完成的工作,避免丢失
master 分支修复 Bug 并合并
- 切换到
master分支,创建issue-101临时分支进行Bug修复工作 issue-101临时分支修复Bug后,合并到master分支,并删除临时分支

dev 分支恢复工作,拉取 master 修复成果
master分支修复Bug后,切换回dev分支,恢复未完成的工作- 拉取
master分支上修复Bug的成果到dev分支

指令介绍
暂存未提交修改 git stash
-
功能 ------ 暂存当前工作目录 和暂存区的未提交修改,以便后续恢复继续工作
-
场景 ------ 在切换分支前保存半成品工作
-
语法
shgit stash [<subcommand>] [<options>] [<arguments>]子命令 subcommand功能描述 语法示例 常用选项 save保存当前修改到暂存栈 git stash save "message"-u,-a,-plist查看暂存栈列表 git stash list- show显示暂存的具体修改 git stash show stash@{n}-papply恢复暂存但不删除记录 git stash apply stash@{n}--indexpop恢复暂存并删除记录 git stash pop stash@{n}--indexdrop删除指定暂存记录 git stash drop stash@{n}- clear清空整个暂存栈 git stash clear- -
具体示例
-
保存暂存 ------ 默认子操作
savesh$ git stash -a "WIP: 开发登录功能" # 保存所有文件(包括 .gitignore 忽略的文件) $ git stash -u "WIP: 开发登录功能" # 仅保存未跟踪的文件(新增但未 git add 的文件) -
查看暂存列表 ------ 子操作
listbash$ git stash list stash@{0}: On dev: WIP: 开发登录功能 stash@{1}: On master: 紧急调试 -
恢复指定暂存 ------ 子操作
apply/pop(注意:仅恢复,不会删除记录)sh$ git stash apply stash@{0} -
删除指定暂存 ------ 子操作
drop/clearbash$ git stash drop stash@{0} # 删除指定暂存记录 $ git stash clear # 清空整个暂存栈 -
恢复并删除最近暂存 ------ 子操作
popbash$ git stash pop
-
复制指定提交到分支 git cherry-pick
-
功能 ------ 复制特定提交到当前分支,避免重复修改
-
场景 ------ 跨分支复用
Bug修复或功能提交 -
语法
shgit cherry-pick [<options>] <commit-id>选项 功能描述 -n/--no-commit只应用修改,不自动提交(需手动 git commit)-x在提交信息中追加来源提交的哈希(便于追踪) --continue继续当前 cherry-pick操作(冲突时使用)--abort取消当前 cherry-pick操作(冲突时使用) -
具体示例
-
复制单个提交 ------ 从
master分支复制Bug修复提交到devsh$ git switch dev # 切换到 dev 分支 $ git cherry-pick 4c805e2 # 复制哈希值 4c805e2 的提交 -
复制多个提交
SH$ git cherry-pick 4c805e2 7d9f3a1 # 按顺序应用提交 -
复制提交但不自动提交
sh$ git cherry-pick -n 4c805e2 # 修改应用到工作区,需手动提交 $ git commit -m "手动提交修复" -
复制提交时发生冲突
-
方法一:手动解决冲突文件
-
方法二:标记冲突已解决
sh$ git add 冲突文件 $ git cherry-pick --continue -
方法三:取消操作
sh$ git cherry-pick --abort
-
-
Bug 分支使用
相关指令
git stash------ 暂存未提交修改git cherry-pick------ 复制指定提交到分支
场景一:正在 dev 分支开发新功能,突然紧急修复 master 分支的 Bug 101,且当前分支的工作未完成无法提交
-
暂存未完成工作 ------ 输入命令
git stash暂存dev分支未完成工作sh$ git stash # 暂存工作 Saved working directory and index state WIP on dev: f52c633 add mergesh$ git stash list # 查看暂存记录(可选) stash@{0}: WIP on master: f52c633 add merge
-
修复
Bug------ 切换到master分支,创建issue-101临时分支修复Bugsh$ git checkout master # 切换到需修复的分支 Switched to branch 'master' Your branch is ahead of 'origin/master' by 6 commits. (use "git push" to publish your local commits)sh$ git checkout -b issue-101 # 创建并切换到修复分支 Switched to a new branch 'issue-101'sh# 修改 Bug... $ git add . $ git commit -m "fix bug 101" -
合并临时分支 ------ 将
issue-101临时分支合并到master分支sh$ git switch mastersh$ git merge --no-ff -m "merged fix bug 101" issue-101 # 保留合并记录sh$ git branch -d issue-101 # 删除临时分支
-
恢复开发环境 ------ 切换到
dev分支,输入命令git stash pop恢复dev分支未完成工作sh$ git switch dev # 回到原分支sh$ git stash pop # 恢复暂存的工作(自动删除 stash 记录) # 或手动恢复: $ git stash apply stash@{0} # 恢复指定暂存 $ git stash drop stash@{0} # 删除暂存 -
同步修复 ------ 将
master分支的修复同步到当前工作的dev分支sh$ git cherry-pick 4c805e2 [master 1d4b803] fix bug 101 1 file changed, 1 insertion(+), 1 deletion(-)