Git + GitHub 版本控制教學 (6) - 使用 Stash 整理工作中的修改

當我們開發一個專案時,常常會遇到需要臨時轉換開發工作或任務的情況。例如,你可能正在開發一個新功能,但突然需要去修復一個緊急的 Bug。這時候,你可能不想提交未完成的工作,Git 的 Stash 功能就可以派上用場。

Git + GitHub 版本控制教學 (6) - 使用 Stash 整理工作中的修改
Photo by Praveen Thirumurugan / Unsplash

當我們開發一個專案時,常常會遇到需要臨時轉換開發工作或任務的情況。例如,你可能正在開發一個新功能,但突然需要去修復一個緊急的 Bug。這時候,你可能不想提交未完成的工作,Git 的 Stash 功能就可以派上用場。

Git 的 Stash 功能可以讓我們將工作中的修改暫存起來,然後再恢復回乾淨的工作目錄。之後,我們可以在任何時候將這些修改恢復回來。

使用 Git Stash 的基本用法

第一步,當我們有未提交的修改,可以使用 git stash 命令來將它們暫存起來。


git stash

上述命令將會將你的工作目錄恢復到最近的 commit,並且將未提交的修改存放到一個新的 stash 中。你可以使用 git stash list 命令來查看所有的 stash。


git stash list

你會看到像這樣的輸出:

stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log

每個 stash 都有一個名稱,像是 stash@{0}stash@{1} 這樣。

當你需要恢復其中一個 stash 的修改時,你可以使用 git stash apply 命令。這個命令需要一個參數,也就是你要恢復的 stash 的名稱。


git stash apply stash@{0}

注意,git stash apply 命令不會移除 stash。如果你想在應用 stash 之後將它從 list 中移除,你應該使用 git stash pop 命令。


git stash pop stash@{0}

如果你想移除一個特定的 stash,可以使用 git stash drop 命令。


git stash drop stash@{0}

以上就是 Git 的 Stash 功能的基本用法,可以有效地幫助我們管理工作中的修改,讓我們可以隨時切換工作任務,而不需要擔心未完成的修改會造成干擾。

但要注意的是,當我們嘗試使用 git stash applygit stash pop 恢復暫存的修改時,有可能會遇到衝突。這通常發生在當我們在不同的時間點修改了同一個文件的同一個部分。舉例來說,你可能會看到像這樣的訊息:

Auto-merging index.html
CONFLICT (content): Merge conflict in index.html

這表示 index.html 文件有衝突。我們可以打開這個文件,找到以下這樣的區塊:

<<<<<<< Updated upstream
... changes made on the branch that is being merged into ...
=======
... changes made on the branch that is being merged ...
>>>>>>> Stashed changes

這段區塊表示在合併衝突中,上游分支(你現在的工作分支)與 stash 的修改。你可以選擇保留哪些修改,並刪除 <<<<<<======>>>>>> 這些標記。

解決衝突後,我們可以用 git add 將文件標記為已解決衝突:


git add index.html

如果我們已經解決並且提交了所有的衝突,我們可以繼續應用 stash:


git stash apply

如果我們是用 git stash pop 並遇到衝突,那麼即使衝突解決了,stash 並不會被丟棄。我們需要手動用 git stash drop 來丟棄它。

總結來說 git stash 還是相當實用的,最常用的 case 是當我們需要暫存現在的修改去執行其他任務的時候。還有另外一個常見的用法是儲存不同環境的配置,比如說專案裡面有不同的環境像是 dev/staging,當我們今天想測試不同環境時就可以把配置利用  git stash 裡拿出來。