2012-04-02 194 views
103

這就是發生了什麼事:在分離的HEAD狀態下創建的git提交會發生什麼?

我有一個分支A.在分支A我犯了一堆的變化。我對代碼不滿意,所以我檢查了分支A中的前一個提交。然後我做了更多更改並將它們提交到分支A上。現在我無法在任何地方找到此提交。我失去了這個代碼?

+0

當你說「我檢查了之前的承諾分支A」,你的意思是「我分支的復位以前犯」?即你真的'git reset'而不是'git checkout'? – 2012-04-02 21:43:58

+0

不,我用結帳。 reflog工作。 – Mausimo 2012-04-02 21:50:34

+0

如果你使用checkout,那麼你將會在一個分離的'HEAD'上,而分支A會留在前面的提交中。你究竟運行了哪些命令? – 2012-04-02 22:13:43

回答

141

舊的提交仍在reflog中。

git reflog 

這將顯示提交列表,並且「lost」提交應該在那裏。你可以把它變成一個新的分支。例如,如果SHA-1是ba5a739,那麼你可以在老做了一個名爲「新枝」的新分支承諾:

git branch new-branch ba5a739 

注意,「丟失」當數據庫提交將被刪除修剪。

+8

謝謝,這工作。很高興知道,我認爲這完全失敗了。 – Mausimo 2012-04-02 21:51:25

+0

我做了同樣的事情,並因心臟病發作而認爲它已經消失。謝謝(你的)信息! – Chausser 2014-03-03 03:41:39

+9

使用'git的櫻桃挑選沙:'移動提交到現有的分支,以防不小心犯而在分離的頭狀態 – 2014-08-20 12:56:13

4

你沒有失去它,Git仍然保留副本(但它目前無法通過任何分支頭)。您可以使用git reflog命令找到您缺少的提交。 reflog會記錄分支頭的歷史位置,您可以使用它來查找分支頭以前指向的內容。

4

你的工作目錄狀態的Git說法是「 detached HEAD。 」這是git reflog保存的另一個地方。

$ git reflog 
0b40dd6 [email protected]{0}: commit: my commit on detached HEAD 
... 

如果我嘗試檢出一個不同的分支,git-1.7.5.1會給出一個有用的建議。

$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to 
any of your branches: 

    0b40dd6 my commit on detached HEAD 

If you want to keep them by creating a new branch, this may be a good time 
to do so with: 

git branch new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b 

Switched to branch 'master'
+0

感謝您的信息和鏈接。該鏈接幫助我瞭解發生了什麼。 – Mausimo 2012-04-02 22:17:20

+0

非常有用的幻燈片。網址已移動,所以我會更新它。 – miva2 2015-08-12 08:02:40

41

您的提交仍然可以在reflog中找到,正如已經指出的那樣。除了其他的答案,這裏是接管分離的頭提交到當前分支直接,而無需創建和合並一個新的分支的方式:

  1. 查找的的SHA-1散列你的提交在分離的頭狀態

    git reflog 
    
  2. 再發執行,以下令從舊到新的所有承諾哈希:

    ​​

    例如,如果我只有一個,在「7字頭」給予短哈希格式:

    git cherry-pick a21d053 
    

這將創建一個新的承諾,您的當前分支(每一個分離的頭提交你在命令中提到)。它也接管了最初的提交消息。

1

在Sourcetree中,我發現git reflog不起作用,所以我想出瞭如何使用GUI來做到這一點。

首先,通過在Command History(查看:顯示命令輸出)中查找消息來嘗試查找「lost」提交。在失敗的提交後,希望可以在命令「切換分支」中看到提交註釋,並提供1234567提交ID。

採取提交ID到下一步驟。

點擊「分公司」按鈕,在頂部工具欄中,你應該得到一個對話框,「新科」在那裏你可以指定一個特定的提交。把那個提交ID放在那裏,指定一個新的分支名稱,點擊創建分支,你應該得到一個新的分支丟失的提交!

此帶回一些丟失的工作對我來說!

7

您可能會發現丟失(懸掛)款用下面的命令:

git fsck --lost-found 

請注意,如果您當前的頭晃來晃去提交,但不被列爲丟失。

您可能會發現在git-fsck(1) Manual Page

然後你可以在那逝去創建分支的詳細信息提交:

git branch new-branch ba5a739 
+0

我第一次使用命令「git reflog」,然後使用「git branch new-branch ba5a739」作爲子模塊,它工作正常。 – ondermerol 2016-07-20 21:11:21

1

按照以下步驟將分離的頭的鏈接回混帳回購協議

  1. git checkout "your branch with path but without remote name"

例如如果遠程名稱是起源和分行名稱爲bugfix/somebranch然後使用git checkout bugfix/somebranch

  • git reflog 得到提交SHA的從分離分支的你的提交列表中列出。

  • git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  • git push

  • 全部設定!

    相關問題