背景
在使用 Git 时遇到这样一个问题:把 dev 分支的内容 merge 到了 master 分支,并且把 master 分支 push 到了远程分支。但随后发现 merge 的内容有问题,需要把 master 分支回滚到之前的状态。
实现
问题复现
创建一个包含多个分支的项目,把 dev 分支的提交 merge 到 master 分支后 push 到远程分支。
现在的 master 分支包含了 dev 的提交。那么我们现在该如何回滚这次提交,把 master 分支的内容重置为初始状态呢?
问题解决
切换分支
首先查看下分支,确保当前在 master 分支(如果不在 master 分支,可以使用 git checkout master
切换到 master 分支)。
查看提交记录
使用如下命令查看提交记录,获取我们希望回滚到的那次提交的哈希值。
# 使用此命令查看提交记录。
# 按回车键逐页获取提交记录,按 q 键退出。
git log
选择要回滚到的状态的哈希值
例如我们要把 master 回滚到这里,那么我们选择对应的哈希值:
回滚本地master分支
使用如下命令回滚 master 本地分支:
git reset --hard <commit-hash>
# 本例中使用如下命令
# git reset --hard b519402a7ad6209169ab9c9304fa365b2919d26f
push到远程分支
把回滚后的本地分支 push 到远程分支:
git push -f origin master
踩坑记录
如果在 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'
这是因为在把 master 分支 push 到远程分支时,由于使用 -f
(强制推送)参数,当在 push 时,如果分支是受保护的分支(master 分支通常会是受保护的分支),那么仓库是不允许我们使用 -f
参数的。
此时,我们需要进行一些特殊设置。这里我们以 GitHub 为例。
- 在仓库设置中找到分支保护规则;
- 添加可进行强制推送的账号后,保存设置。
设置后再次进行强制推送就可以了。
总结
记录下 Git 中回滚提交的操作。但需要注意的是,以上操作虽然可以把分支回滚到指定的状态,但如果中间夹杂了别人的提交,也会把别人的提交回滚掉。因此这个操作需要慎重。