我想知道是否能夠從git stash中提取單個文件或diff文件,而不會彈出存儲變動集。 git
任何人均可以提供一些關於此的建議/想法嗎? shell
您可使用「 git show stash@{0}
」獲取存儲的差別(或者不管存儲的數量是什麼;請參閱「git stash list」)。 爲單個文件提取diff的部分很容易。 app
若是您使用git stash apply
而不是git stash pop
,它會將存儲應用於您的工做樹但仍保留存儲。 spa
完成此操做後,您能夠add
/ commit
所需的文件,而後重置其他更改。 code
在git stash手冊頁上,您能夠閱讀(在「討論」部分,在「選項」描述以後): get
存儲表示爲提交,其樹記錄工做目錄的狀態,其第一個父節點是建立存儲時HEAD的提交。 it
所以,您能夠將stash(例如stash@{0}
是第一個/最頂層的存儲)視爲合併提交,並使用: io
$ git diff stash@{0}^1 stash@{0} -- <filename>
說明: stash@{0}^1
表示給定存儲的第一個父節點,如上面的解釋中所述,是存儲更改的提交。 咱們使用這種形式的「git diff」(有兩次提交),由於stash@{0}
/ refs/stash
是一個合併提交,咱們必須告訴git咱們要對哪一個父進行區分。 更神祕: 擴展
$ git diff stash@{0}^! -- <filename>
也應該工做(有關rev^!
語法的解釋,請參閱git rev-parse手冊頁,在「指定範圍」部分)。 file
一樣,您可使用git checkout從存儲中檢查單個文件:
$ git checkout stash@{0} -- <filename>
或者將其保存在另外一個文件名下:
$ git show stash@{0}:<full filename> > <newfile>
要麼
$ git show stash@{0}:./<relative filename> > <newfile>
( 請注意 ,此處<full filename>是相對於項目頂級目錄的文件的完整路徑名(想一想:相對於stash@{0}
))。
您可能須要保護stash@{0}
免受shell擴展,即便用"stash@{0}"
或'stash@{0}'
。
要理解的最簡單的概念,雖然可能不是最好的,可是您更改了三個文件,而且您但願存儲一個文件。
若是你使用git stash
來存儲全部內容, git stash apply
再次將它們帶回來而後git checkout fc
對有問題的文件進行有效的重置。
當你想要解壓縮該文件時,執行git reset --hard
,而後再次運行git stash apply
,利用git stash apply
不會清除存儲堆棧中的差別這一事實。
要查看整個文件: git show stash@{0}:<filename>
要查看diff: git diff stash@{0}^1 stash@{0} -- <filename>