如何完成还原提交,以及如何还原大量提交
Posted
技术标签:
【中文标题】如何完成还原提交,以及如何还原大量提交【英文标题】:how to finish reverting a commit, and how to revert a lot of commits 【发布时间】:2014-01-03 10:41:00 【问题描述】:这一定很简单,但我在git-scm
找不到。
我一直在为一个公共项目做出很多小的承诺,但我的所有工作都很糟糕。我想删除我所做的一切。有些我刚刚在本地提交,有些我已经推送到'origin master'。
第一次提交(一周前)是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)
-
我不知道如何完成此还原。
我不想单独进行每个提交,我想把它们都吹走。
【问题讨论】:
git revert --abort
为我工作。
【参考方案1】:
我在这里假设没有其他人在您的工作之间插入提交,并且您的错误提交在 repo 的历史中形成了一个连续的范围。否则你将不得不变得更复杂。假设您的历史记录如下所示:
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
(包括提交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"
。
【讨论】:
谢谢,这是我需要的信息。还有一个问题:如何获取(master, HEAD)或(origin/master)信息,以便知道何时执行这两组命令? @Pat 最简单的方法是设置git log
的替代形式,以便让这些信息一目了然。您可以阅读here 了解要使用的格式。一个好的起点是这样的:git log --pretty="%h %Cgreen%d%Creset %s %an %Cblue(%cr)"
【参考方案2】:
而不是运行
git revert --continue
快跑
git commit -m "commit message here"
如果这不起作用,请确保您已暂存了还原中涉及的所有文件。甚至是您还原然后放弃更改的文件。
【讨论】:
我发现我仍然停留在还原状态,即使我已经提交了所有内容。我不得不运行git commit -m "empty commit to escape revert" --allow-empty
,但这似乎已经解决了。以上是关于如何完成还原提交,以及如何还原大量提交的主要内容,如果未能解决你的问题,请参考以下文章