# 暫時保存更改
一個被提交了的改動會被永久地保存在倉庫(repository)中。然而,在你日常工作中你經常需要“暫時地”保存一下你的一些本地改動。例如,如果你正在開發一個新的功能,但是與此同時又得到了一個錯誤報告,并且需要馬上修復它,而你現在的本地改動又和這個錯誤毫無關系,因此你必須暫時地停止新功能的開發,來開始著手修復這個錯誤。并且你還想要保存那些已完成的開發工作,以便之后能繼續來完成它。
像這樣的情況會隨時發生,比如你必須要開始一個新的工作,而在你的當前工作版本中還有一些并不想立即提交的本地改動。在處理好這些本地改動的同時,我們還需要把當前的工作副本(working copy)清理出來,Git 提供的 “儲藏(Stash)” 功能可以非常好地解決這個問題。
##### 概念
#### 儲藏(Stash)
可以把儲藏想象成一種剪貼板,它會獲取你工作副本(working copy)中的所有改動,并且保存到一個新的剪貼板上。然后你就會得到一個“干凈”的工作副本,也就是說一個不存在任何改動的工作目錄。
之后你隨時都可以重新調回那些保存在剪貼板中的改動到你的工作副本中來,從而繼續你之前沒有完成的工作。
你可以建立多個儲藏單元,不僅僅局限于存儲一組變化。同樣,儲藏也會不綁定在你所處的當前分支或是任何其它分支上,如果你想要調回任意一個儲藏單元,它的改動將會被應用在你當前的 HEAD 分支上。
來讓我們先把本地的改動儲藏起來,這樣在開始這個新功能開發前我們就可以得到了一個干凈的工作副本:
```
$ git stash
Saved working directory and index state WIP on master:
2dfe283 Implement the new login box
HEAD is now at 2dfe283 Implement the new login box
```
```
$ git status
# On branch master
nothing to commit (working directory clean)
```
現在,這個本地文件 “imprint.html” 的改動已經被安全地保存在一個剪貼板上了。當我們希望繼續對它們進行工作時,我們都可以隨時輕松地調回它。
你可以很容易地得到你當前的儲物箱的狀態:
```
$ git stash list
stash@{0}: WIP on master: 2d6e283 Implement the new login box
```
最新建立的儲藏單元會被顯示在列表的最上面,被命名為 named “stash@{0}” 。早前建立的儲藏單元會擁有一個更高的數字。
當你想要調回一個之前建立的儲藏單元,有兩種方法:
* (a) 使用 “git stash pop” 命令,它將調回最新的一個儲藏單元,并且把它從剪貼板中刪除掉。
* (b) 使用 “git stash apply <stashname>” 命令,它將調回那個你所給出的儲藏單元,而這個儲藏單元還會保留在剪貼板中。你可以隨時使用 “git stash drop <stashname>” 來刪除它。
當你使用這些命令時,你不必給出特定的儲藏單元名稱。 Git 將會自動地處理最新的那個儲藏單元(永遠是 “stash@{0}”)。
##### 概念
#### 儲藏的時機
儲藏功能可以幫助我們得到一個干凈的工作副本。當然,它還可以應用在很多不同的流程中,強烈推薦你在下列情況中儲藏你的本地改動:
* ……在切換到不同分支之前。
* ……在獲取(pulling)遠程改動之前。
* ……在合并(merging)或者衍合(rebasing)一個分支之前。
終于,是時候開始著手開始開發我們的新功能了!
- Learn Version Control with Git 中文版
- 前言
- Part 1 - 基礎知識
- 什么是版本控制?
- 為什么要使用版本控制系統?
- 準備工作
- 版本控制的基本工作流程
- 從一個未被納入版本控制的項目開始
- 從一個已被納入版本控制的項目開始
- 工作在你的項目上
- Part 2 - 分支與合并
- 分支可以改變你的生命
- 在分支上工作
- 暫時保存更改
- 切換一個本地分支
- 合并改動
- 分支的工作流程
- Part 3 - 遠程倉庫
- 關于遠程倉庫
- 連接一個遠程倉庫
- 查看遠程數據
- 整合遠程的改動
- 發布一個本地分支
- 刪除分支
- Part 4 - 高級應用
- 撤銷操作
- 用 diff 來檢查改動
- 處理合并沖突
- Rebase 代替合并
- 子模塊
- git-flow 的工作流程
- 使用 SSH 公鑰驗證
- Part 5 - 工具與服務
- 桌面應用程序
- 比較和整合工具
- 代碼托管服務
- 更多學習資源
- 附錄
- 版本控制的最佳實踐
- 命令 101
- 從 Subversion 過渡到 Git
- 為什么選擇 Git