Git 实战: 利用 stash 保存当前未完成工作
文章目录
- Git 实战: 利用 stash 保存当前未完成工作
- 前言
-
- 场景
- 正文
-
- 1. 使用 stash 保存未完成工作
- 2. 恢复修改
- 3. 在不同 commit 恢复修改
- 4. 恢复记录产生冲突
-
- 4.1 冲突后记录未消失
- 5. 总结
- 结语
- 其他资源
-
- 参考连接
- 完整代码示例
前言
场景
在我们使用 git 的时候可能会有这样的一种场景:当前分支上的工作未完成,但是我们又需要立马切换到另一个分支上调整代码,这时候我们有几个选择:
- 先 commit 一次,将当前未完成的内容作为一次记录提交,之后在透过 reset 回退一次记录
然而这种用法是不太优雅的,因为使用 git 进行版本管理的初衷就是保持 commit 记录的不可变性,所以 reset 回退的操作是我们希望尽量避免的
这时候我们就可以借助 git stash 这个方法来为我们完成这个任务
正文
1. 使用 stash 保存未完成工作
stash 命令就好像将内容提交到一个特殊的队列当中作为一个特殊的 commit,但是不会添加任何记录到当前分支,我们可以透过
git stash
命令来完成这个操作
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMhVTZldTO0IDMxEDNilDNxUTZhJGO3UWNlJmZmN2Mj9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
然而如上图所示,对于 Untracked 的纪录,stash 是看不见的(就像我们刚刚说的,stash 就好像一种特殊的 commit,一样需要先 add 才能commit)
我们可以看到 add 过后就能成功 stash 保存修改了;另外所有 stash 记录就好像一个栈一样,可以保存多条记录,我们可以使用
git stash list
命令来查看 stash 栈
2. 恢复修改
git stash
保存记录之后,我们爱干嘛干嘛去,再回到这个分支的时候就可以使用
git stash pop
恢复记录(也可以使用
git stash pop [email protected]{n}
来恢复第 n 条记录)
3. 在不同 commit 恢复修改
当然由于 stash 本质上就是一个特殊的 commit,所以我们还可以在原分支已经存在其他提交之后再恢复记录
这个暂存的 stash 记录就好像一个浮动的 commit,恢复之后天生就自带类似 rebase 的效果
4. 恢复记录产生冲突
最后一种场景,就是后来 commit 的纪录与 stash 的纪录产生冲突了,这时候我们再 pop 恢复记录,git 就会自动帮我们变成类似 merge 冲突时的处理情况,改一下内容再 commit 就行了
4.1 冲突后记录未消失
这里又一个小问题在于,当我们 pop 之后而产生冲突的时候,git 会认为我们还没 pop 所以没有删除记录,然而实际上未完成代码是已经恢复到当前工作区的,这时候我们就需要使用
git stash drop
、
git stash drop [email protected]{n}
来手动删除记录
5. 总结
最后汇总一下关于 stash 的各种指令
-
保存未完成修改记录git stash
-
查看保存记录git stash list
-
恢复新的一条记录git stash pop
-
恢复指定记录git stash pop [email protected]{n}
-
删除最新纪录git stash drop
-
删除指定记录git stash drop [email protected]{n}
结语
本篇介绍 git stash 的用法,是一种比起使用 commit + reset 来说更为优雅的处理方式,毕竟未完成修改本身本来就不应该归类为一个完整的 commit 提交来处理。
其他资源
参考连接
Title | Link |
---|---|
【狀況題】手邊的工作做到一半,臨時要切換到別的任務 | https://gitbook.tw/chapters/faq/stash.html |
git stash pop 冲突,git stash list 中的记录不会自动删除的解决方法 | https://www.cnblogs.com/wshiqtb/p/7100248.html |
记录一次git stash找回删除的存储 | https://www.cnblogs.com/shuhaonb/p/12530107.html |
完整代码示例
https://github.com/superfreeeee/Blog-code/tree/main/others/tools/git_stash