如何在git中回滚到特定的提交?

有人能给我的最好答案是使用git恢复X次,直到我达到所需的提交。

假设我想要恢复到20次提交前的提交,我需要运行20次。

有更简单的方法吗?

我不能使用重置,因为这个存储库是公共的。


当前回答

第一步:获取提交列表:

git log

你会得到如下所示的列表:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

步骤2:复制所需的提交散列并粘贴以供检查:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

这是所有。

其他回答

试试这个:

git checkout [revision] .

其中[revision]是提交散列(例如:123456789012345678901234567890123456789012345678ab)。

别忘了。最后,非常重要。这将对整个树应用更改。你应该在git项目的根目录下执行这个命令。如果您在任何子目录中,则此命令只更改当前目录中的文件。然后承诺,你应该是好的。

你可以通过

git reset --hard 

这将从工作目录和暂存区域删除所有修改。

假设你在做一个项目,过了一天左右。您注意到有一个特性仍然出错。但是你不知道你做了什么改变导致了错误。所以你必须找出以前的工作提交。恢复到特定的提交:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

好的,这个commit对你有用。不会再有错误了。你指出了问题所在。现在你可以回到最近的提交:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

在导致错误之前签出一个特定的文件(在我的例子中,我使用Gemfile.lock):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

这是一种处理在提交中创建的错误的方法,直到以后才会意识到这些错误。

在git中回滚一个特定的提交:

要返回一个旧的git提交:(the ac2ec…是提交名称)

git checkout ac2ece0219689ed86b08c93dfebb0d02c0f1d5b1

命名一个你想要HEAD分离指向的新分支:

git branch get_back_to_past

结帐到分支

git checkout get_back_to_past

现在该分支有了过去的提交项。例如,如果您愿意,您可以将其合并到主数据库。

有关git头部和回滚到旧版本的更多信息:点击这里

我不确定发生了什么变化,但如果没有分离选项,我无法签出特定的提交。对我有效的完整命令是: Git签出-detach[提交散列]

要从分离状态返回,我必须签出我的本地分支:git checkout master

最初的海报写道:

有人能给我的最好答案是使用git恢复X次,直到I 达到所需的提交。 假设我想要恢复到20次提交前的提交 运行20次。 有更简单的方法吗? 我不能使用重置,因为这个回购是公共的。

没有必要使用git revert X次。Git恢复可以接受 提交range作为参数,因此只需要使用它一次就可以还原一个范围 的提交。例如,如果你想恢复最近20次提交:

git revert --no-edit HEAD~20..

提交范围HEAD~20..是HEAD~20的简称。HEAD,意思是“从HEAD提交的第20个父节点开始,并将它之后的所有提交还原到HEAD”。

这将恢复最后20次提交,假设这些都不是合并 提交。如果存在合并提交,那么您不能在一个命令中全部恢复它们,您需要分别使用

git revert -m 1 <merge-commit>

还请注意,我已经使用git 1.9.0版本的git恢复测试了一个范围。如果你使用的是较旧版本的git,使用带git revert的range可能会工作,也可能不会工作。

在这种情况下,git revert优先于git checkout。

注意,不像这个回答说使用git checkout, git revert 会移除任何提交中添加的文件 还原,这使得这是还原一系列修订的正确方法。

文档

git-revert(1)手册页。 提交范围。