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

Dav*_*vid 758 git git-revert git-checkout

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

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

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

有更简单的方法吗?

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

Ale*_*ner 1139

试试这个:

git checkout [revision] .
Run Code Online (Sandbox Code Playgroud)

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

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

你可以撤消这个

git reset --hard 
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:如果从那时起您已将新文件添加到项目中,则不会删除它们.因此,当您进行构建(取决于您的平台)时,您可能仍然会遇到错误.删除新文件,你很高兴. (9认同)
  • @AlexReisner那个句点终点指向你当前所在的目录,这不一定是整个git项目,对吗?如果你想将更改应用到整个项目,你是否可以像'git add:/'一样使用':/',如果你当前不在git项目根目录中? (6认同)
  • @MSpreij您应该在git项目根目录中执行此命令.如果您位于任何子目录中,则此命令仅更改当前目录中的文件. (6认同)
  • 该死的,我忘记了"." 我对我的存储库造成了什么损害? (4认同)
  • 当您可以在另一个目录中克隆项目并使用git checkout [revision]时,它非常棒.返回到特定修订版,然后将其与其他目录中的同一项目进行比较.节省了大量时间. (3认同)
  • 为什么在`git reset --hard;`结束时分号? (2认同)
  • git checkout [revision]对我不起作用,什么也没发生。 (2认同)

Nag*_*ran 191

要回滚到特定提交:

git reset --hard commit_sha
Run Code Online (Sandbox Code Playgroud)

要回滚10次提交:

git reset --hard HEAD~10
Run Code Online (Sandbox Code Playgroud)

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

如何将Git存储库还原为以前的提交?

  • 这个答案是错的,因为OP明确指出"我不能使用重置因为这个回购是公开的" (47认同)
  • 如果repo是公共的,我认为没有办法在不使用强制推送(git push -f)的情况下回滚公共存储库上的提交,因为它会影响在回滚之前引入更改的人.因此,重置也可以在公共仓库的本地沙箱中使用. (4认同)
  • 这很好,这避免了一个分离的HEAD!正是我在寻找的东西. (4认同)
  • 这种方法与"git checkout [revision]"之间的唯一区别.是后者保留修改. (3认同)
  • @Yarin 答案是好的,OP 的前提是他不能在公共回购中使用重置。他可以。对不起,死灵评论;) (3认同)
  • 在我的情况下,这有效,然后在测试回归等后使用“git pull”快进回到头部。 (2认同)

Ben*_*Ben 87

好吧,我想问题是,'回滚'是什么意思?如果您不能,reset因为它是公开的并且您希望保持提交历史记录完整,那么您是否只是希望您的工作副本反映特定的提交?使用git checkout和提交哈希.

编辑:正如评论中指出的那样,使用git checkout而不指定分支将使您处于"无分支"状态.使用git checkout <commit> -b <branchname>签入一个分支,或git checkout <commit> .签进当前的分支.

  • 如果你在一个工作目录中并且你仍然在master中,你需要`git reset`来删除那些你不想做的文件.尝试将它放入一个单独的分支:`git checkout <commit> -b <branchname>`,你不会在那个分支*中有停滞的文件*. (3认同)
  • 这不是让您进入奇怪的“当前不在任何分支上”状态吗?您如何提交更改以完成回滚? (2认同)
  • 我试过了,但是我不认为这是正确的方法,因为它会留下停滞的文件。这不会删除不在最后一次提交中的文件。 (2认同)
  • 使用`checkout`的问题在于它不会删除先前提交中添加的文件. (2认同)

小智 40

原始海报说明:

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

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

有更简单的方法吗?

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

没有必要使用git revertX次.git revert可以接受提交范围作为参数,因此您只需要使用一次来还原一系列提交.例如,如果要还原最近20次提交:

git revert --no-edit HEAD~20..
Run Code Online (Sandbox Code Playgroud)

提交范围HEAD~20..是简短的HEAD~20..HEAD,并且意味着"从HEAD提交的 20 父级开始,并将其后的所有提交还原为HEAD".

这将恢复最后20次提交,假设这些都不是合并提交.如果存在合并提交,则无法在一个命令中将它们全部还原,您需要单独还原它们

git revert -m 1 <merge-commit>
Run Code Online (Sandbox Code Playgroud)

另请注意,我已经git revert使用git版本1.9.0 测试了一个范围.如果您使用的是较旧版本的git,则使用范围git revert可能有效,也可能无效.

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

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

文档


Igo*_*gor 27

第1步:获取提交列表:

git log
Run Code Online (Sandbox Code Playgroud)

您将获得此示例中的列表:

[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
...
Run Code Online (Sandbox Code Playgroud)

第2步:复制所需的提交哈希并将其粘贴以用于结帐:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f
Run Code Online (Sandbox Code Playgroud)

就这样.


Kar*_*son 11

想要 HEAD 分离模式?

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

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

git checkout HEAD~X
Run Code Online (Sandbox Code Playgroud)

IE 返回一次提交:

git checkout HEAD~1
Run Code Online (Sandbox Code Playgroud)


jth*_*ill 10

git read-tree -um @ $commit_to_revert_to
Run Code Online (Sandbox Code Playgroud)

会做的.它是"git checkout"但没有更新HEAD.

你可以达到同样的效果

git checkout $commit_to_revert_to
git reset --soft @{1}
Run Code Online (Sandbox Code Playgroud)

如果你喜欢将便捷命令串在一起.

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