884

我怎样才能回滚到git中的特定提交?

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

因此,假设我想恢复到 20 次提交的旧提交,我必须运行 20 次。

有没有更简单的方法来做到这一点?

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

4

11 回答 11

1309

试试这个:

git checkout [revision] .

提交哈希在哪里[revision](例如:)12345678901234567890123456789012345678ab

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

您可以通过以下方式撤消此操作

git reset --hard 

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

于 2010-01-05T17:07:42.767 回答
222

要回滚到特定提交:

git reset --hard commit_sha

回滚 10 个提交:

git reset --hard HEAD~10

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

如何将 Git 存储库恢复到以前的提交?

于 2013-02-14T11:01:10.230 回答
96

好吧,我想问题是,“回滚”是什么意思?如果你不能reset因为它是公开的并且你想保持提交历史完整,你的意思是你只是想让你的工作副本反映一个特定的提交?使用git checkout和提交哈希。

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

于 2010-01-05T17:04:21.447 回答
44

原始海报说:

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

因此,假设我想恢复到 20 次提交的旧提交,我必须运行 20 次。

有没有更简单的方法来做到这一点?

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

没有必要使用git revertX 次。git revert可以接受一个提交范围作为参数,因此您只需使用一次即可恢复一系列提交。例如,如果您想恢复最近的 20 次提交:

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

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

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

git revert -m 1 <merge-commit>

另请注意,我已经git revert使用 git 版本 1.9.0 使用范围进行了测试。如果您使用的是旧版本的 git,则使用范围git revert可能会或可能不会起作用。

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

请注意,与此答案git checkout不同的是,它git revert 实际上会删除在您正在恢复的任何提交中添加的任何文件,这使得这是恢复一系列修订的正确方法。

文档

于 2014-04-21T20:12:20.363 回答
34

第 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

就这样。

于 2016-07-12T15:27:20.770 回答
12

想要 HEAD 分离模式?

如果您希望使用 DETACHED HEAD 将 X 时间回滚到某个提交(这意味着您不能搞砸任何事情),那么请务必使用以下命令:

(将 X 替换为您希望返回的提交次数)

git checkout HEAD~X

IE 返回一个提交:

git checkout HEAD~1
于 2019-03-14T10:29:15.070 回答
11
git read-tree -um @ $commit_to_revert_to

会做的。它是“git checkout”,但没有更新 HEAD。

你可以达到同样的效果

git checkout $commit_to_revert_to
git reset --soft @{1}

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

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

于 2016-02-06T20:14:32.593 回答
3

假设您在一个项目上工作一天左右。您注意到一项功能仍然给您带来错误。但是您不知道您所做的更改导致了错误。所以你必须钓鱼以前的工作提交。要恢复到特定的提交:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

好的,这样提交对你有用。没有更多的错误。你指出了这个问题。现在你可以回到最新的提交:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

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

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

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

于 2018-09-21T21:03:52.430 回答
3

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

git checkout 5889575 .

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

于 2019-03-29T13:11:28.893 回答
1

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

为了从分离状态中恢复过来,我必须检查我的本地分支:git checkout master

于 2017-02-22T11:45:50.063 回答
1

这是一个例子

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .
于 2019-03-06T14:27:50.703 回答