回滚远程Git存储库


111

我有一个远程Git存储库,我需要将最后的n提交回滚到冷遗忘中。

Answers:


135

您可以使用git revert <commit>…所有n次提交,然后像往常一样进行推送,以保持历史记录不变。

或者,您可以使用来“回滚” git reset --hard HEAD~n。如果您要推送公共或共享存储库,则可能会基于原始分支来分散和破坏其他工作。Git会阻止您这样做,但是您可以git push -f用来强制进行更新。


5
您可以使用以下命令回滚到特定的提交:git reset --hard [sha1]其中sha1是提交哈希标识符。
pisaruk

7
由于没有工作目录,因此无法在远程存储库中使用get reset --hard。原始问题仅说明存在远程回购,没有提及本地回购。
Hazok

2
只是注意,git push -f将强制将所有本地分支推送到其远程
站点

请记住,使用revert将导致您的功能分支被视为“已”合并。这是因为这些部门都是实际被合并。但是更改已还原。解决方案:选择还原还原提交
Benedikt

@Benedikt是否reset --hard还会导致要素分支被视为已合并?我的假设是不会(在哪里revert)。
马库斯·利昂

37

elmarco是正确的……他的建议最适合共享/公共存储库(或至少公共分支机构)。如果未共享(或者您愿意破坏其他人),则还可以推送特定的参考:

git push origin old_master:master

或者,如果存在特定的提交SHA1(缩写为1e4f99e),则您想返回到:

git push origin 1e4f99e:master

9

幸运的是,我可以使用Pat Notz的解决方案完全消除了不需要的提交。但是,最初我得到了错误

error: failed to push some refs to 'ssh://git@gitrepo.git'
To prevent you from losing history, non-fast-forward updates were rejected*

但是添加force(-f)选项会覆盖此错误

git push -f origin 52e36b294e:master

3

如果您可以直接访问远程仓库,则可以始终使用:

git reset --soft <sha1>

这是可行的,因为没有尝试修改不存在的工作目录。有关更多详细信息,请参见原始答案:

如何取消git裸存储库中的最后提交?


2
为什么--soft甚至有必要?如果git reset没有模式标志,您可能只用plain就可以做同样的事情。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.