今天在看一個bug,以前一個分支的版本是正常的,在新的分支上上加了不少日誌沒找到緣由,但願回溯到以前的版本,肯定下從哪一個提交引入的問題,可是還不想把如今的修改提交,也不但願在Git上看到當前修改的版本(帶有大量日誌和調試信息)。所以呢,查查Git有沒有提供相似功能,就找到了git stash
的命令。css
綜合下網上的介紹和資料,git stash
(git儲藏)可用於如下情形:html
git stash
。commit
提交到本地倉庫,而後切換分支去修改bug,改好以後再切換回來。這樣的話每每log上會有大量沒必要要的記錄。其實若是咱們不想提交完成一半或者不完善的代碼,可是卻不得不去修改一個緊急Bug,那麼使用git stash
就能夠將你當前未提交到本地(和服務器)的代碼推入到Git的棧中,這時候你的工做區間和上一次提交的內容是徹底同樣的,因此你能夠放心的修Bug,等到修完Bug,提交到服務器上後,再使用git stash apply
將之前一半的工做應用回來。git stash
命令。儲藏(stash)能夠獲取你工做目錄的中間狀態——也就是你修改過的被追蹤的文件和暫存的變動——並將它保存到一個未完結變動的堆棧中,隨時能夠從新應用。git stash
用法git stash
會把全部未提交的修改(包括暫存的和非暫存的)都保存起來,用於後續恢復當前工做目錄。
好比下面的中間狀態,經過git stash
命令推送一個新的儲藏,當前的工做目錄就乾淨了。git
$ git status On branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html $ git stash Saved working directory and index state WIP on master: 5002d47 our new homepage HEAD is now at 5002d47 our new homepage $ git status On branch master nothing to commit, working tree clean
須要說明一點,stash是本地的,不會經過git push
命令上傳到git server上。
實際應用中推薦給每一個stash加一個message,用於記錄版本,使用git stash save
取代git stash
命令。示例以下:緩存
$ git stash save "test-cmd-stash" Saved working directory and index state On autoswitch: test-cmd-stash HEAD 如今位於 296e8d4 remove unnecessary postion reset in onResume function $ git stash list stash@{0}: On autoswitch: test-cmd-stash
能夠經過git stash pop
命令恢復以前緩存的工做目錄,輸出以下:服務器
$ git status On branch master nothing to commit, working tree clean $ git stash pop On branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)
這個指令將緩存堆棧中的第一個stash刪除,並將對應修改應用到當前的工做目錄下。
你也可使用git stash apply
命令,將緩存堆棧中的stash屢次應用到工做目錄中,但並不刪除stash拷貝。命令輸出以下:app
$ git stash apply On branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html
可使用git stash list
命令,一個典型的輸出以下:post
$ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051 Revert "added file_size" stash@{2}: WIP on master: 21d80a5 added number to log
在使用git stash apply
命令時能夠經過名字指定使用哪一個stash,默認使用最近的stash(即stash@{0})。spa
可使用git stash drop
命令,後面能夠跟着stash名字。下面是一個示例:調試
$ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051 Revert "added file_size" stash@{2}: WIP on master: 21d80a5 added number to log $ git stash drop stash@{0} Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
或者使用git stash clear
命令,刪除全部緩存的stash。日誌
可使用git stash show
命令,後面能夠跟着stash名字。示例以下:
$ git stash show index.html | 1 + style.css | 3 +++ 2 files changed, 4 insertions(+)
在該命令後面添加-p
或--patch
能夠查看特定stash的所有diff,以下:
$ git stash show -p diff --git a/style.css b/style.css new file mode 100644 index 0000000..d92368b --- /dev/null +++ b/style.css @@ -0,0 +1,3 @@ +* { + text-decoration: blink; +} diff --git a/index.html b/index.html index 9daeafb..ebdcbd2 100644 --- a/index.html +++ b/index.html @@ -1 +1,2 @@ +<link rel="stylesheet" href="style.css"/>
若是你儲藏了一些工做,暫時不去理會,而後繼續在你儲藏工做的分支上工做,你在從新應用工做時可能會碰到一些問題。若是嘗試應用的變動是針對一個你那以後修改過的文件,你會碰到一個歸併衝突而且必須去化解它。若是你想用更方便的方法來從新檢驗你儲藏的變動,你能夠運行 git stash branch,這會建立一個新的分支,檢出你儲藏工做時的所處的提交,從新應用你的工做,若是成功,將會丟棄儲藏。
$ git stash branch testchanges Switched to a new branch "testchanges" # On branch testchanges # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: index.html # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: lib/simplegit.rb # Dropped refs/stash@{0} (f0dfc4d5dc332d1cee34a634182e168c4efc3359)
這是一個很棒的捷徑來恢復儲藏的工做而後在新的分支上繼續當時的工做。
默認狀況下,git stash
會緩存下列文件:
但不會緩存一下文件:
git stash
命令提供了參數用於緩存上面兩種類型的文件。使用-u
或者--include-untracked
能夠stash untracked文件。使用-a
或者--all
命令能夠stash當前目錄下的全部修改。
至於git stash
的其餘命令建議參考Git manual。