2017-05-03 66 views
0

我很驚訝沒有找到對這個問題的迴應,但基本上說我有一個存儲在其中的幾個文件(我可以通過git擴展例如)探索它。看看它的內容,我想在應用它之前刪除一些文件,這有可能嗎?Git:將文件放入存儲器而不應用它

我能想到的唯一解決方法是:

  1. 結賬藏匿到一個新的分支
  2. 結賬的有針對性的文件
  3. 再次藏匿
  4. 刪除分支

有什麼更好的嗎?

謝謝

回答

1

是的還有更好的方法來做到這一點。

首先,您可以檢查藏匿列表作爲

git stash list 

然後你就可以用於檢查藏匿提交的內容,下面做。

git stash show -p [email protected]{1} 

那麼你可以申請使用

git stash apply [email protected]{1} 
+0

感謝,但這個並沒有回答我的問題。我知道如何看到隱藏的內容並將其應用於全球。我正在尋找某種局部隱藏方式,請參閱@LeGEC回答 – clemlaflemme

3

您可以直接使用[email protected]{0}作爲參考提交。

如果你的工作樹是乾淨的(沒有修改過的文件),你可以檢出你想要的文件:

git checkout [email protected]{0} -- file1 file2 file3 

,然後手動檢查DIFF讓你想要什麼。


如果你想要的東西更接近git stash apply的行爲,你可以創建一個補丁,並將其應用:

git show -p [email protected]{0} -- file1 file2 file3 | git apply - 

[編輯]要列出[email protected]{0}修改的文件:

git diff --name-only [email protected]{0}^ [email protected]{0} 

如果你想獲得除一個以外的所有文件:

git show -p [email protected]{0} -- $(git diff --name-only [email protected]{0}^ [email protected]{0} |\ 
          grep -v "thefile") 
+0

git非常感謝。這對於它的功能很好,但不會修改存儲。假設我想申請除一個文件以外的所有文件,我必須將它們全部列出。是否有某種相反的命令? – clemlaflemme

+0

我不能讓'git show -p stash @ {0} - file1 file2 file3 | git apply - '工作,我得到了「錯誤:無法識別的輸入」,而它的工作沒有'| git apply -' – clemlaflemme

+0

「It works」:你的意思是'git show -p ...> patch && git apply patch'起作用了嗎? – LeGEC

1

看起來這個問題的棘手部分圍繞着你想要隱藏的東西,當你完成後。由於git stash {pop|apply}隻影響工作樹(有時指數),它很容易選擇性地採取改變從藏匿處(足以讓我一開始還以爲你被過度思考問題):

git stash pop 
# maybe a 'git reset head' if the index was changed 
git checkout -- file.with.unwanted.changes.in.stash 

但是,這些命令將其刪除完全藏匿;而相比之下,如果我說git stash apply而不是pop,那麼保持不變。這聽起來像你想保持你所選擇的變化(如果你需要再次應用它們)。

(我想交替有可能是你想要完全相反的時代 - 在藏匿這些變化,你沒有申請離開,這樣他們就可以在以後使用。)

所以先走一步返回:修改存儲過程涉及什麼?

存儲實際上包含兩個或三個臨時提交。特殊編號stash指向這些提交,並使用reflog維護多個窗口的「堆棧」(這可能有點破綻,但通常是有效的)。

所以修改存儲是創建新的提交(因爲提交是不可變的)並相應地重新排列參考和reflog。

這就是爲什麼LeGEC提到的符號會起作用,並可能給您額外的靈活性閱讀藏匿。但是因爲reflog的使用與非隱藏參考不同,所以利用這個事實來設法寫入隱藏可能會有意想不到的結果。我並不是說結果會很糟糕,或者不可能預測/控制;但我想最終你會創造出比你想象的更復雜的東西。

因此,如果我們僅限於實際記錄的git-stash子命令,則隱藏或多或少是原子的。當你創建一個存儲器時,有一個patch模式,可以讓你選擇工作改變放入堆棧,但是我知道pop/apply沒有相應的功能。不過,這件事情:

如果要拆分一個乾淨的工作樹和藏匿,你可以嘗試的東西,如:

應用一些變化,並保持這些相同的變化藏匿

git stash pop 
git stash -p 
# select the "good" changes 
git checkout -- . 
git stash apply 

應用一些變化,並保留其餘的變化藏匿

git stash pop 
git stash -p 
# select the "unwanted" changes 

拆分藏匿分爲兩個部分,決定如何處理後來與他們做

git stash pop 
git stash -p 
# select the "good" changes 
git stash 
# now the "good" changes are [email protected]{1} and the "unwanted" are [email protected]{0} 
+0

輔助技術說明:每個存儲總是至少有兩個提交(索引狀態加上工作樹狀態),有時還有三個:索引,工作樹和「附加」。 「附加」部分存在於'git stash -u'或'git stash -a'存儲中,並且包含「未被跟蹤的sans-ignored」或「未被跟蹤的包含被忽略的」文件(僅用於;這與索引和工作不同樹狀態,這兩個狀態都保存所有跟蹤的文件)。 – torek

+0

@torek - 呃......出於某種原因,我認爲如果其中一個是空的,它將被省略。將更新。謝謝。 –

相關問題