回滚到公共回购中的旧Git提交

回滚到公共回购中的旧Git提交,git,git-checkout,git-revert,Git,Git Checkout,Git Revert,如何回滚到git中的特定提交 有人能给我的最好答案是使用git revertX次,直到达到所需的提交 假设我想恢复到一个20次提交的提交,我必须运行它20次 有没有更简单的方法 我无法使用重置,因为此存储库是公共的。我想问题是,“回滚”是什么意思?如果您无法重置,因为它是公共的,并且您希望保持提交历史记录的完整性,您的意思是只希望您的工作副本反映特定的提交?使用git checkout和提交散列 编辑:正如评论中指出的,使用git checkout而不指定分支将使您处于“无分支”状态。使用git

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

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

假设我想恢复到一个20次提交的提交,我必须运行它20次

有没有更简单的方法


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

我想问题是,“回滚”是什么意思?如果您无法
重置
,因为它是公共的,并且您希望保持提交历史记录的完整性,您的意思是只希望您的工作副本反映特定的提交?使用
git checkout
和提交散列

编辑:正如评论中指出的,使用
git checkout
而不指定分支将使您处于“无分支”状态。使用
git checkout-b
签入分支,或使用
git checkout.
签入当前分支。

尝试以下操作:

git checkout [revision] .
其中,
[revision]
是提交散列(例如:
1234567890012345678901234567890123456789012345678ab

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

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

git reset --hard 

这将删除工作目录和临时区域中的所有修改。

要回滚到特定提交:

git reset --hard commit_sha
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .
要回滚10次提交,请执行以下操作:

git reset --hard HEAD~10
如果您不想重写历史记录,可以像下面的帖子一样使用“git revert”


原始海报上写道:

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

假设我想恢复到一个20次提交的提交,我会 运行20次

有没有更简单的方法

我无法使用重置,因为此回购是公开的

无需使用
git revert
X次
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还原-m 1
请注意,我已经使用git 1.9.0版测试了git revert的范围。如果您使用的是较旧版本的git,则使用git revert的范围可能有效,也可能无效

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

请注意,与之不同,
git revert
将实际删除在您正在执行的任何提交中添加的任何文件 还原
,这是还原一系列修订的正确方法

文档
我会的。这是“git checkout”,但没有更新HEAD

您可以通过以下方式实现相同的效果:

git checkout $commit_to_revert_to
git reset --soft @{1}
如果您喜欢将方便命令串接在一起


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

步骤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
...

仅此而已。

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


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

假设您在一个项目上工作,大约一天后。您注意到一个特性仍然会给您带来错误。但您不知道是什么更改导致了错误。因此,您必须捕获以前的工作提交。要恢复到特定提交,请执行以下操作:

git reset --hard commit_sha
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .
好的,那么commit对您有效。没有更多的错误。你指出了问题所在。现在,您可以返回到最新提交:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .
并在导致错误之前签出特定文件(在我的示例中,我使用Gemfile.lock):


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

下面是一个这样做的示例

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .
想要头部分离模式吗? 如果您希望使用分离的头将X时间回滚到某个提交(意味着您不能搞乱任何事情),那么请务必使用以下方法:

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

即返回一次提交:

git checkout HEAD~1

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

git checkout 5889575 .

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

git revert不起作用?如我在问题中所述,如果我想恢复到20年前的某个时间点,这对我真的没有帮助。这个问题在这里得到了很好的回答,不清楚“回滚”是什么意思。这是否意味着您要临时将工作副本切换到特定版本?或者您确实想将存储库的历史记录永久还原回某个版本?您应该接受一个答案,并可能投票支持您喜欢的任何其他答案。这难道不会让您陷入奇怪的“当前不在任何分支机构”中吗
git checkout HEAD~1
git checkout 5889575 .