2011-01-10 101 views
139

我已閱讀了關於此主題的類似帖子,並且無法爲我的生活弄清楚如何正確執行此操作。1回滾本地和遠程git存儲庫提交

我檢查了大約1000個我不想要的文件,我寧願不必經過1by1並將它們全部從回購中刪除。

  • 我有一個遙控器master分支。
  • 我有本地master分支。

它們都在同一修訂版。

我想通過1提交回滾我的遠程。

說我在master上的歷史記錄是A--B--C--D--E
我想回滾我的本地到D
然後把它推到遠程,所以我現在的散列將是D和遠程和本地。

我遇到問題。
我正在使用Git Tower,但對命令行感到很舒服。任何幫助?

更新: 下面的評論很好。使用重置似乎部分不鼓勵,特別是如果存儲庫與其他用戶共享。 在不使用硬重置的情況下撤消上次提交更改的最佳方式?有沒有辦法?

+1

+1顯示另一個好的git UI – Nerian 2011-01-10 13:47:35

+0

我已經更新了我的答案「使用硬重置「。 – VonC 2011-01-10 18:40:24

+3

使用`git revert`進行復位並且不會干擾用戶。 – user562374 2011-01-10 20:58:06

回答

224

如果沒有人拉着你的遠程回購的是,你可以改變你的分公司負責人,並迫使它推到所述遠程回購:

git reset --hard HEAD^ 
git push -f 

(或者,如果你有遠程回購直接訪問,您可以改變其HEAD reference even though it is a bare repo

注意,在the comments belowalien-technology評論,在Windows(CMD會話),則需要^^

git reset --hard HEAD^^ 
git push -f 

如果有人已經拉回購?那我會怎麼做?

那麼我會建議一些不重寫歷史:

  • git revert本地上次提交(創建一個新的承諾是什麼反轉之前的承諾所做的那樣)
  • 推通過git revert生成'恢復'。
+1

如果有人已經推出了回購計劃,該怎麼辦?那我會怎麼做? – 2011-01-10 17:46:03

44

設置本地分支一個版本回(HEAD^意味着一個修訂後):

git reset --hard HEAD^ 

變更推到原點:

git push --force 

您將有力推否則混帳會認識到你通過一次提交就落後於origin,並且沒有任何變化。

這樣做與--force告訴git覆蓋HEAD遠程回購沒有尊重任何進展。

14

如果你想恢復最後一次提交聽:

第1步:

檢查您的本地提交與信息

$ git log 

第2步:

最後刪除承諾,而從本地分支(或主)

$ git reset HEAD^ 

,或者如果你不想最後一次提交的文件和更新重置變化監聽

$ git reset HEAD^ --hard 

第3步:

我們可以更新文件和代碼,並再次需要用力推它將刪除以前的提交。它會保持新的提交。

$ git push origin branch -f 

就是這樣!

2

對於Windows機器,使用:

git reset HEAD~1 #Remove Commit Locally 
0

我解決了像你這樣的問題,通過這個命令:

git reset --hard HEAD^ 
git push -f <remote> <local branch>:<remote branch> 
0

我只是想最後刪除遠程提交和清除提交歷史也。 以下工作就像一個魅力

git reset --hard HEAD^ 
git push -f 
0

重置頭,並且做了回覆到以前提交的方式是通過

$ git reset HEAD^ --hard 
$ git push <branchname> -f 

但有時它可能無法在遠程分支被接受:

To ssh:<git repo> 
! [rejected]  develop -> develop (non-fast-forward) 
error: failed to push some refs to 'ssh:<git repo>' 
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Integrate the remote changes (e.g. 
hint: 'git pull ...') before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

那麼其他的方式做是

git revert HEAD 
git push <remote branch> 

這工作正常。

注意:請記住git push -f <force>失敗,然後嘗試恢復。之前先做一個git pull,以便遠程和本地同步,然後嘗試git revert
檢查與git log,以確保遠程和本地都在同一點相同的SHA1犯..

0

當地主

git reflog 
-- this will list all last commit 
    e.g [email protected]{0} -- wrong push 
     [email protected]{1} -- correct push 
git checkout [email protected]{1} . 
    -- this will reset your last modified files 

git status 
git commit -m "reverted to last best" 
git push origin/master 

沒有必要擔心,如果其他已退出或不。

完成!

5

通過輸入波紋管的命令,你可以看到你的git的承諾歷史 -

$ git的日誌

比方說,你在那個特定的分支歷史就像是 - commit_A,commit_B,commit_C,commit_D。其中commit_D是最後一次提交,這是HEAD依然存在的地方。現在,刪除你上次從本地和遠程提交,你需要做到以下幾點:

步驟1:刪除最後通過本地提交 -

$ 的git的復位 - 硬HEAD〜

這將你的提交HEAD改變commit_C

第2步:把你的新HEAD變化承諾遠程

$ 混帳推起源+ HEAD

該命令將刪除最後一次從遠程提交。

P.S.這個命令在Mac OSX上測試過,並且應該可以在其他操作系統上工作(不要求其他操作系統)