Git新手教程-存儲與清理(八)

前言

在實際開發中,經常會遇到這樣的狀況,咱們正在 dev 上開發一個功能,這個時候忽然接到上級命令,須要修改一個緊急 bug-5501 ,固然咱們立刻想到的就是建立一個 branch bug-5501 的分支來修復它,可是這個時候咱們在 dev 上的功能已經寫了一半了,若是咱們直接建立分支,並 chekcout branch bug-5501 的話,咱們在 dev 上的修改的內容,也會顯示在咱們 branch bug-5501 上,這樣就會讓咱們感受到很是混亂。咱們也不能提交咱們未完成的功能到 dev 上,那這個時候怎麼辦呢?java

在Git中,爲咱們提供了 git stash 命令,專門負責處理這種狀況。讓咱們一塊兒來了解該命令吧。git

git stash 指令介紹

爲了演示具體效果,這裏如下面例子爲例,咱們在dev開發的新功能,修改了Person.java,具體以下所示:bash

dev-新功能.jpg

這個時候咱們運行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

bug-5501.jpg

那如今咱們想要建立一個新的分支 branch bug-5501 ,可是不想包括咱們以前修改的 Person.java 中的內容,那麼咱們可使用 git stashgit 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

git-stash流程.jpg

在上圖中,從上往下分別爲兩個步驟:cdn

  • 步驟1:在 dev 分支上,咱們調用 git stash or git stash save message 命令。
  • 步驟2:當執行了步驟1後,咱們在接着建立分支 bug-5501,並切換到該分支下。

經過上述兩個步驟後,那如今咱們就能夠開心的在咱們的bug-5501分支開發啦。blog

git stash 與 git stash save 的區別

  • 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 記錄

刪除特定的 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 指令。

恢復 stash 所存儲的內容

若是這個時候咱們修改了 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.jpg

注意:當你調用 git stash apply 並不指定具體的stash記錄時,默認會恢復棧頂的stash記錄。也就是等同於 git stash apply stash@{0}

git stash save --keep-index

在上中咱們已經講解了如何使用stash並恢復等一系列操做,如今咱們來說解在命令 git stash save 中的選填參數, --keep-index,默認狀況下使用 git stash save 命令是不帶這個選項的,下面咱們就看看這個參數的具體使用意義。

不添加 --keep-index

不添加keep-index.jpg

解釋一下上圖的流程:

  • 上圖中咱們在dev中開發新功能,修改(modify) Person類,並新建(add) Woman.java 這個文件(該文件已經被添加到暫存區了)。
  • 這個時候上級命令咱們改 bug-5501 ,這個時候,若是咱們調用 git save stash 命令,這個時候 dev 分支上就只會有沒有修改的Person類。Person 類的修改與 Woman.java 兩個更改都放入stash記錄棧中
  • 這個時候咱們新建 bug-5501 分支,去改咱們的bug,當咱們修改bug完畢後,咱們check out 到 dev 分支上來,並想恢復以前咱們存儲的內容,那麼咱們調用 git stash apply 時,以前咱們修改的person 類與新建的 Woman.java 文件就又會回到咱們的 dev 分支上。
添加 --keep-index

若是咱們使用git stash meessage --keep-index,咱們看看又是什麼效果呢?,具體以下圖所示:

添加keep-index.jpg

觀察上圖,咱們會發現,使用了--keep-index參數後,在stash記錄棧中是不會存儲 git add 命令已暫存的東西,也就是不會存儲 Woman.java 文件。

須要注意的是,當咱們使用--keep-index參數時,由於不會stasht記錄棧中是不會存儲 git add 命令已暫存的東西,故若是咱們建立新分支時,咱們以前git add的文件也會在新分支中。是否添加該參數,由你們須要而定。

IntelliJ IDEA or Android Sutdio 圖形化界面使用stash

瞭解了Git的存儲與清理的相關命令後,咱們來了解一下,在 IntelliJ IDEAor Android Sutdio中Git存儲與清理的圖形化界面的對應流程。雖然命令行很是牛逼,可是有時候咱們也想偷個懶對吧。

建立 stash 流程

首先咱們來看一下建立一個 stash 在 IntelliJ IDEA 中的流程,首先點擊鼠標右鍵。依次選擇下圖中紅色箭頭所指內容。

stash建立流程.png

按照上圖的指示,依次點擊,咱們能獲得下圖:

stash模塊介紹.jpg

上圖中:

  1. Keep index:就是建立 stash 時,是否添加 --keep-index 參數。選中添加,反之不添加。
  2. Message:咱們建立的stash的描述。
  3. Creat Stash:建立stash

若是你已經熟悉了Git的建立 stash 的指令,我相信這裏對你沒有什麼難度啦。

清理 stash 流程

仍是點擊鼠標右鍵,依次選擇下圖中紅色箭頭所指內容。

unStash瀏覽流程.png

按照上圖的指示,依次點擊,咱們能獲得下圖:

unstash模塊介紹.jpg

  1. Stashes:顯示了咱們全部建立的 stash
  2. View:查看 stash 所存儲的內容
  3. Drop:刪除棧中對應的 stash
  4. Clear:清除棧中全部的 stash
  5. Pop stash:應用選中的 stash,而後當即從棧上刪除它。
  6. As new Branch:將當前 stash 所存儲的內容做爲一個分支並checkout。也就是若是你在 master 建立一個stash,並設置了As new branch的 爲 LoginBranch,那麼你會立刻切換到 LoginBranch 分支中。
  7. Apply Stash:應用你選中的stash,可是不會刪除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 。

參考

站在巨人的肩膀上,才能看的更遠~

相關文章
相關標籤/搜索