一文詳解Git的暫存與stash功能
基礎(chǔ)暫存操作
添加修改到暫存區(qū)
通過git add命令將工作目錄的修改標(biāo)記為“準(zhǔn)備提交”:
# 添加單個(gè)文件 git add file.txt # 添加所有修改的文件(不包括未跟蹤的文件) git add . # 添加特定類型的文件(如所有.js文件) git add *.js
功能:將修改存入暫存區(qū),但不會(huì)立即創(chuàng)建提交記錄。 注意:未跟蹤的文件需先用git add添加才能暫存。
取消暫存
誤將文件添加到暫存區(qū)時(shí),可通過以下命令撤銷:
# 取消單個(gè)文件的暫存 git restore --staged file.txt # 取消所有文件的暫存 git restore --staged .
功能:將文件從暫存區(qū)移回工作目錄,保留修改內(nèi)容。
一、Git Stash 是什么?核心作用
git stash (中文常翻譯為儲(chǔ)藏 / 暫存 / 暫存擱置) 是 Git 中極其常用的命令,核心核心作用:
臨時(shí)「儲(chǔ)藏 / 保存」工作區(qū) + 暫存區(qū) 中所有未提交的修改內(nèi)容,讓你的工作區(qū)和暫存區(qū)立刻恢復(fù)到「干凈狀態(tài)」(和最近一次 commit 完全一致) ,且不會(huì)丟棄任何修改。
什么時(shí)候必須用 Git Stash?(核心使用場(chǎng)景)
這是使用 git stash 的黃金場(chǎng)景,遇到以下情況無腦用即可,也是工作中 99% 的使用場(chǎng)景:
- 正在當(dāng)前分支開發(fā)新功能 / 改 Bug,突然需要切換到其他分支(比如
test/release)處理緊急問題; - 當(dāng)前分支的代碼改了一半、還沒寫完、無法提交(提交不完整的代碼會(huì)污染分支提交記錄);
- 切換分支前,Git 強(qiáng)制要求「工作區(qū)干凈」,否則會(huì)提示沖突或無法切換。
簡(jiǎn)單說:想切分支、代碼沒寫完、不想提交 → 用 git stash 就對(duì)了!
二、Git Stash 基礎(chǔ)核心命令(必會(huì),高頻使用)
所有命令按「使用頻率從高到低」排序,優(yōu)先掌握前 5 個(gè)即可滿足 90% 的開發(fā)需求,推薦死記硬背 + 熟練使用。
1. 核心存儲(chǔ):git stash / git stash push
# 方式1:最簡(jiǎn)寫法(推薦,工作中99%用這個(gè)) git stash # 方式2:保存修改并添加描述信息 git stash save "描述信息" # 方式3:完整寫法(和上面等價(jià),push 可以省略) git stash push
功能:把「工作區(qū) + 暫存區(qū)」的所有未提交修改,臨時(shí)保存到 Git 的「儲(chǔ)藏棧」,工作區(qū)立刻變干凈,所有修改被隱藏。
2. 帶備注存儲(chǔ):git stash push -m "備注信息" 【強(qiáng)烈推薦】
git stash push -m "首頁輪播圖樣式修改-未完成" git stash push -m "訂單模塊bug修復(fù)-待測(cè)試"
功能:和 git stash 功能一致,唯一區(qū)別是給本次儲(chǔ)藏添加「自定義備注」。
為什么強(qiáng)烈推薦?當(dāng)你多次 git stash 后,會(huì)有多個(gè)儲(chǔ)藏記錄,帶備注能一眼區(qū)分每個(gè)儲(chǔ)藏對(duì)應(yīng)的修改內(nèi)容,不會(huì)混淆,避免后續(xù)恢復(fù)錯(cuò)代碼!
3. 查看所有儲(chǔ)藏記錄:git stash list
git stash list
功能:查看 Git 儲(chǔ)藏棧中所有的臨時(shí)存儲(chǔ)記錄,輸出格式如下:
stash@{0}: On dev: 搜索框樣式優(yōu)化-未完成
stash@{1}: On dev: 篩選條單選失效問題修復(fù)-待測(cè)試
- 儲(chǔ)藏棧是「后進(jìn)先出」的結(jié)構(gòu)(棧結(jié)構(gòu)):最新的儲(chǔ)藏記錄排在最上面,編號(hào)
stash@{0}; - 每個(gè)記錄包含:編號(hào)、所屬分支、自定義備注。
4. 恢復(fù)儲(chǔ)藏的修改:git stash pop 【最常用恢復(fù)方式】
# 恢復(fù)「最新的儲(chǔ)藏記錄」(stash@{0}),恢復(fù)后自動(dòng)刪除這條儲(chǔ)藏記錄
git stash pop
# 恢復(fù)「指定編號(hào)」的儲(chǔ)藏記錄,恢復(fù)后自動(dòng)刪除該記錄
git stash pop stash@{1}
- 核心功能:將儲(chǔ)藏的修改恢復(fù)到當(dāng)前工作區(qū),恢復(fù)后代碼和你 stash 之前完全一致(工作區(qū) + 暫存區(qū)的修改都回來)。
- 關(guān)鍵特性:
pop= 「恢復(fù) + 刪除」,恢復(fù)后這條儲(chǔ)藏記錄就從棧中消失了,適合確認(rèn)只恢復(fù)一次的場(chǎng)景。
5. 恢復(fù)儲(chǔ)藏的修改:git stash apply 【備選恢復(fù)方式】
# 恢復(fù)最新的儲(chǔ)藏記錄(stash@{0}),恢復(fù)后「不刪除」這條儲(chǔ)藏記錄
git stash apply
# 恢復(fù)指定編號(hào)的儲(chǔ)藏記錄,恢復(fù)后「不刪除」該記錄
git stash apply stash@{1}
- 核心功能:和
git stash pop幾乎一樣,都是把儲(chǔ)藏的修改恢復(fù)到工作區(qū)。 - 關(guān)鍵區(qū)別:
apply= 「只恢復(fù),不刪除」,恢復(fù)后這條儲(chǔ)藏記錄依然保存在棧中,適合需要多次恢復(fù)同一份修改的場(chǎng)景。
? 重點(diǎn)區(qū)分:git stash pop vs git stash apply(必考必用)
這兩個(gè)命令是最容易混淆的,記住核心差異只有一個(gè):是否刪除儲(chǔ)藏記錄
? git stash pop:恢復(fù) + 刪除記錄 → 「一次性恢復(fù)」,用完即刪,推薦日常使用;
? git stash apply:只恢復(fù),不刪記錄 → 「可重復(fù)恢復(fù)」,恢復(fù)后還能再次恢復(fù)這份修改,適合特殊場(chǎng)景。
三、Git Stash 進(jìn)階命令(必會(huì),解決 80% 的問題)
1. 刪除指定儲(chǔ)藏記錄:git stash pop儲(chǔ)藏編號(hào)
# 刪除最新的儲(chǔ)藏記錄
git stash drop stash@{0}
# 刪除指定編號(hào)的儲(chǔ)藏記錄
git stash drop stash@{2}
功能:只刪除,不恢復(fù)。當(dāng)你有一些無用的儲(chǔ)藏記錄,不想恢復(fù)只想清理時(shí),用這個(gè)命令。
2. 刪除所有儲(chǔ)藏記錄:git stash clear
git stash clear
功能:清空 Git 儲(chǔ)藏棧中的所有儲(chǔ)藏記錄,慎用執(zhí)行后無法恢復(fù)被刪除的記錄,適合確認(rèn)所有儲(chǔ)藏都無用時(shí)的批量清理。
3. 查看儲(chǔ)藏的「具體修改內(nèi)容」:git stash show
# 查看最新儲(chǔ)藏的「文件變更列表」(只顯示文件名+增刪行數(shù))
git stash show
# 查看最新儲(chǔ)藏的「完整diff詳情」(顯示具體修改的代碼行,推薦)
git stash show -p
# 查看指定編號(hào)儲(chǔ)藏的完整diff詳情
git stash show -p stash@{1}
功能:在恢復(fù)儲(chǔ)藏前,想先看看這份儲(chǔ)藏里具體改了哪些代碼,避免恢復(fù)錯(cuò)內(nèi)容時(shí),用這個(gè)命令,-p 參數(shù)是核心(patch 補(bǔ)丁模式),能看到完整的代碼修改。
1. 儲(chǔ)藏「未追蹤的新文件」:git stash -u / git stash --include-untracked
git stash -u # 等價(jià)寫法 git stash --include-untracked
重要特性補(bǔ)充:默認(rèn)的 git stash 只會(huì)儲(chǔ)藏「已追蹤的文件」(已經(jīng)被 Git 管理的文件,比如之前 commit 過的文件),對(duì)于工作區(qū)中新建的、從未被 git add 過的新文件(未追蹤文件) ,默認(rèn)不會(huì)被儲(chǔ)藏。
加 -u 參數(shù)后:會(huì)把「已追蹤文件的修改 + 未追蹤的新文件」一起儲(chǔ)藏,工作區(qū)徹底干凈,連新文件都被隱藏了。
5. 儲(chǔ)藏「忽略的文件」:git stash -a / git stash --all
git stash -a # 等價(jià)寫法 git stash --all
功能:最強(qiáng)的儲(chǔ)藏命令,會(huì)儲(chǔ)藏「已追蹤文件修改 + 未追蹤新文件 + .gitignore 中忽略的文件」(比如 node_modules、dist 等),適合需要完全清空工作區(qū)的場(chǎng)景,日常開發(fā)很少用,特殊場(chǎng)景(比如切換分支前徹底清理)可用。
四、Git Stash 避坑指南 & 核心注意事項(xiàng)(重中之重,必看!)
這部分是最容易踩坑的地方,很多人用 stash 出問題,都是因?yàn)闆]注意這些規(guī)則,全部記住,能避開 99% 的坑!
? 注意 1:git stash 不會(huì)儲(chǔ)藏的內(nèi)容(默認(rèn)行為)
默認(rèn)執(zhí)行 git stash 時(shí),以下內(nèi)容絕對(duì)不會(huì)被儲(chǔ)藏,會(huì)原封不動(dòng)留在工作區(qū):
- 從未被 Git 追蹤過的文件(新建的、沒執(zhí)行過
git add的文件); - 被
.gitignore忽略的文件(比如依賴包、打包產(chǎn)物、日志文件); - 已經(jīng)提交到版本庫的文件(只會(huì)處理「未提交」的修改)。
? 解決辦法:需要儲(chǔ)藏未追蹤文件用 git stash -u,需要儲(chǔ)藏忽略文件用 git stash -a。
? 注意 2:stash 的恢復(fù)與「分支無關(guān)」,但有最佳實(shí)踐
很多人誤以為「在哪個(gè)分支 stash,就只能在哪個(gè)分支恢復(fù)」,這個(gè)認(rèn)知是錯(cuò)誤的!
真相:Git 的 stash 是「全局的」,儲(chǔ)藏的是「文件的修改內(nèi)容」,不是和分支綁定的,你可以在 dev 分支 stash,然后切換到 test 分支恢復(fù)。
最佳實(shí)踐:盡量在哪個(gè)分支儲(chǔ)藏,就在哪個(gè)分支恢復(fù)!
原因:不同分支的代碼差異可能很大,跨分支恢復(fù) stash 大概率會(huì)觸發(fā)「代碼沖突」,處理沖突會(huì)增加不必要的麻煩,除非你明確知道兩份代碼無沖突。
? 注意 3:儲(chǔ)藏記錄的「生命周期」
儲(chǔ)藏記錄不是永久保存的,它是「臨時(shí)緩存」,以下操作會(huì)刪除儲(chǔ)藏記錄:
- 執(zhí)行
git stash pop 編號(hào):恢復(fù)后自動(dòng)刪除該記錄; - 執(zhí)行
git stash drop 編號(hào):手動(dòng)刪除該記錄; - 執(zhí)行
git stash clear:刪除所有記錄; - 倉庫被刪除 / 遷移:儲(chǔ)藏記錄會(huì)跟著倉庫消失(不會(huì)同步到遠(yuǎn)程倉庫)。
? 注意 4:stash 無法儲(chǔ)藏「空文件 / 空目錄」
如果你的修改只是新建了一個(gè)空文件 / 空目錄,執(zhí)行 git stash 不會(huì)生效,Git 會(huì)提示「No local changes to save」,這是 Git 的默認(rèn)規(guī)則,無需處理。
? 五、Git Stash 完整工作流程演示(工作中最常用,直接套用)
給你一套完整的「標(biāo)準(zhǔn)流程」,遇到「代碼沒寫完要切分支」的場(chǎng)景,直接按步驟執(zhí)行即可,零錯(cuò)誤、零踩坑,這是工作中最經(jīng)典的用法:
場(chǎng)景:在 dev 分支開發(fā)新功能,寫到一半,需要切換到 test 分支修緊急 Bug
# 步驟1:當(dāng)前在 dev 分支,代碼沒寫完,帶備注儲(chǔ)藏所有修改(推薦帶-m) git stash push -m "dev-個(gè)人中心模塊開發(fā)-未完成" # 步驟2:查看儲(chǔ)藏記錄,確認(rèn)儲(chǔ)藏成功(可選,養(yǎng)成好習(xí)慣) git stash list # 步驟3:切換到目標(biāo)分支(此時(shí)工作區(qū)干凈,切換無任何問題) git checkout test # 步驟4:在 test 分支修復(fù) Bug,完成后正常提交 git add . git commit -m "test-修復(fù)訂單支付失敗bug" # 步驟5:切回原分支 dev git checkout dev # 步驟6:恢復(fù)之前儲(chǔ)藏的未完成代碼(推薦用pop,恢復(fù)后刪除記錄) git stash pop # 步驟7:繼續(xù)開發(fā)未完成的功能即可,代碼和之前完全一致 ??
核心知識(shí)點(diǎn)速記
核心概念
- git stash:臨時(shí)保存未提交修改,讓工作區(qū)變干凈,核心場(chǎng)景「代碼沒寫完要切分支」;
- stash 是「棧結(jié)構(gòu)」,后進(jìn)先出,最新的記錄是 stash@{0}。
必會(huì)核心命令(按優(yōu)先級(jí)排序)
- 儲(chǔ)藏:
git stash push -m "備注"(帶備注,推薦首選) - 查看:
git stash list - 恢復(fù):
git stash pop(恢復(fù) + 刪除,日常首選) /git stash apply(恢復(fù)不刪除,備選) - 刪除:
git stash drop 編號(hào)(刪指定) /git stash clear(刪全部) - 查看修改:
git stash show -p
兩大避坑重點(diǎn)
- 默認(rèn)不儲(chǔ)藏「未追蹤文件」和「忽略文件」,需要?jiǎng)t加
-u/-a; - 盡量「同分支儲(chǔ)藏、同分支恢復(fù)」,避免跨分支沖突。
核心區(qū)別速記
git stash pop → 恢復(fù) + 刪記錄;git stash apply → 恢復(fù)不刪記錄。
小劇場(chǎng)分享幾個(gè)好看的MD主題
- qklhk-chocolate
- scrolls-light
- Chinese-red
- nico
- devui-blue
- z-blue
- yu
以上就是一文詳解Git的暫存與stash功能的詳細(xì)內(nèi)容,更多關(guān)于Git暫存與stash操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
計(jì)算機(jī)出現(xiàn)502Bad?Gateway錯(cuò)誤完全解決指南(不懂代碼也不用懂服務(wù)器)
502 Bad Gateway是一種HTTP協(xié)議的服務(wù)器端錯(cuò)誤狀態(tài)代碼,它表示作為網(wǎng)關(guān)或代理角色的服務(wù)器,從上游服務(wù)器中接收到的響應(yīng)是無效的,這篇文章主要介紹了計(jì)算機(jī)出現(xiàn)502Bad?Gateway錯(cuò)誤完全解決指南的相關(guān)資料,需要的朋友可以參考下2026-01-01
進(jìn)制轉(zhuǎn)換算法原理(二進(jìn)制 八進(jìn)制 十進(jìn)制 十六進(jìn)制)
進(jìn)制轉(zhuǎn)換算法原理(二進(jìn)制 八進(jìn)制 十進(jìn)制 十六進(jìn)制),以前上學(xué)那會(huì)確實(shí)學(xué)過,長(zhǎng)時(shí)間不用都忘了。2010-05-05
HTML5 拖拽復(fù)制功能的實(shí)現(xiàn)
這篇文章主要介紹了HTML5 拖拽復(fù)制功能的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-09-09
VS Code使用Git可視化管理源代碼詳細(xì)教程(推薦)
這篇文章主要介紹了VS Code使用Git可視化管理源代碼詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
關(guān)于使用SQOOP抽數(shù)到Hive遇到的問題
這篇文章主要介紹了關(guān)于使用SQOOP抽數(shù)到Hive遇到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Git提交文件到三個(gè)區(qū)的實(shí)現(xiàn)方法
本文主要介紹了Git提交文件到三個(gè)區(qū)的實(shí)現(xiàn)方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02

