用 git stash 暫存工作進度

前言

在進行開發時,偶爾會有進行到一半必須切換分支處理別的工作的情況,這時候使用 git stash 暫存指令就會是個好選擇。

暫存進度(git stash)

在新進度尚未提交(commit)時切換分支,可能會遇到兩種情況:

  1. 目前進度跟著一起移動到新的分支。
  2. 因為發現潛在的衝突(conflict), Git 不讓我切換分支。

如果不希望這兩種情況中的任一種發生,可以使用 git stash 將目前「已追蹤」的檔案進度移入暫存區。

需特別注意的是:git stash 只會將「staged」和「unstaged」的檔案進度移入暫存區。如果有新增的「untracked file」,並需先用 git add 加入 staged 清單才會被一起移入暫存區。

這時候會發現進度已經回復到上一次提交的樣子了,而使用 git status 也只會看到「untracked file」被列出來。

git stash 可以建立多個暫存紀錄,不管是在同個分支上建立多個暫存、或是不同分支上建立多個暫存都可以,這些暫存紀錄會用建立時間「由新到舊」保存。

顯示暫存清單(git stash list)

既然可以建立多個暫存,如果想套用其中一個暫存紀錄怎麼辦?這時候就可以用 git stash list 指令列出暫存紀錄清單。

如圖所示,每個暫存項目會有個項目「序號」,從 0 開始由新到舊增加序號,並一併記錄是在哪個分支的哪個提交紀錄建立的。由於「暫存」並不像提交一樣有 commit message 可以做區分,所以僅能靠以上的資訊辨別不同的暫存內容。

git stash list

恢復暫存進度

有了暫存進度後,如果想要回復或者說套用暫存進度,有兩種方法可以使用。分別是 popapply ,兩者的差別在於套用進度之後,暫存紀錄的消失與否。暫存進度的套用不限建立暫存的分支使用,可用於任何一個分支。如果沒有指定某個序號的紀錄,預設會套用最新一次的暫存紀錄。

偶爾在套用暫存進度時會產生衝突,這時只要像處理 merge conflict 一樣,將內容調整成希望的樣子,並用 git add 確認套用即可。

git stash pop

使用 git stash pop 套用進度時,原本在暫存區的紀錄「會」從清單中消失。可以使用的指令如下:

1
2
3
4
5
# 套用最新一筆暫存紀錄
git stash pop

# 套用指定暫存紀錄
git stash pop stash@{序號}

執行之後再次用 git stash list 就會發現紀錄從清單中消失了!

git stash apply

如果我們希望在多個分支套用相同的暫存內容,則可以使用 git stash apply ,該 指令執行後原本在暫存區的紀錄「不會」從清單中消失,可以繼續在其他地方使用。指令如下:

1
2
3
4
5
# 套用最新一筆暫存紀錄
git stash apply

# 套用指定暫存紀錄
git stash apply stash@{序號}

執行之後再次用 git stash list 會發現紀錄仍然存在清單中沒變。

刪除暫存進度

建立暫存後也不一定要使用,可以直接刪除暫存紀錄。指令如下:

1
2
3
4
5
# 刪除指定暫存紀錄
git stash drop stash@{序號}

# 刪除全部暫存紀錄
git stash clear

執行之後再次用 git stash list 就會發現紀錄從清單中消失了!

文章內容如有錯誤,歡迎留言討論!


本 Blog 上的所有文章除特别聲明外,均採用 CC BY-SA 4.0 協議 ,轉載請註明出處!