如何從git存儲中提取單個文件(或更改文件)?

我想知道是否能夠從git stash中提取單個文件或diff文件,而不會彈出存儲變動集。 git

任何人均可以提供一些關於此的建議/想法嗎? shell


#1樓

您可使用「 git show stash@{0} 」獲取存儲的差別(或者不管存儲的數量是什麼;請參閱「git stash list」)。 爲單個文件提取diff的部分很容易。 app


#2樓

若是您使用git stash apply而不是git stash pop ,它會將存儲應用於您的工做樹但仍保留存儲。 spa

完成此操做後,您能夠add / commit所需的文件,而後重置其他更改。 code


#3樓

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}'


#4樓

要理解的最簡單的概念,雖然可能不是最好的,可是您更改了三個文件,而且您但願存儲一個文件。

若是你使用git stash來存儲全部內容, git stash apply再次將它們帶回來而後git checkout fc對有問題的文件進行有效的重置。

當你想要解壓縮該文件時,執行git reset --hard ,而後再次運行git stash apply ,利用git stash apply不會清除存儲堆棧中的差別這一事實。


#5樓

簡短的回答

要查看整個文件: git show stash@{0}:<filename>

要查看diff: git diff stash@{0}^1 stash@{0} -- <filename>

相關文章
相關標籤/搜索