如何使用Git撤销已推送的提交

如何使用Git撤销已推送的提交

技术背景

在使用Git进行版本控制时,有时会遇到需要撤销已推送提交的情况,例如推送的提交存在错误、包含敏感信息等。了解如何撤销已推送的提交对于维护代码的正确性和安全性至关重要。

实现步骤

单个提交的撤销

使用git revert <commit_hash>命令可以创建一个新的提交,该提交会撤销指定提交的更改。示例如下:

1
git revert <commit_hash>

多个提交的撤销

若要撤销一系列提交,可以使用如下命令:

1
git revert <oldest_commit_hash>..<latest_commit_hash>

部分Git版本也会撤销<oldest_commit_hash>本身,所以要确认该提交是否被撤销。若需要删除最新的撤销提交(即撤销最旧提交的那个),可以使用git reset --hard HEAD~

找到提交的哈希值

可以使用git log命令查看提交的哈希值。

重新应用已撤销的提交

通常撤销提交是因为发现推送的提交有问题。先使用git revert将仓库恢复到稳定状态,推送撤销提交使远程仓库稳定。之后,在本地重新应用已撤销的提交,以便继续修复问题。
重新应用已撤销的提交,需要“撤销”撤销提交。再次执行git revert命令,但这次使用撤销提交的范围。新的撤销提交将撤销之前的撤销提交,使文件恢复到第一次撤销之前的状态,然后修复问题、创建新提交并推送。

强制重置提交

可以使用以下命令撤销已推送的提交:

1
2
3
git reset --hard <commit_hash>
git clean -f -d
git push -f
  • <commit_hash>是你想要保留的最后一个提交的哈希代码。
  • git clean -f -d命令很危险,它会删除不在版本控制下的文件。

通过创建新分支撤销提交

假设分支名为develop

1
2
3
4
5
6
7
8
9
# 基于一个历史提交检出一个新的临时分支
# (获取历史提交哈希的命令:git log --oneline)
git checkout <last_known_good_commit_hash>
# 删除原develop分支
git branch -D develop
# 基于临时分支创建一个新的develop分支
git checkout -b develop
# 用新分支强制更新远程仓库
git push -f origin develop

核心代码

撤销单个提交

1
git revert <commit_hash>

撤销多个提交

1
git revert <oldest_commit_hash>..<latest_commit_hash>

强制重置提交

1
2
3
git reset --hard <commit_hash>
git clean -f -d
git push -f

创建新分支撤销提交

1
2
3
4
git checkout <last_known_good_commit_hash>
git branch -D develop
git checkout -b develop
git push -f origin develop

最佳实践

  • 在撤销提交前,先备份重要数据,以防意外丢失。
  • 使用git log仔细确认要撤销的提交,避免误操作。
  • 若多人协作,使用--force--force-with-lease选项时要谨慎,因为这可能会覆盖他人的提交。

常见问题

撤销提交时包含了不需要撤销的提交

可以使用git reset --hard HEAD~删除最新的撤销提交,再重新执行git revert命令,指定正确的提交范围。

强制推送导致他人提交丢失

若不小心使用--force推送覆盖了他人的提交,可以从远程仓库的备份或其他开发者的本地仓库中恢复提交,然后重新合并。

撤销第一个提交

不能使用git rebase -i撤销第一个提交,因为该命令依赖于前面的提交作为基准。可以考虑使用git filter-branch或其他工具进行操作,但这些操作比较复杂,需谨慎使用。


如何使用Git撤销已推送的提交
https://119291.xyz/posts/how-to-undo-pushed-commits-using-git/
作者
ww
发布于
2025年5月29日
许可协议