這就是發生了什麼事:在分離的HEAD狀態下創建的git提交會發生什麼?
我有一個分支A.在分支A我犯了一堆的變化。我對代碼不滿意,所以我檢查了分支A中的前一個提交。然後我做了更多更改並將它們提交到分支A上。現在我無法在任何地方找到此提交。我失去了這個代碼?
這就是發生了什麼事:在分離的HEAD狀態下創建的git提交會發生什麼?
我有一個分支A.在分支A我犯了一堆的變化。我對代碼不滿意,所以我檢查了分支A中的前一個提交。然後我做了更多更改並將它們提交到分支A上。現在我無法在任何地方找到此提交。我失去了這個代碼?
舊的提交仍在reflog中。
git reflog
這將顯示提交列表,並且「lost」提交應該在那裏。你可以把它變成一個新的分支。例如,如果SHA-1是ba5a739,那麼你可以在老做了一個名爲「新枝」的新分支承諾:
git branch new-branch ba5a739
注意,「丟失」當數據庫提交將被刪除修剪。
你沒有失去它,Git仍然保留副本(但它目前無法通過任何分支頭)。您可以使用git reflog
命令找到您缺少的提交。 reflog會記錄分支頭的歷史位置,您可以使用它來查找分支頭以前指向的內容。
你的工作目錄狀態的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'
您的提交仍然可以在reflog中找到,正如已經指出的那樣。除了其他的答案,這裏是接管分離的頭提交到當前分支直接,而無需創建和合並一個新的分支的方式:
查找的的SHA-1散列你的提交在分離的頭狀態
git reflog
再發執行,以下令從舊到新的所有承諾哈希:
例如,如果我只有一個,在「7字頭」給予短哈希格式:
git cherry-pick a21d053
這將創建一個新的承諾,您的當前分支(每一個分離的頭提交你在命令中提到)。它也接管了最初的提交消息。
在Sourcetree中,我發現git reflog不起作用,所以我想出瞭如何使用GUI來做到這一點。
首先,通過在Command History(查看:顯示命令輸出)中查找消息來嘗試查找「lost」提交。在失敗的提交後,希望可以在命令「切換分支」中看到提交註釋,並提供1234567提交ID。
採取提交ID到下一步驟。
點擊「分公司」按鈕,在頂部工具欄中,你應該得到一個對話框,「新科」在那裏你可以指定一個特定的提交。把那個提交ID放在那裏,指定一個新的分支名稱,點擊創建分支,你應該得到一個新的分支丟失的提交!
此帶回一些丟失的工作對我來說!
您可能會發現丟失(懸掛)款用下面的命令:
git fsck --lost-found
請注意,如果您當前的頭晃來晃去提交,但不被列爲丟失。
您可能會發現在git-fsck(1) Manual Page
然後你可以在那逝去創建分支的詳細信息提交:
git branch new-branch ba5a739
我第一次使用命令「git reflog」,然後使用「git branch new-branch ba5a739」作爲子模塊,它工作正常。 – ondermerol 2016-07-20 21:11:21
按照以下步驟將分離的頭的鏈接回混帳回購協議
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
全部設定!
當你說「我檢查了之前的承諾分支A」,你的意思是「我分支的復位以前犯」?即你真的'git reset'而不是'git checkout'? – 2012-04-02 21:43:58
不,我用結帳。 reflog工作。 – Mausimo 2012-04-02 21:50:34
如果你使用checkout,那麼你將會在一個分離的'HEAD'上,而分支A會留在前面的提交中。你究竟運行了哪些命令? – 2012-04-02 22:13:43