Git:使用“git reset”命令回滚错误的提交

郎家岭伯爵 2023年11月25日 173次浏览

背景

在使用 Git 时遇到这样一个问题:把 dev 分支的内容 merge 到了 master 分支,并且把 master 分支 push 到了远程分支。但随后发现 merge 的内容有问题,需要把 master 分支回滚到之前的状态。

实现

问题复现

创建一个包含多个分支的项目,把 dev 分支的提交 merge 到 master 分支后 push 到远程分支。

现在的 master 分支包含了 dev 的提交。那么我们现在该如何回滚这次提交,把 master 分支的内容重置为初始状态呢?

问题解决

切换分支

首先查看下分支,确保当前在 master 分支(如果不在 master 分支,可以使用 git checkout master 切换到 master 分支)。

checkout到master分支

查看提交记录

使用如下命令查看提交记录,获取我们希望回滚到的那次提交的哈希值。

# 使用此命令查看提交记录。
# 按回车键逐页获取提交记录,按 q 键退出。
git log

查看提交记录,获取要回滚到的哈希值

选择要回滚到的状态的哈希值

例如我们要把 master 回滚到这里,那么我们选择对应的哈希值:

选择要回滚到的状态

注意哈希值别选错

回滚本地master分支

使用如下命令回滚 master 本地分支:

git reset --hard <commit-hash>

# 本例中使用如下命令
# git reset --hard b519402a7ad6209169ab9c9304fa365b2919d26f

回滚本地分支,并查看本地分支提交历史

push到远程分支

把回滚后的本地分支 push 到远程分支:

git push -f origin master

push到远程分支

踩坑记录

如果在 push 分支时遇到如下报错:

remote: error: GH006: Protected branch update failed for refs/heads/master.
remote: error: Cannot force-push to this branch
To https://github.com/LANGJIALINGBOJUE/hello-world.git
 ! [remote rejected] master -> master (protected branch hook declined)
错误:无法推送一些引用到 'https://github.com/LANGJIALINGBOJUE/hello-world.git'

push报错

这是因为在把 master 分支 push 到远程分支时,由于使用 -f(强制推送)参数,当在 push 时,如果分支是受保护的分支(master 分支通常会是受保护的分支),那么仓库是不允许我们使用 -f 参数的。

此时,我们需要进行一些特殊设置。这里我们以 GitHub 为例。

  1. 在仓库设置中找到分支保护规则;
  2. 添加可进行强制推送的账号后,保存设置。

设置后再次进行强制推送就可以了。

总结

记录下 Git 中回滚提交的操作。但需要注意的是,以上操作虽然可以把分支回滚到指定的状态,但如果中间夹杂了别人的提交,也会把别人的提交回滚掉。因此这个操作需要慎重。

捐赠页面示例