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

我怎么能回滚到git的具体提交?

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

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

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

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

尝试这个:

 git checkout [revision] . 

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

别忘了. 最后,非常重要。 这将适用于整个树的变化。 然后承诺,你应该是好的。

你可以通过撤销这个

 git reset --hard; 

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

要回滚到特定的提交:

 git reset --hard commit_sha 

要回滚10个提交:

 git reset --hard HEAD~10 

如果您不想重写历史logging,可以使用下面的post中的“git revert”

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

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

编辑:正如在注释中指出的,使用git checkout而不指定分支将使您处于“no分支”状态。 使用git checkout <commit> -b <branchname>签出分支,或者使用git checkout <commit> . 结帐到当前分支。

原始的海报说:

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

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

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

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

没有必要使用git revert X次。 git revert可以接受一个提交范围作为参数,所以你只需要使用它来恢复一个提交范围。 例如,如果您想恢复最近的20次提交,请执行以下操作:

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

提交范围HEAD~20..HEAD HEAD~20..HEAD~20..HEAD ,意思是“从HEAD提交的 20 父节点开始,并在所有提交到HEAD之后恢复所有提交”。

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

 git revert -m 1 <merge-commit> 

还要注意,我已经使用git版本1.9.0testing了使用git revert的范围。 如果你使用的是旧版本的git,使用git revert范围可能会也可能不会。

git revertgit checkout更好

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

文档

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

第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 

就这样。

 git read-tree -um @ $commit_to_revert_to 

会做的。 这是“混帐签出”,但没有更新头。

你可以用同样的效果

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

如果你喜欢一起串起方便的命令。

这些给你的工作树和索引在所需的状态,你可以只是git commit完成。

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

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