2013-12-16 49 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