在實際開發中,經常會遇到這樣的狀況,咱們正在 dev
上開發一個功能,這個時候忽然接到上級命令,須要修改一個緊急 bug-5501
,固然咱們立刻想到的就是建立一個 branch bug-5501
的分支來修復它,可是這個時候咱們在 dev
上的功能已經寫了一半了,若是咱們直接建立分支,並 chekcout branch bug-5501
的話,咱們在 dev
上的修改的內容,也會顯示在咱們 branch bug-5501
上,這樣就會讓咱們感受到很是混亂。咱們也不能提交咱們未完成的功能到 dev
上,那這個時候怎麼辦呢?java
在Git中,爲咱們提供了 git stash
命令,專門負責處理這種狀況。讓咱們一塊兒來了解該命令吧。git
爲了演示具體效果,這裏如下面例子爲例,咱們在dev
開發的新功能,修改了Person.java
,具體以下所示:bash
這個時候咱們運行git staus
指令,能夠看到倉庫狀態:app
$ git status
Your branch is up to date with 'origin/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/Person.java
複製代碼
若是直接在當前 dev
分支上直接直接執行命令 git branch bug-5501
,那麼咱們咱們修改的內容也也會在 bug-5501
分支上,以下所示:spa
那如今咱們想要建立一個新的分支 branch bug-5501
,可是不想包括咱們以前修改的 Person.java
中的內容,那麼咱們可使用 git stash
或 git stash save
指令。命令行
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash
Saved working directory and index state WIP on master: 3d1d704 添加了person類
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git status
On branch master
Your branch is up to date with 'origin/master'.
複製代碼
這個時候再使用 git status
,查看咱們的倉庫狀態:3d
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
複製代碼
咱們發現,咱們的倉庫狀態是乾淨的。那這個時候咱們在建立,並切換到相應分支上,那這個時候其餘的分支是不包含以前咱們修改的內容的,也就是以下圖所示:code
在上圖中,從上往下分別爲兩個步驟:cdn
dev
分支上,咱們調用 git stash
or git stash save message
命令。bug-5501
,並切換到該分支下。經過上述兩個步驟後,那如今咱們就能夠開心的在咱們的bug-5501
分支開發啦。blog
git stash
會將當前的存儲內容,自動添加一條描述信息,且描述信息爲當前分支
上最後一次 commit 的 message 。git stash save
須要你指定 stash 的描述信息,好比這樣: git stash save "建立了一條記錄"
。須要注意的是,每次調用 git stash
or git stash save
的記錄都是以棧
的形式存儲的。查看 stash 記錄咱們能夠經過 git stash list
指令來查看:
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash list
stash@{0}: on master: 添加了Woman類
stash@{1}: on master: 添加了Person類
複製代碼
在上述記錄中,最後提交的 stash 記錄始終在棧頂
也就是stash@{0}
,該棧的角標是從零
開始逐級遞增
,而且棧頂的角標始終爲零
。
刪除特定的 stash 記錄,咱們能夠經過 git stash list
指令找到咱們想要刪除的記錄,而後調用 git stash drop
指令就好了,如咱們想刪除 stash@{0}
這條記錄:
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash list
stash@{0}: WIP on master: 3d1d704 添加了person類
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash drop stash@{0}
複製代碼
固然,若是你想刪除全部的stash記錄,咱們也能夠經過 git stash clear
指令。
若是這個時候咱們修改了 bug-5501
,如今咱們想切換回咱們以前的 dev
分支,並恢復以前咱們調用 git stash
or git stash save
所存儲的內容,那如今咱們該怎麼操做呢?咱們能夠先經過 git stash list
找到咱們想要恢復的stash記錄,而後經過使用 git stash apply
指令來恢復咱們想要的內容。這裏咱們以記錄 stash@{0}
爲例:
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash list
stash@{0}: WIP on master: 3d1d704 添加了person類
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash apply stash@{0}
複製代碼
具體場景以下所示:
注意:當你調用
git stash apply
並不指定具體的stash記錄時,默認會恢復棧頂的stash記錄。也就是等同於git stash apply stash@{0}
。
在上中咱們已經講解了如何使用stash並恢復等一系列操做,如今咱們來說解在命令 git stash save
中的選填參數, --keep-index
,默認狀況下使用 git stash save
命令是不帶這個選項的,下面咱們就看看這個參數的具體使用意義。
解釋一下上圖的流程:
修改(modify)
Person類,並新建(add)
Woman.java 這個文件(該文件已經被添加到暫存區了)。git save stash
命令,這個時候 dev
分支上就只會有沒有修改的Person類。Person 類的修改與 Woman.java 兩個更改都放入stash記錄棧中
。bug-5501
分支,去改咱們的bug,當咱們修改bug完畢後,咱們check out 到 dev
分支上來,並想恢復以前咱們存儲的內容,那麼咱們調用 git stash apply
時,以前咱們修改的person 類與新建的 Woman.java 文件就又會回到咱們的 dev
分支上。若是咱們使用git stash meessage --keep-index
,咱們看看又是什麼效果呢?,具體以下圖所示:
觀察上圖,咱們會發現,使用了--keep-index
參數後,在stash記錄棧中是不會存儲 git add
命令已暫存的東西,也就是不會存儲 Woman.java 文件。
須要注意的是,當咱們使用
--keep-index
參數時,由於不會stasht記錄棧中是不會存儲git add
命令已暫存的東西,故若是咱們建立新分支時,咱們以前git add
的文件也會在新分支中。是否添加該參數,由你們須要而定。
瞭解了Git的存儲與清理的相關命令後,咱們來了解一下,在 IntelliJ IDEA
or Android Sutdio
中Git存儲與清理的圖形化界面的對應流程。雖然命令行很是牛逼,可是有時候咱們也想偷個懶對吧。
首先咱們來看一下建立一個 stash 在 IntelliJ IDEA
中的流程,首先點擊鼠標右鍵。依次選擇下圖中紅色箭頭所指內容。
按照上圖的指示,依次點擊,咱們能獲得下圖:
上圖中:
--keep-index
參數。選中添加,反之不添加。若是你已經熟悉了Git的建立 stash 的指令,我相信這裏對你沒有什麼難度啦。
仍是點擊鼠標右鍵,依次選擇下圖中紅色箭頭所指內容。
按照上圖的指示,依次點擊,咱們能獲得下圖:
下面簡單的總結一下:
git stash
會將當前的存儲內容,自動添加一條描述信息,且描述信息爲當前分支
上最後一次 commit 的 message 。git stash save message
須要你指定 stash 的描述信息。git stash list
:查看全部的 stash 記錄。git stash apply
:應用某個 stash ,但不會把存儲從存儲列表中刪除,默認使用棧頂的 stash 即 stash@{0}
,若是要使用其餘 stash 須要調用 git stash apply stash@{$num}
, 好比第二個:git stash apply stash@{1}
。git stash pop
:將 stash 棧中的對應 stash 記錄刪除,並將對應修改應用到當前的工做目錄下,默認爲第一個 stash 即 stash@{0}
,若是要應用並刪除其餘stash,命令:git stash pop stash@{$num}
,好比應用並刪除第二個:git stash pop stash@{1}
。git stash drop stash@{$num}
:刪除對應 stash 棧中的 stash 記錄。好比刪除第二個: git stash drop stash@{1}
git stash clear
:刪除全部 stash 。站在巨人的肩膀上,才能看的更遠~