2011-06-23 114 views

回答

305
git reset --hard HEAD~1 
git push -f <remote> <branch> 

(實施例推:git push -f origin bugfix/bug123

這將撤消上次提交併推送更新曆程到遠程。您需要通過-f,因爲您要替換遠程中的上游歷史記錄。

+0

謝謝。我得到'$ git reset head〜1 fatal:模棱兩可的論點'head〜1':未知修訂或路徑不在工作樹中。' – michael

+16

或者,使用'git reset --hard <你想要返回到'''。 –

+2

該引用被稱爲HEAD(區分大小寫) – dunni

4

你可以做一個互動變基:

git rebase -i <commit> 

這將彈出默認編輯器。只需刪除包含要刪除的提交的行即可刪除該提交。

當然,您將需要訪問遠程存儲庫以在其中應用此更改。

看到這個問題:Git: removing selected commits from repository

137

一般來說,做一個 「反」 承諾,使用:

git revert 364705c 

然後將其發送到遠程如常:

git push 

此次榮獲」 t刪除提交:它會做出額外的提交,撤銷第一次提交所做的任何操作。其他任何東西都不是很安全,特別是當這些變化已經傳播出去的時候。

+7

這比AlexanderGroß's(選擇的答案)更安全(因此可能更好)。 – Graeck

+3

@Graeck每個解決方案都有其含義和優點。 –

+4

這應該是公認的答案,最好不要覆蓋歷史,如果與團隊合作更好。只有在您還沒有將更改推送到服務器時纔會接受'git reset'。 –

6

git reset HEAD~1如果您不想讓您的更改消失(未更改的更改)。更改,提交併推送再次git push -f [origin] [branch]

+0

這對我有效。 +1 – CodeChops

2

或者:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master 

強制原點遠程倉庫到最後父的主分支提交所有的

25

首先,放鬆。

「沒有什麼是我們的控制之下。我們的控制是純粹的幻想。」 「是人都會犯錯」

我得到你無意中推你的代碼remote-master。這將是沒問題的。

1.首先,獲取您嘗試返回的提交的SHA-1值,例如,致力於掌握分支。像每個提交的一起串

git log 

你會看到一羣「f650a9e398ad9ca606b25513bd​​4af9fe ...」:運行此。從您提交的想要返回複製該號碼。

2.現在,下面的命令輸入:

git reset --hard your_that_copied_string_but_without_quote_mark 

你應該看到的消息,如 「現在HEAD是」。你清楚了。它剛纔所做的就是在本地反映這種變化。

現在,下面的命令輸入:

git push -f 

你應該可以看到

「警告:push.default沒有設置,其隱含的價值已經改變 .. ......共0(delta 0),重用0(delta 0)... ... your_branch_name - > master(強制更新)。「

現在,你們都清楚了。再次使用「git log」檢查master,您的fixed_destination_commit應該位於列表的頂部。

歡迎您(提前))

UPDATE:

現在,你之前的所有這些所取得的變化開始的,現在都沒有了。 如果你想再次把這些難題帶回來,這是可能的。感謝git refloggit cherry-pick命令。

爲此,我建議請按照this blogthis post

+2

喜歡引號:) – jamix

+0

當做「git push -f」時,指定遠程和分支也是很好的措施,但是「git push -f」在大多數情況下都可以工作 – Robson

+1

很好的解釋和感謝git noobs(me)的「git log」片段。完美無瑕地工作。 –

4

嘗試使用

git reset --hard <commit id> 

請注意:這裏提交的ID將您想去的提交ID,但不是你想重新設置該ID。這是我唯一被困住的地方。

然後按

git push -f <remote> <branch> 
+0

謝謝,它拯救了我的一天。 –

+0

最好的答案,有時候這就是你不得不做的一旦git被不懂的人搞砸了 –

+0

感謝您的讚賞。在我的情況下,我的團隊搞砸了這些東西,然後我不得不找到解決辦法。 –