做过一段时间的软件开发后,程序员伙伴们基本上都会遇到这样的情况:你正在开发新功能,老板说有一个紧急问题需要修复,让你尽快处理一下。这个时候你要怎么做?冲老板一顿输出,然后乖乖的修复问题,还是继续开发现在的功能,管他三七二十一。恐怕你没得选,不过,虽然在老板面前没得选择,但是在如何不影响现在的工作,又能修复问题上,你还是有得选的,而且不止一个。
选择1
换一个目录,重新下载一份代码,在新代码上修复问题,然后提交。这种方法简单直接,但如果代码库很大的话,下载也需要点时间(可以参考《高效Git-如何快速下载代码》快速下载)。
1
2
3
4
5
6
7
8
|
mkdir bugfix && cd bugfix
git clone --depth 1 ssh://xxx.git
## coding
git add .
git commit -am "fix: #NNN XXXX"
git push
|
mkdir bugfix && cd bugfix
git clone --depth 1 ssh://xxx.git
## coding
git add .
git commit -am "fix: #NNN XXXX"
git push
选择2
临时保存现在的代码,然后从库上获取最新代码,创建一个新分支修复问题,然后提交。这种方法也勉强可以接受,只是工作目录下的文件会被替换,而且编译的中间结果文件也都没用了,需要重新编译。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
## 保存现有修改
git add .
git commit -am "temporary saved point"
git checkout -b local_dev HEAD
## 获取最新代码,然后基于主线,创建bugfix分支
git fetch
git checkout -b bugfix origin/master
## coding
git add .
git commit -am "fix: #NNN xxxx"
git push origin HEAD:master
## 切换到之前的分支继续工作
git checkout local_dev
git branch -D bugfix
|
## 保存现有修改
git add .
git commit -am "temporary saved point"
git checkout -b local_dev HEAD
## 获取最新代码,然后基于主线,创建bugfix分支
git fetch
git checkout -b bugfix origin/master
## coding
git add .
git commit -am "fix: #NNN xxxx"
git push origin HEAD:master
## 切换到之前的分支继续工作
git checkout local_dev
git branch -D bugfix
选择3
在现有代码基础上创建一个新的worktree,在这个基础上修复问题,然后提交。这种方法相信大部分人都没用过,甚至都没听过。这是git专门为这个场景增加的一个新特性,我们今天重点介绍的内容就是它。可以通过下面的命令实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
## 获取最新代码,创建新的worktree:bugfix
git fetch origin
git worktree add ../bugfix origin/master
git worktree list
## 进入到bugfix,解决问题
cd ../bugfix
# coding
git add .
git commit -m "fix: #NNN xxx"
git push origin HEAD:master
## 回到原来的项目文件夹,删除bugfix工作区
cd ../your-project/
git worktree remove bugfix
## coding
git add .
git commit -m "my work on master"
|
## 获取最新代码,创建新的worktree:bugfix
git fetch origin
git worktree add ../bugfix origin/master
git worktree list
## 进入到bugfix,解决问题
cd ../bugfix
# coding
git add .
git commit -m "fix: #NNN xxx"
git push origin HEAD:master
## 回到原来的项目文件夹,删除bugfix工作区
cd ../your-project/
git worktree remove bugfix
## coding
git add .
git commit -m "my work on master"
上面的代码创建了一个新的工作区worktree,这是另外一个bugfix目录,这个目录下是主线最新的代码,你在这个目录下修改代码,然后提交到远端仓库。之后这个bugfix目录就没用了,可以回到原来的工作目录,然后删除bugfix。继续原来的开发。是不是很方便?
还有后续
上面的三种方案都还有后续操作,那就是本地开发完成后,在push到远端服务器之前,需要rebase最新代码,可能会出现冲突,关于如何rebase,在这篇文章《Git常见问题-如何解决冲突》中有描述。