應用場景
一、當你接到一個修復緊急 bug 的任務時候,一般都是先創建一個新的 bug 分支來修復它,然后合並,最后刪除。但是,如果當前你正在開發功能中,短時間還無法完成,無法直接提交到倉庫,這時候可以先把當前工作區的內容 git stash 一下,然后切換到bug修分支去修復 bug,修復后,再回到當前任務分支git stash pop,恢復之前的工作內容。
二、由於疏忽,本應該在dev分支開發的內容,卻在master上進行了開發,需要重新切回到dev分支上進行開發,可以用git stash將內容保存至堆棧中,切回到dev分支后,再次恢復內容即可。
總的來說,git stash命令的作用就是將目前還不想提交的但是已經修改的內容進行保存至堆棧中,后續可以在某個分支上恢復出堆棧中的內容。這也就是說,stash中的內容不僅僅可以恢復到原先開發的分支,也可以恢復到其他任意指定的分支上。git stash作用的范圍包括工作區和暫存區中的內容,也就是說沒有提交的內容都會保存至堆棧中。
命令詳解
git stash
能夠將所有未提交的修改(工作區和暫存區)保存至堆棧中,用於后續恢復當前工作目錄。
【注意】: 使用該命令時要將工作區的修改添加到暫存區,如果文件沒有提交到暫存區,使用該命令會提示 No local changes to save ,無法將修改保存到堆棧中
git stash save
作用等同於git stash,區別是可以加一些注釋,
如下:git stash的效果:
stash@{0}: WIP on master: b2f489c second1
git stash save “test1”的效果:
stash@{0}: On master: test1
git stash list
查看當前stash中的內容,結果就是下面的各種操作選擇某次存儲的標識
git stash pop
將當前stash中的內容彈出,並應用到當前分支對應的工作目錄上。
注:該命令將堆棧中最近保存的內容刪除(棧是先進后出)順序執行git stash save “test1”和git stash save “test2”命令,效果如下:
$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1
$ git stash pop
On branch master
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: src/main/java/com/wy/StringTest.java
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (afc530377eacd4e80552d7ab1dad7234edf0145d)
$ git stash list
stash@{0}: On master: test1
可見,test2的stash是首先pop出來的。如果從stash中恢復的內容和當前目錄中的內容發生了沖突,也就是說,恢復的內容和當前目錄修改了同一行的數據,那么會提示報錯,需要解決沖突,可以通過創建新的分支來解決沖突。
如果要彈出其他stash,命令:git stash pop stash@{num}
,比如應用並刪除第二個:git stash pop stash@{1}
git stash show
顯示做了哪些改動,默認show第一個存儲,如果要顯示其他存貯,后面加stash@{num}
,比如第二個 git stash show stash@{1}
#簡略顯示文件修改行數
git stash show
#具體顯示修改內容
git stash show -p
git stash apply
應用某個存儲,但不會把存儲從存儲列表中刪除,默認使用棧頂緩存,即stash@{0},如果要使用其他的存儲,使用git stash apply stash@{num}
, 比如第二個:git stash apply stash@{1}
git stash drop
列表中刪除這個存儲,默認刪除棧頂緩存,如果想要刪除指定存儲:git stash drop stash@{num}
git stash clear
刪除所有緩存