当我们在维护公司项目时,可能会遇到这样的场景:我正在开发一个新功能,突然需要修一个Bug。

这个时候,有些同学是这样做的:

1
2
3
4
5
6
7
8
git add .
git commit -m 'WIP'
git checkout -b 新的分支名

...新的代码修改完成并push以后...

git checkout 老分支
...继续开发...

更有一些经验的同学,可能会这样写:

1
2
3
4
5
git stash
git checkout -b 新的分支
...新的代码修改完成并push以后...
git checkout 老分支
git stash pop

但如果在修这个Bug的时候,又来了一个更紧急的Bug需要修怎么办?到后面很容易就把前面的代码搞忘了。

其实我们有更好的办法,那就是使用git worktree命令。这个命令甚至可以让你同时在10个分支上开发,并且1秒无负担切换到任意分支。

假设现在我所在的项目文件夹为/Users/kingname/Projects/JobCleaner,在feature分支。现在来了一个Bug需要修复,于是,我只需要执行如下命令:

1
2
3
4

git worktree add ../JobCleanerBugFix master
cd ../JobCleanerBugFix
git pull origin master

此时,Git会自动在/Users/kingname/Projects/文件夹下面,创建一个新的文件夹JobCleanerBugFix。并且这个代码已经在master分支了。你可以直接使用PyCharm或者任何其他的代码编辑器,打开这个文件夹,然后像正常开发一样修复Bug。

整个过程中,/Users/kingname/Projects/JobCleaner始终是你之前开发新功能的代码,假设你之前的PyCharm有一个窗口开着这个文件夹,那么你随时可以正常在里面修改代码。

这个时候如果又来了一个更紧急的Bug了,那么你只需要在/Users/kingname/Projects/JobCleaner里面再次执行代码,创建第三个文件夹即可:

1
2
3
git worktree add ../JobCleanerP0Bug master
cd ../JobCleanerP0Bug
git pull origin master

这三个文件夹互相独立,你的IDE可以分别打开这三个文件夹,同步修改任何代码。他们完全不会有任何影响,看起来就跟3个独立的项目一样。

理论上你可以无限这样添加。

当你在/Users/kingname/Projects/JobCleanerP0Bug下面已经改完了代码,你只需要正常提交就可以了:

1
2
3
git add xxx.py yyy.py
git commit -m '修复bug'
git push origin master:bugfix

提交完成,确认没有任何问题以后,回到/Users/kingname/Projects/JobCleaner文件夹,执行命令git worktree remove ../JobCleanerP0Bug/,就会自动删除/Users/kingname/Projects/JobCleanerP0Bug文件夹。