Remove a git commit which has not been pushed

Remove a git commit which has not been pushed

技术背景

在使用 Git 进行版本控制时,有时我们会不小心提交了错误的内容,或者提交了不必要的提交。如果这些提交还没有推送到远程仓库,我们可以使用一些 Git 命令来撤销这些提交,以保持仓库的整洁和正确性。

实现步骤

未推送到远程仓库的情况

当你还没有将更改推送到远程仓库时,可以使用 git reset 命令。以下是不同的操作方式:

  1. 撤销提交并保持所有文件暂存
    1
    git reset --soft HEAD~
    这里的 HEAD~ 表示上一个提交,--soft 选项会撤销提交,但保留更改在暂存区。
  2. 撤销提交并取消所有文件暂存
    1
    git reset HEAD~
    此命令会撤销提交,并将文件从暂存区移除,但保留工作目录中的更改。
  3. 撤销提交并完全移除所有更改
    1
    git reset --hard HEAD~
    --hard 选项会撤销提交,同时丢弃工作目录中的所有更改。需要注意的是,使用 git reset --hard 时要谨慎,因为可能会丢失未提交的更改。

已推送到远程仓库的情况

如果已经将更改推送到远程仓库,可以使用 git revert 命令:

1
git revert HEAD

这个命令会创建一个新的提交,用于撤销最新的提交。

其他操作

  1. 使用特定的提交 ID 进行回退
    1
    git reset --hard {commit-id}
    例如,要回退到 db0c078d5286b837532ff5e276dcf91885df2296 这个提交:
    1
    git reset --hard db0c078d5286b837532ff5e276dcf91885df2296
  2. 删除本地分支并从服务器检出
    如果本地分支比远程分支超前多个提交,并且需要撤销所有这些提交,可以删除本地分支并从服务器重新检出:
    1
    2
    git branch -D <branch-name>
    git checkout <branch-name>
  3. 交互式变基
    1
    git rebase -i HEAD~N
    N 是 Git 会显示的提交数量,该命令会提示你打开文本编辑器,你可以通过删除与提交关联的行来移除想要的提交。

删除提交中的文件或文件夹

  • 删除文件夹
    1
    git rm -r --cache <folder name>
  • 删除文件
    1
    git rm --cache <file name>

最佳实践

  • 在进行 git reset --hard 操作之前,务必使用 git status 检查工作目录是否干净,或者确认是否要丢弃未提交的更改。
  • 使用 git log 命令查看提交历史,以便准确选择要回退的提交。
  • 如果不确定操作会带来什么影响,可以先在本地测试分支上进行操作。

常见问题

  • 丢失未提交的更改:使用 git reset --hard 可能会丢失未提交的更改。因此,在执行该命令之前,最好先保存或提交这些更改。
  • 与远程仓库不一致:如果已经将提交推送到远程仓库,使用 git reset 可能会导致本地和远程仓库不一致。在这种情况下,建议使用 git revert 命令。

Remove a git commit which has not been pushed
https://119291.xyz/posts/remove-a-git-commit-which-has-not-been-pushed/
作者
ww
发布于
2025年6月3日
许可协议