我有一个远程Git仓库,需要将最后的n
个提交回滚。
git revert <commit>…
来撤销所有的n个提交,然后像平常一样推送,保持历史记录不变。git reset --hard HEAD~n
来"回滚"。如果你正在向公共或共享仓库推送,可能会偏离并破坏他人基于你原来分支的工作。Git会阻止你这样做,但你可以使用git push -f
来强制更新。git reset --hard [sha1]
来恢复到特定的提交版本,其中sha1是该提交的哈希标识符。 - Pikachureset --hard
是完全没问题的。但是在远程分支上应用此命令可能会对团队成员的本地分支造成麻烦。确保你与团队保持一致并通知每个人,以便他们可以更新他们的本地分支。 - Benediktgit push -f
的话,可能会意外覆盖已经在你上一次 pull
之后被推送的提交。相反,如果你使用 git push --force-with-lease
,就可以避免这种情况的发生。 - Niemielmarco是正确的...他的建议对于共享/公开仓库(或者至少对于公开分支)来说是最好的。如果不需要共享(或者你愿意打断其他人),你也可以推送特定的引用:
git push origin old_master:master
或者,如果有一个特定的提交SHA1(例如缩写形式中的1e4f99e)需要回滚到:
git push origin 1e4f99e:master
幸运的是,我有机会使用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
git reset --soft <sha1>
--soft
?你可能可以只使用普通的 git reset
命令来完成相同的操作,而无需使用模式标志。 - user456814