2014-02-18 27 views
8

我意外執行了git stash pop兩次讓我躲在我想要的位置後面。我如何撤消最後一個流行音樂?我確實想要第一個彈出,但不是第二個,所以reset --hard HEAD不會爲我做。意外地跑了兩次git stash彈出

回答

7

「撤消」git stash pop是一種痛苦的,除非你有在你的屏幕上列出你的窗口的原始提交ID。

git stash documentation有方向(最後)用於恢復掉落的包裝。這些是您想要的說明,因爲pop只是「apply,然後drop」。這意味着如果你恢復了兩個擋板,然後你可以使用git reset --hard恢復一切,git stash pop(或更安全,因爲它不會「掉落」 - git stash apply)你想使用的那個,然後驗證一切。

如果你可以找到並恢復兩個包裝,那可能是我該怎麼做。

如果您只能找到第二個存儲(您想要「取消應用」的存儲),您可以嘗試反向應用它。

下面是從文檔中的「咒語」:

git fsck --unreachable | 
grep commit | cut -d\ -f3 | 
xargs git log --merges --no-walk --grep=WIP 

當你運行這個你會得到代表每個w提交各"stash bag"的提交列表。比方說,它轉儲出來是這樣的:因爲它是藏匿發生的時間

Checking object directories: 100% (256/256), done. 
Checking objects: 100% (66/66), done. 
commit 2783bc8cf98192acc3de647d6cbff2c1a2aecca5 
Merge: 222c4dd 8466342 
Author: ... 
Date: Wed Feb 12 17:38:13 2014 -0700 

    WIP on branch: 222c4dd add clobber-reg example 

commit e9fc3cc8e7864813b54bb1281c845297a16b1b47 
Merge: 222c4dd d790e1f 
Author: ... 
Date: Wed Feb 12 17:28:00 2014 -0700 

    WIP on branch: 222c4dd add clobber-reg example 

date線在這裏非常有用。很難分開那兩個擋板,不是嗎?將原始SHA-1 ID保存在某處,然後在每個ID上運行git stash show -p。當你發現一個有價值的,給它一個名字:

$ git tag recover-exp-1 e9fc3cc8e7864813b54bb1281c845297a16b1b47 
$ git tag recover-exp-2 ... 

一旦你肯定哪些是正確的恢復的,你是好於做這樣的事情git reset --hard然後git stash apply方面去。您現在可以通過上面所做的標記名稱申請:

$ git reset --hard # ouch, all gone now (maybe "git stash save" first) 
$ git stash apply recover-exp-3 # that turned out to be the right one 

當所有被保存並提交你想要的方式,你可以刪除各種「恢復」標籤。 (注意,你可以使用任何你喜歡的名字; recover-exp-沒什麼特別的,這只是我在這裏編造的東西。)

+0

沒關係。我發現它是一個PIA。所以我剛剛做了'重置-hard',並且吸取了最後一次更改集的重做,幸運的是沒有太多。 – amphibient

1

我不相信你可以很容易地撤銷最後一個流行音樂。如果您需要從第一個流行音樂中獲得所需的東西,那麼您可能只需在此處處理衝突。

未來,如果你想避免這樣的問題,你可以在本地分支而不是使用stashes。這更麻煩,但更有彈性。

+0

隱藏本身依賴於reflog。 – linquize