爲什麼需要Git stash?

想象一下,你正在寫一個功能,代碼改了一半,突然接到一個緊急修復的任務,需要切換到bug分支。但此時你還沒提交修改的代碼,如果直接切換分支,這些修改會被覆蓋或導致衝突。這時候,Git stash 就派上用場了!它能幫你把“當前正在做但不想提交”的代碼“臨時存起來”,等處理完急事再回來繼續。

Git stash是什麼?

Git stash 是Git提供的一個“臨時存儲”工具,專門用來保存工作區和暫存區的修改(但不保存分支信息)。保存後,你的工作區會恢復到和上次提交時一模一樣的狀態,這樣你就能幹淨地切換分支、拉取代碼或做其他操作,之後再通過stash恢復之前的修改。

常用的Git stash命令

1. 保存當前修改(最常用)

命令git stash
作用:把工作區和暫存區的所有修改“打包”存起來,默認會帶上一個自動生成的描述(如 WIP on 分支名: 提交哈希 簡短描述)。
示例

# 當前在dev分支,工作區有未提交的修改
$ git status  # 查看狀態,顯示修改未提交
$ git stash   # 執行stash,保存修改
Saved working directory and index state WIP on dev: a1b2c3d 修改登錄頁面

2. 查看所有stash記錄

命令git stash list
作用:列出所有之前保存的stash(按時間倒序),每條記錄包含一個編號(如 stash@{0})和描述。
示例

$ git stash list
stash@{0}: WIP on dev: a1b2c3d 修改登錄頁面
stash@{1}: WIP on dev: 4e5f6g7 新增用戶列表

3. 恢復stash(不刪除)

命令git stash apply [stash編號]
作用:恢復指定的stash記錄(默認恢復最近的 stash@{0}),但不會刪除該記錄。
示例

# 恢復最近的stash(stash@{0})
$ git stash apply
On branch dev
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   a.txt

4. 恢復stash(刪除)

命令git stash pop [stash編號]
作用:恢復指定的stash,並且刪除該記錄(推薦,因爲stash是臨時的)。
示例

# 恢復stash@{0}並刪除
$ git stash pop
On branch dev
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   a.txt
Dropped refs/stash@{0} (f123456...)

5. 刪除指定stash

命令git stash drop [stash編號]
作用:只刪除指定的stash記錄(如果想保留恢復,用apply;想刪除,用drop)。
示例

# 刪除stash@{1}
$ git stash drop stash@{1}
Dropped stash@{1} (f234567...)

6. 清空所有stash

命令git stash clear
作用:刪除所有stash記錄,謹慎使用!
示例

$ git stash clear
All stashes removed.

實用場景示例

場景:臨時切換分支修復bug

  1. 當前工作區有未提交修改
   $ git status  # 顯示修改的文件,如a.txt
   $ git stash   # 保存修改
   Saved working directory and index state WIP on dev: a1b2c3d 開發中
  1. 切換到bug分支修復問題
   $ git checkout bugfix  # 切換分支(此時工作區乾淨)
   $ git commit -m "修復登錄bug"  # 提交修復
  1. 修復完成後,恢復之前的stash
   $ git checkout dev  # 切回dev分支
   $ git stash pop     # 恢復並刪除stash記錄
   On branch dev
   Changes to be committed:
     modified:   a.txt

注意事項

  1. stash是臨時的:stash僅用於臨時保存,不要把重要內容長期放在stash裏。
  2. 恢復可能有衝突:如果恢復時和其他修改衝突,Git會提示“Automatic merge failed”,需手動編輯文件解決衝突。
  3. 恢復後狀態popapply 都會恢復修改到工作區,但 pop 會刪除stash,apply 保留。
  4. stash不保存分支:stash只是保存修改快照,不是分支,無法像分支一樣切換。

總結

Git stash 是處理“臨時未完成工作”的神器,能幫你在切換分支、拉取代碼時避免衝突,保持工作區乾淨。掌握 git stashgit stash applygit stash pop 這三個核心命令,就能輕鬆應對大部分臨時修改場景。記住:stash用完即刪,別讓它堆積!

小夜