在使用Git管理代碼時,你是否遇到過這樣的情況:正在專注寫一個新功能,突然需要修復一個緊急的線上bug,此時如果直接提交半成品代碼,會影響後續開發思路;但不提交的話,又無法切換到bug修復的分支。這時,Git stash就派上用場了!它能幫你臨時保存當前的工作進度,讓你可以安心處理其他任務,之後再回來繼續你的工作。
爲什麼需要Git stash?¶
想象一下這幾個場景,你就會明白stash的必要性:
-
場景1:緊急切換分支
你正在dev分支開發一個新功能,寫了一半代碼,突然發現main分支有個緊急bug需要修復。此時執行git checkout main會被Git拒絕(因爲有未提交的修改),這時候用stash就能先“凍結”當前進度,切換分支修復完bug後再回來。 -
場景2:臨時保存進度
你正在調試一個複雜的功能,寫了一半代碼,臨時需要去處理另一個簡單的需求(比如改個文檔)。此時用stash保存當前代碼,處理完簡單需求後再恢復,不用重複寫代碼。
Git stash的基本操作¶
1. 保存當前修改¶
當你有未提交的修改(包括工作區和暫存區),可以用git stash save命令將其臨時保存。
語法:git stash save "消息"(消息可選,建議加簡短說明,方便後續識別)。
示例:
# 假設你正在修復用戶登錄頁面的bug,寫了一半代碼,此時執行:
git stash save "臨時保存用戶登錄頁面的bug修復進度"
執行後,Git會將當前的修改“打包”保存,並回到最近一次提交的狀態。此時git status會顯示“乾淨”(無未提交修改),可以放心切換分支或處理其他任務了。
2. 查看已保存的stash列表¶
如果保存了多個stash,或想知道之前存了什麼,可以用git stash list查看:
示例:
git stash list
輸出示例:
stash@{0}: On dev: 臨時保存用戶登錄頁面的bug修復進度
stash@{1}: On feature/pay: WIP on feature/pay: a1b2c3d
每個stash都有一個編號(stash@{0}是最新的,stash@{1}是之前的),以及對應的分支和消息。
3. 恢復stash的內容¶
處理完其他任務後,需要恢復之前保存的修改,有兩種方式:
- 恢復並刪除該stash(最常用):用
git stash pop。
它會恢復最近的stash(默認是stash@{0}),並將其從列表中刪除。
示例:
# 假設你修復完bug後,切回dev分支,恢復之前的stash
git stash pop
- 恢復但保留該stash:如果想保留stash(比如之後可能需要多次恢復),用
git stash apply。
它會恢復指定的stash,但不會刪除原記錄。
示例:
# 恢復stash@{1}(第二個stash)
git stash apply stash@{1}
注意:如果恢復時發生衝突(比如不同stash修改了同一行代碼),Git會提示“Automatic merge failed”。此時需要手動打開衝突文件,修改衝突部分(Git會用<<<<<<< HEAD等標記衝突位置),修改後執行git add <衝突文件>,再執行git stash pop(或apply)完成恢復。
4. 刪除不需要的stash¶
如果某個stash已經沒用了,可以用git stash drop刪除指定的stash:
示例:
# 刪除stash@{1}(第二個stash)
git stash drop stash@{1}
重要:git stash clear會刪除所有stash,謹慎使用!
常見問題與注意事項¶
-
stash保存的範圍:
Git stash會保存工作區和暫存區的所有修改,但不會保存未跟蹤的文件(即git status中顯示“untracked”的文件)。如果需要保存未跟蹤文件,可使用git stash -u(或--include-untracked)。 -
不要過度依賴stash:
stash適合臨時操作,長期的工作進度建議用git commit(即使還沒完成,也可以先提交一個“半成品”並寫好message),方便後續回溯。
總結¶
Git stash就像一個“臨時存儲袋”,幫你在切換任務或分支時,安全地保存當前的編碼進度,避免意外丟失未完成的代碼。掌握stash save、stash list、stash pop、stash drop這幾個核心操作,就能更靈活地管理開發流程啦!下次遇到需要“暫停”當前工作時,記得用stash哦~