---
title: 【Git】用 git stash 命令暫存目前的修改工作
date: 2020-01-15
is_modified: false
disqus: cynthiahackmd
categories:
- "軟體開發 › 版本管控"
tags:
- "Git"
---
{%hackmd @CynthiaChuang/Github-Page-Theme %}
<br>
大家應該或多或少遇過這樣的情境:
> 當您開發作到一半時,遇到緊急的 issue 要先修。
> 或是遇到老闆要插單,要求先完成哪個 function 。
人家是衣食父母也不好不甩人家,只好先擱置手邊的工作啦...
<!--more-->
<br>
此時,有幾個方式可以保留手邊的工作進度。
## 1. commit 之後再 reset
這是我最常使用的的方法,比較是適合用在接下來的工作是在不同的分支上時。
就是別管那多,把所有東西都先存下來再說:
```shell=
$ git add --all
$ git commit -m "temporarily"
```
等在其他分支工作完後,再回到這個分支上,把暫存的 commit 解開繼續做:
```shell=
$ git reset HEAD^
```
## 2. git stash
除了 commit 之後再拆這個方法外,也可以使用 git 的指令,將檔案放到==暫存區==裡面:
### push / save
```shell=
$ git stash
Saved working directory and index state WIP on master: 3a9842d
```
<br>
若是你的此次修改有新增加檔案,或是存在 ==untracked== 狀態的檔案,則應該在指令後 `-u` 指定包含untracked 狀態的檔案:
```shell=
$ git stash -u
```
<br><br>
我在網路上找資料的時候,發現有三個指令,`git stash` / `git stash push` / `git stash save`,都可以達到相同的目的。
其中 `git stash push` 是最標準的用法,也是 `git stash` 預設指令,換句話說,當你調用 `git stash` 不帶任何參數時,其效用等於`git stash push`。
最後一個 `git stash save` 在文件中寫明它不推薦使用該參數,與 `git stash push` 最大的不同是它不支援路徑參數。
### list / show
當你完成其他工作完後,想把暫存區的工作進度時找回來時,可以先用 `list`,看看暫存區有那工作:
```shell=
$ git stash list
stash@{0}: WIP on master: 3a9842d
stash@{1}: WIP on master: 3a9842d
```
<br>
像這樣表示暫存區存在兩個暫存的工作,我們可以使用 `show -p` 來查看指定工作的 diff:
```shell=
$ git stash show -p stash@{0}
```
### pop / drop
若確定所要回復的工作進度時,就可以使用 `pop` 來恢復工作進度
```shell=
$ git stash pop stash@{0}
```
<br>
若是某個暫存的工作進度確定不要,則可以使用 `drop` 來丟棄:
```shell=
$ git stash drop stash@{1}
```
## 參考資料
1. [Git|git-stash Documentation](https://git-scm.com/docs/git-stash)
2. [Stash(暫存)|連猴子都能懂的Git入門指南|貝格樂(Backlog)](https://backlog.com/git-tutorial/tw/reference/stash.html)
3. [【狀況題】手邊的工作做到一半,臨時要切換到別的任務|為你自己學 Git 高見龍網站](https://gitbook.tw/chapters/faq/stash.html)
4. [[Git] 原來 git stash save 已經被棄用了|EPH 的程式日記](https://ephrain.net/git-%E5%8E%9F%E4%BE%86-git-stash-save-%E5%B7%B2%E7%B6%93%E8%A2%AB%E6%A3%84%E7%94%A8%E4%BA%86/)
<br><br>
> **本文作者**: 辛西亞.Cynthia
> **本文連結**: [辛西亞的技能樹](https://cynthiachuang.github.io/Git-Stash-Temporarily-Shelves-Changes) / [hackmd 版本](https://hackmd.io/@CynthiaChuang/Git-Stash-Temporarily-Shelves-Changes)
> **版權聲明**: 部落格中所有文章,均採用 [姓名標示-非商業性-相同方式分享 4.0 國際](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en) (CC BY-NC-SA 4.0) 許可協議。轉載請標明作者、連結與出處!