回滚到公共仓库中的旧Git提交

时间:2010-01-05 17:01:15

标签: git git-checkout git-revert

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

有人可以给我的最佳答案是使用git revert X次,直到达到所需的提交。

所以,假设我想恢复到20次提交的提交,我必须运行20次。

有更简单的方法吗?

我无法使用重置,因为此存储库是公共的。

11 个答案:

答案 0 :(得分:1066)

试试这个:

git checkout [revision] .

其中[revision]是提交哈希值(例如:12345678901234567890123456789012345678ab)。

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

您可以通过

撤消此操作
git reset --hard 

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

答案 1 :(得分:179)

要回滚到特定提交:

git reset --hard commit_sha

回滚10次提交:

git reset --hard HEAD~10

如果您不想重写历史记录,可以使用以下帖子中的“git revert”

How to revert Git repository to a previous commit?

答案 2 :(得分:84)

嗯,我猜问题是,'回滚'是什么意思?如果你不能reset,因为它是公开的并且你想保持提交历史不变,你的意思是你只是希望你的工作副本反映特定的提交吗?使用git checkout和提交哈希。

编辑:正如评论中指出的那样,使用git checkout而不指定分支将使您处于“无分支”状态。使用git checkout <commit> -b <branchname>结帐到分行,或git checkout <commit> .结帐到当前分行。

答案 3 :(得分:37)

原始海报说明:

  

有人可以给我的最佳答案是使用git revert X次,直到我   达到预期的提交。

     

所以,假设我想恢复到20个提交的提交,我已经拥有了   运行20次。

     

有更简单的方法吗?

     

我不能使用重置因为这个回购是公开的。

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

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

提交范围HEAD~20..HEAD~20..HEAD的缩写,意思是“从HEAD提交的20 th 父级开始,并将其后的所有提交还原为HEAD ”。

这将恢复最后20次提交, 假设这些都没有合并 提交。 如果有合并提交,那么你无法在一个命令中将它们全部还原,你需要单独还原它们

git revert -m 1 <merge-commit>

另请注意,我已使用git版本1.9.0使用git revert范围进行了测试。如果您使用的是旧版本的git,请使用{{{{} 1}}可能有效也可能无效。

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

请注意,与this answer that says to use git checkout不同,git checkout 实际上将删除您在任何提交中添加的任何文件 还原,这使得这是恢复一系列修订的正确方法。

文档

答案 4 :(得分:24)

第1步:获取提交列表:

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

就是这样。

答案 5 :(得分:10)

git read-tree -um @ $commit_to_revert_to

会做到的。它&#34; git checkout&#34;但没有更新HEAD。

你可以用

达到同样的效果
git checkout $commit_to_revert_to
git reset --soft @{1}

如果您喜欢将便捷命令串在一起。

这些会使您的工作树和索引处于所需状态,您只需git commit即可完成。

答案 6 :(得分:1)

我不确定发生了什么变化,但如果没有--detach选项,我无法检出特定的提交。对我有用的完整命令是: git checkout --detach [commit hash]

要从分离状态回来,我必须检查我的本地分支:git checkout master

答案 7 :(得分:0)

比方说,您在一个项目上工作大约一天后。您会注意到一项功能仍在给您错误。但是您不知道所做的更改导致了错误。因此,您必须钓鱼以前的工作提交。要还原为特定的提交,请执行以下操作:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

好的,这样提交就可以为您工作。没有更多的错误。您指出了问题所在。现在您可以返回到最新提交:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

并在导致错误之前检出特定文件(在我的情况下,我使用示例Gemfile.lock):

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

这是处理在提交中创建的错误而不等到以后才意识到的一种方法。

答案 8 :(得分:0)

这里是一个例子

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .

答案 9 :(得分:0)

想要HEAD分离模式吗?

如果您希望将X时间回退到带有DETACHED HEAD的某个提交(这意味着您不能弄乱任何东西),那么请务必使用以下命令:

(用您希望返回的提交数替换X)

git checkout HEAD~X

I.E。返回一次提交:

git checkout HEAD~1

答案 10 :(得分:0)

您可以在GitHub / BitBucket / Gitlab的commits部分中找到与每个提交相关的提交ID。 非常简单,假设您的提交ID为 5889575 ,那么如果您想返回代码的这一部分,则只需键入

git checkout 5889575 .

这会将您带到代码中的那个时间点。