爲什麼需要暫存修改?¶
在使用 Git 開發時,你可能會遇到這樣的情況:正在某個分支(比如 dev)修改代碼,突然需要切換到另一個分支(比如 bugfix)修復緊急問題。如果直接執行 git checkout bugfix,Git 會提示“你的本地修改會被覆蓋,要麼提交要麼暫存”。這時候如果直接提交(比如寫一個“臨時修改”的提交),之後還得撤銷,非常麻煩。
Git Stash 是什麼?¶
stash 就像一個“臨時保險箱”,可以把當前未提交的修改(包括工作區和暫存區的修改)暫時保存起來,讓工作區恢復到乾淨狀態(和 HEAD 版本一致),方便你安全地切換分支。等處理完目標分支的任務後,再把暫存的修改“取”回來。
操作步驟(附實例)¶
假設你正在 dev 分支開發新功能,修改了 file1.txt 和 file2.txt,但還沒提交:
1. 檢查當前修改狀態¶
先確認有未提交的修改,執行:
git status
輸出類似:
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file1.txt
modified: file2.txt
no changes added to commit (use "git add" and/or "git commit -a")
2. 暫存當前修改(執行 git stash)¶
執行 git stash 後,Git 會把所有未提交的修改暫存起來,並清空工作區:
git stash
輸出類似:
Saved working directory and index state WIP on dev: a1b2c3d Add feature x
此時再執行 git status,會發現工作區已經乾淨了:
On branch dev
nothing to commit, working tree clean
3. 切換到目標分支¶
現在可以安全切換到需要修改的分支(比如 bugfix):
git checkout bugfix
切換成功後,你可以專注修復問題,不用擔心代碼被覆蓋。
4. 完成目標分支任務後,恢復暫存的修改¶
修復完 bugfix 分支的問題後,先切回原分支(dev):
git checkout dev
然後執行 git stash pop,恢復之前暫存的修改:
git stash pop
執行後,暫存的修改會被恢復,同時暫存記錄會被刪除(“pop”即“彈出”,恢復並刪除)。輸出類似:
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: file1.txt
modified: file2.txt
補充:常用 Stash 命令¶
-
查看所有暫存記錄:
git stash list
輸出類似:stash@{0}: WIP on dev: a1b2c3d Add feature x,每個stash@{n}對應一條暫存記錄。 -
只恢復暫存,不刪除記錄:
git stash apply
如果暫存了多條記錄,想恢復某一條(比如stash@{1}),可以執行:
git stash apply stash@{1},之後記錄仍保留。 -
刪除指定暫存記錄:
git stash drop stash@{n}
如果不需要某個暫存記錄,可以用drop刪除,比如:git stash drop stash@{0}。
注意:處理衝突¶
如果恢復暫存修改時遇到衝突(比如原分支和暫存修改的代碼衝突),Git 會提示 Automatic merge failed。此時需要手動打開衝突文件(標記爲 <<<<<<< HEAD 開頭的文件),解決衝突後執行 git add 衝突文件,再重新執行 git stash pop 即可。
總結¶
stash 是 Git 中非常實用的工具,它像一個“臨時存儲站”,能幫我們在切換分支時安全地保存未提交的修改,避免代碼丟失。核心命令 git stash(暫存)和 git stash pop(恢復)簡單易用,適合所有 Git 初學者掌握。記住:處理完任務後,及時恢復暫存的修改,保持工作流的整潔!