软件开发中,bug就像家常便饭一样。

有了bug就需要修复,在Git中,由于分支是如此的强大,
所以,每个bug都可以通过一个新的临时分支来修复,
修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,
很自然地,你想创建一个分支issue-101来修复它
但是,等等,当前正在dev上进行的工作还没有提交:

并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

git stash

$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge


现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

git checkout master

git checkout -b issue-101

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:

$ 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'

git commit -am “…”

现在修复bug,需要把“Git is free software …”改为“Git is a free software …”,然后提交:

git checkout master

git merge issue-101

git branch -d issue-101

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:

恢复 stash ( <mstyle mathcolor="&#35;ff0011"> g i t s t a s h p o p </mstyle> \color{#ff0011}{git-stash-pop} gitstashpop)(git stash apply)

工作现场还在,Git把stash内容存在某个地方了,但是<mark>需要恢复一下,有两个办法</mark>:

  • 一是用git stash apply恢复
    但是恢复后,<mark>stash内容并不删除</mark>,你需要用git stash drop来删除;

  • 另一种方式是用git stash pop,恢复的同时把stash内容也删了:

git stash list

<mstyle mathcolor="&#35;ff0011"> </mstyle> \color{#ff0011}{**注意**}

  • 你可以<mark>多次stash</mark>,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:




修复dev

在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。

那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?

有木有更简单的方法?

有!


git cherry-pick <指针> <mstyle mathcolor="&#35;ff0011"> </mstyle> \color{#ff0011}{看链接}

  • 《[Git]执行git stash pop时的冲突解决》https://blog.csdn.net/jy692405180/article/details/78520251
    <mstyle mathcolor="&#35;ff0011"> </mstyle> \color{#ff0011}{廖雪峰一个问题没讲清楚,链接里讲了。}

同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。

为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:

$ git branch
* dev
  master
$ git cherry-pick 4c805e2
[master 1d4b803] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)








小结

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

  • 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

  • master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。