爲什麼需要暫存修改?

在使用 Git 開發時,你可能會遇到這樣的情況:正在某個分支(比如 dev)修改代碼,突然需要切換到另一個分支(比如 bugfix)修復緊急問題。如果直接執行 git checkout bugfix,Git 會提示“你的本地修改會被覆蓋,要麼提交要麼暫存”。這時候如果直接提交(比如寫一個“臨時修改”的提交),之後還得撤銷,非常麻煩。

Git Stash 是什麼?

stash 就像一個“臨時保險箱”,可以把當前未提交的修改(包括工作區和暫存區的修改)暫時保存起來,讓工作區恢復到乾淨狀態(和 HEAD 版本一致),方便你安全地切換分支。等處理完目標分支的任務後,再把暫存的修改“取”回來。

操作步驟(附實例)

假設你正在 dev 分支開發新功能,修改了 file1.txtfile2.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 初學者掌握。記住:處理完任務後,及時恢復暫存的修改,保持工作流的整潔!

小夜