回滚远程Git仓库

115

我有一个远程Git仓库,需要将最后的n个提交回滚。


"into cold oblivion",哈哈,有时候一些提交就应该被遗忘在那里。 - dbDev
4个回答

137
你可以使用git revert <commit>…来撤销所有的n个提交,然后像平常一样推送,保持历史记录不变。
或者你可以使用git reset --hard HEAD~n来"回滚"。如果你正在向公共或共享仓库推送,可能会偏离并破坏他人基于你原来分支的工作。Git会阻止你这样做,但你可以使用git push -f来强制更新。

5
你可以通过使用命令git reset --hard [sha1]来恢复到特定的提交版本,其中sha1是该提交的哈希标识符。 - Pikachu
7
由于远程仓库没有工作目录,因此您不能在远程仓库中使用“get reset --hard”命令。原始问题仅说明存在一个远程仓库,没有提到本地仓库。 - Hazok
3
仅供参考,git push -f 命令会强制推送所有本地分支到它们的远程仓库。 - cowlinator
@MarcusLeon reset --hard 是完全没问题的。但是在远程分支上应用此命令可能会对团队成员的本地分支造成麻烦。确保你与团队保持一致并通知每个人,以便他们可以更新他们的本地分支。 - Benedikt
如果你使用 git push -f 的话,可能会意外覆盖已经在你上一次 pull 之后被推送的提交。相反,如果你使用 git push --force-with-lease,就可以避免这种情况的发生。 - Niemi
显示剩余3条评论

37

elmarco是正确的...他的建议对于共享/公开仓库(或者至少对于公开分支)来说是最好的。如果不需要共享(或者你愿意打断其他人),你也可以推送特定的引用:

git push origin old_master:master

或者,如果有一个特定的提交SHA1(例如缩写形式中的1e4f99e)需要回滚到:

git push origin 1e4f99e:master

11

幸运的是,我有机会使用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*

但是添加力量(-f)选项将覆盖此错误。

git push -f origin 52e36b294e:master

3
如果你直接访问远程仓库,你可以始终使用以下命令:
git reset --soft <sha1>

这样做是因为没有尝试修改不存在的工作目录。有关详细信息,请参阅原始答案:如何在Git裸仓库中取消上次提交?

2
为什么甚至需要使用 --soft?你可能可以只使用普通的 git reset 命令来完成相同的操作,而无需使用模式标志。 - user456814

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接