2014-12-02 50 views
1

enter image description here如何在不丟失Git中的最後一個提交的情況下將HEAD重置爲某個提交?

我的應用程序中斷。我找不到錯誤在哪裏,我知道它在我提交的提交(2201e03)處開始中斷。

我不知道如何去超過那個,所以我決定做git reset --hard 619176e重置我的應用程序回到它曾經工作的地方。

現在工作。我收到了消息「HEAD現在在619176e修復了CD創建和編輯中的UI」,我的應用程序現在也回來了。很好!

然後,我開發了一些,保存,提交,並試圖再次推動,我不能。 只要我進行修改並嘗試推送,我收到一條消息告訴我,我落後了7次提交,而且我應該執行並拉出然後按下PUSH。 但我不想那樣。

如果我這樣做,我的應用程序將再次打破。因此,即使我現在落後於7次提交。 我真的不想刪除那些提交,但我仍然想從619176e前進。

我該怎麼辦?如果我想保留這7個提交併強制git認爲619176e是我的HEAD或MASTER?並從這裏繼續前進?

我應該用git reset HEAD^嗎?

任何提示建議將是我的巨大幫助!

+0

對於它的價值,'git reset HEAD ^'不是你正在尋找的東西,因爲它實質上是「不提交」最後一次提交而不放棄提交的提交更改。 – 2014-12-02 22:52:22

回答

1

在這種情況下,我可能會分支我的代碼,一旦我回去幾次提交。我不確定這是否是一種最佳做法,但它是一種潛在的修復方法。一個分支的代碼是git checkout -b BranchName

+0

我對git很陌生,所以我想說我創建了一個新的分支,我最終將它與我的主人合併了嗎?所以當這種情況發生時,我的應用程序會再次中斷嗎請稍微澄清一點。 – iori 2014-12-02 18:20:08

+0

我也是一種新的,所以這就是爲什麼我不知道這是否是最佳做法。如果您打算將其與主人合併,那麼您可能會遇到問題。如果這個新的分支是你想成爲主人(因爲它工作),那麼你應該參考http://stackoverflow.com/questions/2763006/change-the-current-branch-to-master-in-git一個解釋。這樣做可以讓你在保留一個正確的主分支的同時,保留引用的破解代碼 – Dacotah 2014-12-02 18:27:34

2

最基本的問題是,你不想扔掉錯誤的提交主人,但這正是git reset --hard 619176e所做的。您確實重置了您的分支(我假設它是分支master),但您推送的遠程分支仍指向舊(錯誤)狀態,即提前7次提交。

正如達科塔已經提出的,這是一個分支的完美用例。您可以通過git checkout 619176e -b branchname從承諾619176e開始創建新分支。然後,您可以引入新的更改,提交併可能推送它們。

只要您想將master上的工作與其上的錯誤重新整合,您就必須決定要使用哪部分工作以及哪部分工作不使用。您也可以修復master上的錯誤。您可以將這些更改提交到master,然後您可以合併分支或在主控制器上重新綁定新分支。

0

我的建議,因爲它似乎你已經被推多次提交後619176e掌握,不希望將其刪除,是再拍提交後歸還,因爲619176e所做的所有更改。

首先更改工作目錄的狀態以匹配619176e。

git checkout 619176e .

這不會改變你的分支或影響現有的提交。它只是修改你的文件,就像他們在619176e一樣。

然後用git commit進行新的提交。

其他選項:

  • 製作基於關閉619176e的另一個分支。這工作正常。儘管如此,將分支集成到主控中將很困難。

  • 使619176e主(即git reset --hard 619176e)和強制推。如果你已經分享了主人,這可能會導致合作者對你生氣。如果你還沒有共享主人,這可能是一個不錯的選擇,並會給你一個更清晰的歷史,但如果你不想失去你的七個提交,你最好先保存對它們的引用。

正如人們經常指出的那樣,它一般不重新寫你的主分支的歷史是一個好主意(主要的例外是當你沒有共享的主與任何人還)。如果您執行git reset --hard 619176e並添加更多提交,那麼您將通過用新提交替換已損壞的提交來重寫主分支的歷史記錄。硬重置本質上只是將您的主分支指向指定的提交。

1

我要告訴你的是非常危險的。如果你使用:

git push -F 

這應該強制推送到遠程並刪除自619176e以來的任何提交。這有幾個問題。首先,如果你有其他用戶,他們的歷史可能會有不好的承諾,如果他們推動,那些不好的承諾會回到你的回購。其次,如果在遠程中有其他有效的提交,則會失去這些提交。

我建議一個接一個地恢復壞提交,然後在推送已清理的存儲庫之前,如果要壓縮它們(使用交互式轉置)。

+1

你的意思是'git push -f'?我在'git-push'手冊中看不到'-F' – ComputerDruid 2014-12-02 23:37:55

相關問題