天天看點

Git進階——git stash

git stash工具

對于工作區和暫存區,有一個特别重要也是容易被大家忽略的點:那就是對于所有分支而言,工作區和暫存區是公共的。也就是說,未add的内容不屬于任何一個分支, 未commit的内容也不屬于任何一個分支,git 切換分支時會把未add或未commit的内容帶過去。

假設有這麼一個需求,你現在在develop分支上進行某個功能的開發,當你開發到一半的時候,你的leader告訴你說master分支上出現了一點緊急bug,需要你立即修複,那麼你隻能放下手頭的工作去修複bug了,在你建立一個hotfix分支去修複bug之前,你應該先對你之前開發到一半的develop分支做好處理工作,你的代碼開發到一半,那麼你的工作區和暫存區應該是不幹淨的,還沒有送出到本地庫上,如果直接切換到hotfix分支,由于工作區和暫存區是公共的,那麼hotfix分支的工作區和暫存區也是不幹淨的,一方面會對hotfix分支有影響,另一方面就是當你修複完bug之後再回到develop分支,也可能工作區和暫存區的内容已經跟之前不一樣了。是以我們必須對工作區和暫存區做一個處理。我們有兩種方法:

  1. 送出到本地庫:把完成一半的代碼

    commit

    送出到本地倉庫,然後切換分支去修改bug,改好之後再切換回來。這樣的話往往log上會有大量不必要的記錄,是以一般不這麼做。
  2. 使用git bash 工具:使用

    git stash

    就可以将你目前未送出到本地(和伺服器)的代碼推入到Git的棧中,這時候你的工作區間和上一次送出的内容是完全一樣的,是以你可以放心的修bug,等到修完bug,送出到伺服器上後,再使用

    git stash pop

    将以前一半的工作應用回來。

總結:git stash可以擷取你工作目錄的中間狀态——也就是你修改過的被追蹤的檔案和暫存的變更——并将它儲存到一個未完結變更的堆棧中,随時可以重新應用。

PS:在目前分支git stash的内容, 在其他分支也可以git stash pop出來,為什麼? 因為:工作區和暫存區是公共的

git stash 相關指令

  1. git stash

    :把所有未送出的修改(包括暫存的和非暫存的)都儲存起來,用于後續恢複目前工作目錄。執行完該操作後通過git status就可以看到一個幹淨的工作目錄了
  2. git stash save "存儲的資訊"

    :效果是與

    git stash

    一樣的,隻是會給每次存儲的版本記錄一個資訊
  3. git stash list

    :檢視現有的stash
  4. git stash pop

    :彈出stash堆棧的棧頂,可以恢複之前緩存的工作目錄,這個指令還會将将緩存堆棧中的第一個stash删除
  5. git stash apply

    :彈出stash堆棧的棧頂,可以恢複之前緩存的工作目錄,這個指令不會删除stash
  6. git stash drop

    :後面可以加上stash名字,可以移除指定的stash
  7. git stash clear

    :删除所有緩存的stash
  8. git stash -u

    :可以stash未被git追蹤的檔案
  9. git stash -a

    :可以stash目前目錄下的所有修改。
git stash 會緩存的檔案
  1. 已添加到暫存區的修改(staged changes)
  2. 已被Git跟蹤的但并未添加到暫存區的修改(unstaged changes)
git stash 不會緩存的檔案
  1. 未被追蹤的檔案(untracked files)
  2. 被忽略的檔案(ignored files)

重要概念

對于暫存區,其實我們通過git status指令看的主要就是暫存區的内容

對于工作區,其實就可以了解成我們在idea開發時界面能到看的一些代碼操作

我們通過git status指令檢視一下:

Git進階——git stash

圖中1所示的就是已經添加到暫存區的修改,也就是我們執行了git add操作之後的更改會在這裡顯示

圖中2所示的就是已被git追蹤的但是還未添加到暫存區的修改,一般來說,我們對已存在的檔案進行修改之後都會存放在這個位置

圖中3所示的就是還未被git追蹤的修改,一般來說,我們建立檔案的操作都會存放在這個位置

我們已經知道了,通過git stash 指令能夠将已添加到暫存區和已被git追蹤但未送出到暫存區的檔案給暫時存儲起來,但是如果是未被追蹤的檔案是不會被存儲起來的,如果需要的話可以加上-u參數,但是我們一般都不這麼做,一般都是先直接git add添加到暫存區;

另外,假設這麼一個場景:我們在develop分支上對一個類檔案進行了修改,但是這個修改還未送出到本地庫,因為我們的開發進行到一半;這時候我們切換到另一個hotfix分支上的時候,通過git status指令可以看到暫存區是不幹淨的,另外,我們在hotfix分支上還能看到這個修改,為什麼呢?其實就是因為工作區和暫存區是所有分支共用的,是以我們在工作區能看到develop未送出的修改,而當我們執行了git stash指令之後,就會發現在hotfix這個工作區是看不到develop分支的修改了,另外通過git status指令看到的暫存區也是幹淨的了。

結語

Git的重要性毋庸置疑,現在外面公司基本都會用git進行版本控制,是以對于git的相關操作和概念是必須掌握的,要學習git,一定不能幹看着,必須多加實踐,多敲指令才能真正的記住這些指令,你看懂了這些指令并不代表真正的學會了git操作,有時候自己動手敲指令的過程才是學習到最多知識的!

其實在之前我就已經學習過git,曾經天真的以為我掌握了git,到頭來發現自己隻記住了git clone😱

堅持是一種習慣!