????????通過git stash?可以靈活管理臨時修改,保持工作區整潔,是多人協作或多任務切換時的常用工具,主要用于臨時保存工作區和暫存區修改的命令,常用于以下場景:
(1)需要切換分支,但不想立即提交當前修改;
(2)臨時拉取或合并遠程代碼,避免沖突;
(3)調試時保存中間狀態,方便后續恢復。
注意事項:
(1)git stash?不保存已提交的內容(已在版本歷史中);
(2)恢復儲藏后,若有沖突需手動解決(類似合并沖突);
(3)儲藏記錄保存在本地倉庫,不會推送到遠程,需謹慎依賴長期儲藏。
1、使用示例
????????比方說線上有緊急BUG需要修復,但當前我的一個新功能開發只進行到一半,都不一定能跑通,代碼不能提交。這個時候,可以使用git stash將當前工作區暫存(隱藏起來),拉取最新代碼,修改后提交修復bug。之后再回復自己的暫存區,繼續開發。
# 1.當前工程開發一半,有文件hangar_box/stop_task_save.sh不能提交
git status
On branch master
Your branch is up to date with 'origin/master'.Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: hangar_box/stop_task_save.shno changes added to commit (use "git add" and/or "git commit -a")# 2.git stash暫存工作區
$ git stash save "暫存區測試" -u # 注意:-u 加在最后
warning: LF will be replaced by CRLF in hangar_box/stop_task_save.sh.
The file will have its original line endings in your working directory
Saved working directory and index state On master: 暫存區測試
再次實行git status,顯示工作區間干凈# 3.拉取最新代碼更新提交# 4.恢復工作區,如果跟步驟3文件沖突,相當于做了一次合并
git stash apply
2、基本用法
2.1、保存當前修改
????????保存當前修改。會將工作區和暫存區的所有修改(未跟蹤文件默認不保存)存入一個臨時 "儲藏區",并將工作區恢復到上一次提交的干凈狀態。
git stash # 保存當前修改
git stash save "修復登錄bug的臨時修改" # 保存時添加說明
2.2、查看儲藏列表
git stash list # 查看儲藏列表
輸出類似:
stash@{0}: On feature/login: 修復登錄bug的臨時修改
stash@{1}: WIP on main: 8a3b2c1 初始提交
????????stash@{n}?是儲藏的索引,n?越小表示越新的儲藏。
2.3、恢復儲藏的修改
git stash apply 恢復最新的儲藏(并保留儲藏記錄)
git stash apply stash@{1} # 恢復指定儲藏,如:恢復第2條儲藏
git stash pop # 相當于 apply + drop,恢復最新的儲藏(并刪除儲藏記錄)
2.4、刪除儲藏記錄
git stash drop # 刪除最新的儲藏,不要輕易刪儲存,除非確定不用它了
git stash drop stash@{1} # 刪除指定儲藏
git stash clear # 刪除所有儲藏
3、進階用法
3.1、保存未跟蹤文件
????????默認不保存未跟蹤文件(如新建的文件),需加?-u?或?--include-untracked:
git stash -u # 保存時支持對新建文件的添加
git stash save "修復登錄bug的臨時修改" -u # 保存時添加說明
3.2、保存所有文件(包括忽略的文件)
????????用?-a?或?--all?保存未跟蹤文件和?.gitignore?中忽略的文件:
git stash -a
3.3、從儲藏創建分支
????????若儲藏的修改與當前分支沖突,可直接從儲藏創建新分支:
git stash branch new-branch stash@{1}
4、恢復刪除的存儲
????????如果通過?git stash drop?或?git stash clear?誤刪了 stash 存儲,只要沒有執行過?git gc(Git 垃圾回收)清理未引用的對象,通常可以通過以下方法找回:
步驟 1:找到被刪除的 stash 對應的 commit ID
????????Git 的所有 stash 本質上都是以 commit 對象的形式存儲的,即使被刪除,也能通過 reflog 找到記錄。執行以下命令查看所有 stash 相關的操作記錄:
git reflog show stash@{0} # 查看所有 stash 相關的操作記錄
git reflog # 或查看所有引用的變更記錄(包含 stash 的創建和刪除)
????????輸出結果中會包含類似這樣的記錄(重點關注?WIP on ?相關的條目):
a1b2c3d (HEAD -> main) HEAD@{0}: stash: WIP on main: 8a3b2c1 初始提交
e4f5g6h HEAD@{1}: stash: WIP on feature/login: 修復登錄bug的臨時修改
????????其中?a1b2c3d、e4f5g6h?就是 stash 對應的 commit ID(完整 ID 可通過?git log -g?查看)。
步驟 2:恢復指定的 stash 記錄
????????找到目標 stash 的 commit ID 后,有兩種恢復方式:
方式 1:重新創建 stash 條目(推薦)
????????用?git stash apply 直接應用該 commit 的修改,同時會自動重新創建一個 stash 記錄:
git stash apply e4f5g6h
方式 2:從 commit 創建新分支(適合有沖突的情況)
????????如果直接應用有沖突,可基于該 stash 創建新分支:
git branch recover-stash e4f5g6h
????????然后切換到新分支查看修改:
git checkout recover-stash
注意事項:
????????時效性:被刪除的 stash 會作為 “未引用對象” 存在,默認情況下 Git 會在 30 天后通過?git gc?自動清理。如果刪除時間過長且執行過垃圾回收,可能無法找回。
????????快速操作:發現誤刪后,應立即執行?git reflog?查找記錄,避免執行?git gc?或等待自動清理。
????????驗證內容:恢復后建議用?git diff?或?git status?確認找回的修改是否正確。
????????如果以上方法仍無法找回,可能是 stash 對應的 commit 已被徹底清理,這種情況下恢復難度極大,建議平時重要的臨時修改盡量通過分支管理(而非長期依賴 stash)。