# Git Stash 的使用

# 1. Git Stash 的作用

在开发过程中,我们经常会遇到如下两种情况:

  • 开发到一半,需要同步远端代码

  • 手头的工作被打断,需要先做别的需求

上述两种情况所面对的问题,都不单单是 pull、commit、push 就能解决,或者说,使用 pull、commit、push 并非最有解。这里我们可以通过引入 git stash 来解决这些问题。

git stash 用于想要保存当前的修改,但是想回到之前最后一次提交的干净的工作仓库时进行的操作。git stash 将本地的修改保存起来,并且将当前代码切换到 HEAD 提交上.

简单来说

使用 git stash 还你一个干净的工作目录!

通过 git stash 存储的修改列表,可以通过 git stash list 查看。git stash show 用于校验,git stash apply 用于重新存储。直接执行 git stash 等同于 git stash save

TIP

当然,如果是通过 Git 的图形化客户端进行操作,那么对于这些命令就无需花费太多时间和精力进行记忆。

最新的存储保存在 refs/stash 中。老的存储可以通过相关的参数获得,例如 lstash@{0} 获取最新的存储,stash@{1} 获取次新,存储可以直接通过索引的位置来获得 stash@{n}

# 2. 开发到一半,同步远端代码

当你的开发进行到一半,但是代码还不想进行提交,然后需要同步去关联远端代码时。

  • 如果你本地的代码和远端代码没有冲突时,可以直接通过 git pull 解决。
  • 但是如果可能发生冲突怎么办?直接 git pull 会拒绝覆盖当前的修改。

遇到这种情况,需要先 stash 本地的代码,进行 pull,然后再 pop 出本地代码:

git stash
git pull
git stash pop

# 3. 工作流被打断,需要先做别的需求

当开发进行到一半,老板过来跟你说 “线上有个bug,你现在给我改好,不然扣你鸡腿” 。当然,你可以开一个新的分支,把当前代码提交过去,回头再 merge,具体代码如下:

# 繁琐的不优雅的处理办法
# ... hack hack hack ...
git checkout -b my_wip
git commit -a -m "WIP"
git checkout master
edit emergency fix
git commit -a -m "Fix in a hurry"
git checkout my_wip
git reset --soft HEAD^
# ... continue hacking ...

如果你使用 git stash ,那么整个流程就变得很简单了:

# 更优雅的做法
# ... hack hack hack ...
git stash        # 保存开发到一半的代码
edit emergency fix
git commit -a -m "Fix in a hurry"
git stash pop   # 将代码追加到最新的提交之后
# ... continue hacking ...