讀書筆記: 版本控制使用Git - Stash (暫存)

如果手邊有工作必須暫停,轉去處理其他工作,有兩種方式暫時儲存目前手邊的工作:

  1. 開分支、提交要暫存的工作、再用 git reset --soft HEAD^ 恢復;
  2. 使用 git stash 指令。

Stash

  1. Stash事實上是暫用來儲存目前工作狀態的獨立commit
  2. 可用 refs/stash 參照來存取
  3. Stash恢復衝突處理
    • git stash pop 一般會自動丟棄stash stack已被恢復的工作狀態,但如果遇到衝突就不會自動丟棄,必須手動用 git stash drop 移除已經處理好衝突且被恢復的stash
    • git stash branch 新分支名 也能替最新的stash開新分支、提交後再來處理恢復stash產生的衝突問題
  4. git stash apply 可以套用最新的Stash,但不會像 git stash pop 指令自動移除套用的Stash。
# 基本指令
$ git stash save                       // 暫存目前工作目錄和Index
$ git stash save "WIP: 自訂stash訊息"   // 自訂satsh暫存訊息並暫存目前工作目錄和Index
$ git stash pop                       // 從暫存堆積移出儲存的工作並合併入目前的工作(不會覆寫或覆蓋檔案)
$ git stash apply                     // 套用最新的Stash但不會移除該Stash

# 檢視Stash指令
$ git stash list
$ git show-branch stash
$ git stash show                      // 顯示最新的stash與前一commit的變更差異(只會顯示stash@{0})
$ git stash show --stat               // 等同前一指令(default)
$ git stash show -p                   // -p子指令用來取得補綴檔案的變更差異


Stash指令也可以用來避免 git pull 因衝突而無法拉下的狀況

  1. git stash --includev 可暫存任何新的且未被added的檔案,能避免存在同名檔案而無法拉下的狀況;
  2. --all 子指令除了未被added的檔案,連 .gitignore 忽略、"not included" 的檔案都能暫存;
  3. -p--patch 則是能選擇性暫存需要暫時儲存的檔案。