Git Stash - 存储你的工作成果
前面一节已经讲明白了,在切换分支之前一定要保持工作区干净,否则不仅仅是有可能产生冲突进而导致切换失败,而且可能会丢失工作区的工作成果。因此,我们实际上很需要一个暂时存储的机制。 Git Stash 就是干这个的:
- 把工作区和暂存区的成果保存到一个安全的地方。
- 回来的时候再把数据恢复出来。
举个例子
第一阶段 - 正常工作
首先,我们正常开发:
$ git checkout -b feature
$ echo This is the README file. > README
$ git add README
$ git commit -m "init"
然后我们在工作区作出修改:
$ echo Add to the working dir version of README >> README
$ echo file2 is here > file2
$ ls
file2 README
第二阶段 - 出现 bug
正当我们在工作区继续工作的时候,出现了一个紧急的线上 bug,现在的当务之急就是回到 master 分支上,然后切出一个 hot-fix 分支去修 bug。
那么目前该做的就是把当前工作区的内容储存下来。
$ git add file2
$ git stash
$ ls
README
cat README
This is the README file.
不需要把 README 添加到暂存区,因为它已经在暂存区了。Git 会发现工作区的 README 比暂存区的更新,然后把工作区的给存储下来。
从上面测试的信息可以看出来:
- 工作区的修改都藏起来了
- file2 不见了
- README 的第二行不见了
第三阶段 - 修完 bug 回到原地
修完 bug 之后回到 feature 分支,现在要做的就是把之前的状态恢复出来:
$ git stash pop
$ ls
file2 README
This is the README file.
Add to the working dir version of readme
至此,一个最简单的 stash 工作流就完成了。实际上除了切换分支之外,合并分支也有保存工作区状态的需要。
提交 WIP
除了 stash 之外,在 git_reset 这个命令的介绍里面,也提到了一个 Interrupted Workflow。
在那儿介绍的办法是,先提交未完成的工作,并把提交信息写成"WIP",然后切换分支就没有障碍了。等再切回来的时候,用git reset HEAD^
把 WIP 这个提交的 HEAD 和暂存区都撤销掉,相当于清除了这个临时的 WIP 提交。然后在工作区里接着工作,无缝连接。具体可以参考git_reset。