面試官:說說你對Git Stash 的理解?應用場景?
本文轉(zhuǎn)載自微信公眾號「JS每日一題」,作者 灰灰。轉(zhuǎn)載本文請聯(lián)系JS每日一題公眾號。
一、是什么
stash,譯為存放,在 git 中,可以理解為保存當前工作進度,會把暫存區(qū)和工作區(qū)的改動進行保存,這些修改會保存在一個棧上
后續(xù)你可以在任何時候任何分支重新將某次的修改推出來,重新應用這些更改的代碼
默認情況下,git stash會緩存下列狀態(tài)的文件:
- 添加到暫存區(qū)的修改(staged changes)
- Git跟蹤的但并未添加到暫存區(qū)的修改(unstaged changes)
但以下狀態(tài)的文件不會緩存:
- 在工作目錄中新的文件(untracked files)
- 被忽略的文件(ignored files)
如果想要上述的文件都被緩存,可以使用-u或者--include-untracked可以工作目錄新的文件,使用-a或者--all命令可以當前目錄下的所有修改
二、如何使用
關(guān)于git stash常見的命令如下:
- git stash
- git stash save
- git stash list
- git stash pop
- git stash apply
- git stash show
- git stash drop
- git stash clear
- git stash
保存當前工作進度,會把暫存區(qū)和工作區(qū)的改動保存起來
git stash save
git stash save可以用于存儲修改.并且將git的工作狀態(tài)切回到HEAD也就是上一次合法提交上
如果給定具體的文件路徑,git stash只會處理路徑下的文件.其他的文件不會被存儲,其存在一些參數(shù):
--keep-index 或者 -k 只會存儲為加入 git 管理的文件
--include-untracked 為追蹤的文件也會被緩存,當前的工作空間會被恢復為完全清空的狀態(tài)
-a 或者 --all 命令可以當前目錄下的所有修改,包括被 git 忽略的文件
git stash list
顯示保存進度的列表。也就意味著,git stash命令可以多次執(zhí)行,當多次使用git stash命令后,棧里會充滿未提交的代碼,如下:
其中,stash@{0}、stash@{1}就是當前stash的名稱
git stash pop
git stash pop 從棧中讀取最近一次保存的內(nèi)容,也就是棧頂?shù)膕tash會恢復到工作區(qū)
也可以通過 git stash pop + stash名字執(zhí)行恢復哪個stash恢復到當前目錄
如果從stash中恢復的內(nèi)容和當前目錄中的內(nèi)容發(fā)生了沖突,則需要手動修復沖突或者創(chuàng)建新的分支來解決沖突
git stash apply
將堆棧中的內(nèi)容應用到當前目錄,不同于git stash pop,該命令不會將內(nèi)容從堆棧中刪除
也就說該命令能夠?qū)⒍褩5膬?nèi)容多次應用到工作目錄中,適應于多個分支的情況
同樣,可以通過git stash apply + stash名字執(zhí)行恢復哪個stash恢復到當前目錄
git stash show
查看堆棧中最新保存的stash和當前目錄的差異
通過使用git stash show -p查看詳細的不同
通過使用git stash show stash@{1}查看指定的stash和當前目錄差異
git stash drop
git stash drop + stash名稱表示從堆棧中移除某個指定的stash
git stash clear
刪除所有存儲的進度
三、應用場景
當你在項目的一部分上已經(jīng)工作一段時間后,所有東西都進入了混亂的狀態(tài), 而這時你想要切換到另一個分支或者拉下遠端的代碼去做一點別的事情
但是你創(chuàng)建一次未完成的代碼的commit提交,這時候就可以使用git stash
例如以下場景:
當你的開發(fā)進行到一半,但是代碼還不想進行提交 ,然后需要同步去關(guān)聯(lián)遠端代碼時.如果你本地的代碼和遠端代碼沒有沖突時,可以直接通過git pull解決
但是如果可能發(fā)生沖突怎么辦.直接git pull會拒絕覆蓋當前的修改,這時候就可以依次使用下述的命令:
- git stash
- git pull
- git stash pop
或者當你開發(fā)到一半,現(xiàn)在要修改別的分支問題的時候,你也可以使用git stash緩存當前區(qū)域的代碼
- git stash:保存開發(fā)到一半的代碼
- git commit -m '修改問題'
- git stash pop:將代碼追加到最新的提交之后