当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101
来修复它,但是,当前正在dev
上进行的工作还没有提交(而且还未完成,无法提交,而bug需要立即开始修复),此时如果直接切换到master分支或者创建并切换到issue-101分支,会将当前修改也带到master分支或者新的分支上。
幸好,Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
储藏工作现场: git stash
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
现在再用 git status 查看工作区状态,就是干净的
该如何处理 代号为 101 的 bug 任务呢?
(1)首先确定要在哪个分支上修复bug,假定需要在master
分支上修复,就从master
创建临时分支
git checkout master
git switch -c issue-101 / git checkout -b issue-101
$ 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)
$ git checkout -b issue-101
Switched to a new branch 'issue-101'
(2)在新分支(以 issue-101分支为例)上修改bug并提交到本地版本库
...fix bug...
git add ...
git commit -m '....'
(3)修复完成后,切换到master
分支,并完成合并,最后删除issue-101
分支:
git checkout master
git merge --no-ff -m 'merged bug fix 101' issue-101
git branch -d issue-101
(4)bug修复完成,可切换回 dev 分支继续干活啦
git switch dev
切换回工作分支dev后,如何恢复工作现场呢?
(1)查看工作现场储藏列表:git stash list
(2) 恢复储藏的工作现场
方式一:
恢复最近一次储藏的工作现场(不删除恢复的工作现场):git stash apply
方式二:
恢复最近一次储藏的工作现场(且删除恢复的工作现场):git stash pop
方式三:
恢复指定的储藏的工作现场(不删除恢复的工作现场):git stash apply stash@{xx}
清空工作现场储藏列表:git stash clear
eg. git stash apply stash@{2}
如何将此次bug修改同步到dev(其他分支)上呢?
把修改“复制”到当前分支:git cherry-pick commit_id
(1)找到在 issue-101 上提交代码的 commit_id (尤其需要注意,commit_id是修改bug时提交的那个,不是合并到master分支上的那个!!!),
(2)在需要合并修改的那个分支上执行 git cherry-pick <commit_id>
注意,如果使用 git cherry-pick 合并代码时存在代码冲突:
在 dev 分支(当前工作的分支)上提交代码到版本库后再使用 git cherry-pick <commit_id>进行代码复制,因为只有在代码都提交以后才可以进行代码的冲突解决合并。