2012-07-29 74 views
2

我知道Git有大量的文檔,並且有很多關於它的文章(例如,我看過How to delete a 'git commit'this),但沒有任何工作,但我不確定在這裏做什麼。在Git中刪除/還原合併

我有一個回購,到目前爲止只有我承諾,但我最近開始從兩個不同的筆記本電腦工作,不知何故我不小心推動了一些Git看到的合併,然後我推動了最新的變化。

我一直在試圖弄清楚如何徹底刪除最後2次提交,將回購捲回到命運之日前的狀態(因爲我現在有一堆新提交,我需要進入該回購)。如果您願意給我任何指示,請注意,回購託管在github here上。

+2

你見過[這個問題](http://stackoverflow.com/q/448919/912144)? – Shahbaz 2012-07-29 21:25:34

+0

是否有任何合併代表錯誤的原因?如果您在兩臺不同的機器上進行併發更改,則合併可以說是正確的代表。 – cdhowie 2012-07-29 21:25:47

+0

@cdhowie:許多人喜歡合併,以便在歷史中具有實際的語義含義。 OP可能更喜歡rebase。 – 2012-07-29 21:26:34

回答

1

爲了刪除最近的提交,只需使用git reset --hard HEAD^。如果最近的提交是合併,則這將返回到第一個父代(即運行merge/pull之前的狀態)。

如果您可以確定您希望成爲分支機構提示的確切提交,則可以使用git reset --hard $SHA,其中$SHA是有問題的提交。

+0

感謝您回覆Kevin。我仍然無法完成它的工作。 'git reset --hard HEAD ^^'後我該怎麼辦? – rsaw 2012-07-29 22:24:21

0

這爲我工作(由內存):

git reset --hard HEAD^^ 
git push --force HEAD:master 
git pull 
+0

感謝您抽出時間@shkschneider,但我必須錯過關於該命令的一些信息 - ssh似乎認爲'HEAD'是一個主機名。 – rsaw 2012-07-29 22:25:36

+0

奇怪...然後嘗試'git push --force HEAD ^^:master; git reset --hard HEAD ^^; git pull' – shkschneider 2012-07-30 08:22:44

+1

應該是'git push --force origin master'。您已將主設備重置爲本地所需的提交。現在你必須強制推送新的主引用到遠程(通常稱爲起源)。 – patthoyts 2012-08-07 07:52:45

2

新的人,最容易做的事,而不是git reset --hard HEAD^,是使用gitk --all。

這樣你可以看到你所有的歷史。當前分支以粗體顯示。您可以右鍵單擊之前提交的提交,然後選擇「在此重置當前分支」。系統會提示您執行什麼類型的重置。選擇「硬」,你應該回到你想要的位置。

+0

從來沒有聽說過'gitk'。將檢查出來。感謝Adam。 – rsaw 2012-07-30 04:51:05

0

由於an answer在沙赫巴茲貼的問題,我最初試圖

git push -f origin HEAD^^:master 

這似乎完全除去最後兩次提交。但是,一旦我對本地文件進行了一些更改並且進行了推送,舊的提交就顯示出來了! :(

HEAD^^^再次嘗試,這一次(因爲我現在需要刪除最後3個提交)後,我看着git log,看到的一切仍然存在本地。無知至於如何解決這個問題,我只刪除本地目錄,重新克隆回購,並手動複製到我新修改的文​​件中。最後,添加和推送沒有帶回舊的不需要的提交。更好的方法,但是我無法通過遵循可愛的人們的建議來實現它(例如:我試圖做git rebase -i HEAD~4,但我不明白我在編輯器中得到的輸出 - 它讓路太多了( 9),我不知道該怎麼辦。)

我會把它留給更有經驗的人來決定是否應該刪除這個問題作爲重複。