2013-12-16 71 views
7

這必須很簡單,但我無法在git-scm中找到它。如何完成還原提交以及如何還原大量提交

我一直在爲一個公共項目做很多小提交,而且我的所有工作都很糟糕。我想刪除我所做的一切。有些我剛剛在當地承諾,有些我已經推到'原創大師'。

第一個承諾(一週前)是bdbad86 ...與最近的是e82401b ...

我只想讓這一切消失。我試圖恢復一個。

git status 
# On branch master 
# You are currently reverting commit e82401b. 
# (all conflicts fixed: run "git revert --continue") 
# (use "git revert --abort" to cancel the revert operation) 
  1. 我想不出如何完成這個需要恢復的。
  2. 我不想分別做每一個提交,我想把它們都吹走。

回答

4

我假設這裏沒有插話其他人之間犯你的工作,以及你的不良承諾在回購的歷史中形成一個連續的範圍。否則,你將不得不變得更加複雜。我們假設您的歷史記錄如下所示:

e82401b - (master, HEAD) My most recent private commit 
... 
bc2da37 - My first private commit 
cf3a183 - (origin/master) My most recent bad public commit 
... 
292acf1 - My first bad public commit 
82edb2a - The last good public commit 

我們想要做的第一件事就是吹掉您尚未公開的提交。你可以用下面的命令做到這一點(注意,您的更改將會消失,應視爲不可恢復的):

git reset --hard cf3a183 

相同(更易讀):

git reset--hard origin/master 

現在你的觀點該存儲庫與origin/master中的視圖一致。您現在想要恢復您的不良公開更改並將其作爲恢復提交發布。這些說明用於創建單個恢復提交。

您可以使用git revert --no-commit a..b恢復開始在所有提交的提交a(注意!),並在結束,幷包括提交b。將會爲您提交回復。所以,在這裏,我們會做:

git revert --no-commit 82edb2a..HEAD 

,或等效:

git revert --no-commit 292acf1^..HEAD 

記住,HEAD現在指向同一個地方origin/master

運行revert命令後,您現在已經完成了更改並準備好提交,因此只需運行一個簡單的git commit -m "Reverting those bad changes I accidentally pushed and made public"即可。

+0

謝謝,這是我需要的那種信息。還有一個問題:我如何獲得(主,頭)或(起源/主)信息,以便我可以知道何時執行這兩組命令? –

+1

@Pat最簡單的方法是建立一個'git log'的替代形式來一目瞭然地獲取這些信息。您可以閱讀[這裏](https://www.kernel.org/pub/software/scm/git/docs/git-log.html)關於使用的格式。一個好的起點是這樣的:'git log --pretty =「%h%Cgreen%d%Creset%s%an%Cblue(%cr)」' –

0

您可以在任何以前的提交中設置您的回購,並且之後的所有更改都將被刪除。

的git的復位 - 硬

之後將其推到GitHub上使用git推起源--force

訪問How do you roll back (reset) a Git repository to a particular commit?

+2

對於未來發生這個問題的Google員工:永遠不要在推出原產地之後做這件事。 (http://git-scm.com/docs/git-rebase/#_recovering_from_upstream_rebase)它可以使其他人的生活變得非常具有挑戰性。 – zmccord