Git 撤回已推送到远程的最近push
下面以撤销最近的两次push为例
方法一:使用 git revert
安全撤销(推荐,不改变历史)
git revert
会创建新的“撤销提交”,抵消指定提交的修改,不会删除原有历史,适合多人协作的公共分支。
步骤:
查看提交历史,获取要撤销的两次提交的哈希值 执行
git log --oneline
查看最近提交,例如:a1b2c3d (HEAD -> main, origin/main) 最近的第1次提交(要撤销) d4e5f6g 最近的第2次提交(要撤销) 7h8i9j0 更早的提交(保留到此)
记下前两个提交的哈希值:
a1b2c3d
和d4e5f6g
。依次撤销这两次提交(从新到旧)
先撤销最近的第1次提交:
git revert a1b2c3d
会自动打开编辑器,输入撤销说明(操作:按
i
进入编辑模式,编写内容后按Esc
退出,再输入:wq
保存退出)。再撤销第2次提交:
git revert d4e5f6g
同样编辑并保存撤销说明。
推送撤销结果到远程
git push origin main # 替换为你的分支名
此时远程仓库会新增两个“撤销提交”,原有两次提交的修改被抵消,历史记录完整保留。
方法二:使用 git reset
重置历史(谨慎使用,改写历史)
git reset
会直接删除指定提交,改写本地和远程历史,仅适合私人分支或确认无人基于该历史开发的情况。
步骤:
重置本地分支到两次提交之前的状态 假设两次提交之前的基准提交哈希是
7h8i9j0
(见步骤1的示例):git reset --hard 7h8i9j0 # --hard 会丢弃工作区修改,确保已备份
强制推送重置后的分支到远程 由于改写了历史,需要强制推送(使用
--force-with-lease
比--force
更安全,避免覆盖他人提交):git push origin main --force-with-lease # 替换为你的分支名
注意事项:
公共分支优先用
revert
:reset
会删除远程历史,可能导致团队成员代码冲突,需提前沟通。备份重要修改:执行操作前,建议用
git branch backup-branch
创建分支备份。如果他人已拉取代码:
若用
revert
:他人正常pull
即可同步。若用
reset
:他人需执行git fetch origin
+git reset --hard origin/main
强制同步(会丢失本地基于旧历史的修改)。
根据团队规范选择合适方式,优先保证协作安全。