2010-03-12 33 views
30

我只是試圖通過對我的主人進行小修改來重新綁定一個非常舊的分支。 合併涉及的三個文件中的一個時出現問題,所以我做了一個沒有思想的--skip,認爲它只是跳過那個文件,但是當它發生時,它似乎跳過了我所做的所有更改,並向前滾動。所以現在rebase已經完成了,我的改變似乎已經消失了。在重新綁定期間從無意中跳過恢復

我看過關於undoing rebase的問題,但是對我來說這都是希臘文,我看到reflog,但我不知道分支在rebase之前連接到哪個提交。

在任何情況下,我並不需要撤消rebase,我只是想恢復兩個文件中的更改。無論如何要正確地做到這一點(如果沒有這樣做,我只需要恢復昨天備份的存儲庫並手動選取數據)。

回答

35

首先,製作一個git工作文件夾的壓縮包。這使得它可以多次嘗試。

讓我們假設以下發生

  • git的結帳另一個大的分支
  • git的重訂主
  • 一些問題(你跳過)

在這一點上,你現在仍然在另一個老分支和你reflog告訴你:

6f8348f [email protected]{0}: rebase: <commit message of last commit in another-old-branch> 
e547ec0 [email protected]{1}: checkout: moving from another-old-branch to e547ec0d2a558d189464fc57192066b34ec5f28f^0 
65cedf8 [email protected]{2}: checkout: moving from master to another-old-branch 

想象一下,分支就像符號鏈接(或指針),我們所要做的就是讓分支的「另一箇舊分支」指向舊的commit-id。舊的提交仍然存在,並且它沒有被你的rebase所觸及。有點兒:「哎git的,另一種歷史的分支是e547ec0d2,忘記一切所發生」

在我們這裏的情況下,這是e547ec0d2a558d189464fc57192066b34ec5f28f,所以我們現在要做的是

  • git的結帳另一人老枝#如果你是不是已經有
  • 現在的git的復位 - 硬e547ec0d2a558d189464fc57192066b34ec5f28f

您的分支恢復正常。你可以重試你的rebase。

請注意,您的reflog現在比上面的示例稍微複雜一些。但應該STIL LBE有沒有什麼地方...

好運!

+1

不,我一定是搞砸別的東西了,同時嘗試恢復。下次標註爲答案... – Benjol 2010-03-15 06:00:51

+8

+1;另一個提示:'git log -g'可以是瀏覽reflog的更好方式。 – 2010-12-15 15:27:10

+2

工作就像一個魅力!剛剛救了我的早上,謝謝你 – kmanzana 2016-01-05 11:51:08