在软件开发过程中,bug修复是常见的任务。当你需要在Git中修复一个bug,但当前分支(例如dev
)上还有未完成的工作时,你可以使用Git的stash
功能来临时保存你的工作进度,然后切换到其他分支(如master
)进行bug修复。
还是沿用之前的例子,首先,使用git stash
保存当前分支dev
的工作进度:
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
这会创建一个stash,你可以在git stash list
中看到它。现在你的工作区是干净的,可以安全地创建一个新的分支来修复bug。假设你需要在master
分支上修复bug,你可以这样做:
$ 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'
在新分支issue-101
上修复bug,例如修改readme.txt
文件,然后提交更改:
$ git add readme.txt
$ git commit -m "fix bug 101"
[issue-101 4c805e2] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
修复完成后,切换回master
分支并合并issue-101
分支:
$ git switch master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
(use "git push" to publish your local commits)
$ git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
现在,你可以删除issue-101
分支:
$ git branch -d issue-101
Deleted branch issue-101 (was 4c805e2).
最后,你可以切换回dev
分支并恢复之前保存的工作进度。使用git stash pop
来恢复并删除stash:
$ git switch dev
Switched to branch 'dev'
$ git stash pop
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.py
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
Dropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a)
现在,你可以继续在dev
分支上进行你的工作。如果你需要查看所有的stash,可以使用git stash list
命令。如果你想要恢复特定的stash,可以使用git stash apply
命令,但记得使用git stash drop
来清理不再需要的stash。
当在master
分支上修复了一个bug后,通常这个bug也会存在于dev
分支上,因为dev
分支是从master
分支衍生出来的。为了在dev
分支上也修复这个bug,你不需要重复整个修复过程,Git提供了一个非常方便的命令cherry-pick
,它允许你将一个特定的提交(在这个例子中是修复bug的提交)应用到当前分支。
首先,你需要确定dev
分支上没有未提交的更改,如果有,你需要先提交或者stash它们。然后,你可以使用git cherry-pick
命令来复制master
分支上的修复提交到dev
分支。这里是如何操作的:
确保dev
分支是当前分支:
$ git checkout dev
使用git cherry-pick
命令来应用master
分支上的修复提交:
$ git cherry-pick 4c805e2
这里4c805e2
是修复bug提交的哈希值。执行这个命令后,Git会将这个提交的更改应用到dev
分支上,并创建一个新的提交。这个新的提交会有一个不同的哈希值,因为它是在不同的分支上创建的。
如果cherry-pick
过程中没有冲突,Git会自动创建一个新的提交。如果有冲突,你需要手动解决这些冲突,然后继续提交过程。
这样,你就在dev
分支上“重放了”master
分支上的修复,而不需要重复修复bug的过程。这种方法不仅节省时间,而且保持了代码的一致性。如果你在dev
分支上修复了bug,然后想要在master
分支上应用这个修复,你同样可以使用git cherry-pick
命令,但在此之前,你可能需要使用git stash
来保存dev
分支上的当前工作进度。