在这里插入图片描述

常用 Git 撤销与清理命令速查

需求 命令 使用方法 作用说明
撤销所有未提交修改 git reset --hard 在仓库根目录运行 将工作区和暂存区恢复到最后一次 commit 状态
彻底清理本地修改 git reset --hard && git clean -fd 在仓库根目录运行 删除所有修改并清理未跟踪文件和目录
撤销当前目录工作区修改 git restore . 在仓库目录运行 撤销当前目录下已跟踪文件的工作区修改
取消暂存区修改 git restore --staged . 在仓库目录运行 将已经 git add 的内容移出暂存区
安全撤销远程 commit git revert <commit> 例如 git revert 4988d815 后再 git push origin main 新增一个反向提交来撤销指定 commit,不改写远程历史
删除远程最新 commit git reset --hard <parent_commit> && git push --force-with-lease origin main 先回退到目标父提交,再强制推送远程分支 改写远程历史,适合误推且确认没人基于该 commit 开发的场景
查看远程仓库配置 git remote -v 在仓库目录运行 查看当前仓库配置的远程地址
删除本地 Tag git tag -d <tag> 例如 git tag -d v1.0.0 删除本地仓库中的指定 Tag
删除远程 Tag git push origin --delete <tag> 例如 git push origin --delete v1.0.0 删除远程仓库中的指定 Tag
同步清理远程已删除 Tag git fetch --prune --tags 在仓库目录运行 清理本地已经不存在于远程的 Tag

使用 Git 撤销修改、修复远程仓库配置、撤销远程 commit 与删除 Tag

Git 在日常开发中经常需要执行撤销修改、清理工作区、撤销远程误提交、修复远程仓库配置或删除 Tag 等操作。掌握这些常见命令可以快速恢复仓库到干净状态,并减少误操作带来的影响。

本文总结常见场景以及对应的解决方法。


将仓库恢复到最后一次提交状态

当本地存在大量未提交修改,希望恢复到最新 commit 的状态时,可以使用 git reset --hard

Run:

git reset --hard

Then:

git status

此操作会执行以下行为:

  • 清空工作区中已跟踪文件的修改
  • 清空暂存区修改
  • 恢复到最后一次 commit 的代码状态

需要注意,该操作会直接丢弃所有未提交修改。执行前应确认本地没有需要保留的内容。


彻底清理仓库中的所有本地修改

如果仓库中存在未跟踪文件,例如新建但未 git add 的文件,只执行 git reset --hard 不会删除这些文件。

Run:

git reset --hard

Then:

git clean -fd

命令作用:

  • git reset --hard 恢复所有已跟踪文件
  • git clean -fd 删除未跟踪文件和目录

执行后仓库将恢复到完全干净的状态。

需要注意,git clean -fd 会删除未被 Git 跟踪的文件和目录。如果只是想预览将被删除的内容,可以先执行:

git clean -fdn

确认无误后再执行:

git clean -fd

使用新版 Git 命令撤销修改

新版 Git 推荐使用 git restore 进行文件恢复。

Run:

git restore .

. 表示当前目录下的全部文件。

该命令会撤销当前目录下已跟踪文件的工作区修改,但不会默认取消暂存区内容。

如果需要取消暂存区修改,可以执行:

git restore --staged .

如果需要同时撤销暂存区和工作区修改,可以执行:

git restore --staged .
git restore .

适用于只需要恢复当前目录修改的场景。


撤销远程仓库中本地没有的 commit

有时远程分支已经多出了一个 commit,但本地分支还没有这个 commit。

例如远程 origin/main 上多了一个误提交:

4988d815 fix[ops]: avoid continuing after closed shell or init failure

这种情况有两种处理方式:

  • 使用 git revert 安全撤销
  • 使用 git reset --hard 配合 git push --force-with-lease 删除远程 commit

如果该 commit 已经被别人拉取,或者不确定是否有人基于它继续开发,优先使用 git revert

如果确认该 commit 是误推,并且没人基于它继续开发,可以使用 --force-with-lease 改写远程历史。


使用 git revert 安全撤销远程 commit

git revert 不会删除原来的 commit,而是新建一个反向提交来抵消它的改动。

Run:

git fetch origin

Then:

git switch main

Then:

git pull --ff-only origin main

Then:

git revert 4988d815b1d37030c06278dc17e8a2bf9a8e9ca0

Finally:

git push origin main

执行后,远程仓库会新增一个类似下面的提交:

Revert "fix[ops]: avoid continuing after closed shell or init failure"

这种方式不会改写远程历史,适合多人协作分支、主分支、发布分支等场景。

如果撤销过程中出现冲突,先查看冲突文件:

git status

手动解决冲突后执行:

git add <conflicted-files>

Then:

git revert --continue

如果想放弃本次撤销操作:

git revert --abort

使用 force-with-lease 删除远程最新 commit

如果确认远程最新 commit 是误推,并且需要让远程分支回到上一个 commit,可以使用 git reset --hard 配合 git push --force-with-lease

假设误提交是:

4988d815b1d37030c06278dc17e8a2bf9a8e9ca0

它的父提交是:

b4d510a2fcc2985a612d6e57d3d637e8d3ef7f

可以执行:

git fetch origin

Then:

git switch main

Then:

git reset --hard b4d510a2fcc2985a612d6e57d3d637e8d3ef7f

Finally:

git push --force-with-lease origin main

执行后,远程 main 会被回退到指定父提交,误推的 commit 将不再出现在远程分支历史中。

需要注意,git reset --hard 会重置当前分支、暂存区和工作区。如果本地有未提交修改,应先备份或提交,否则会被丢弃。

--force-with-lease--force 更安全。它会检查远程分支是否仍然是本地预期的状态;如果远程分支已经被别人更新,本次推送会失败,避免覆盖他人的提交。


revert 和 force-with-lease 的区别

方式 是否改写远程历史 是否保留原 commit 适合场景
git revert <commit> 已经推送到远程、多人协作、主分支、发布分支
git reset --hard <parent_commit> + git push --force-with-lease origin main 误推 commit,确认没人基于它继续开发

日常开发中,优先使用 git revert

只有在明确知道需要删除远程历史,并且确认没有影响其他协作者时,才使用:

git push --force-with-lease origin main

检查远程仓库配置

当 Git 报错提示某个路径不是 Git 仓库时,通常是远程仓库配置存在问题。

Run:

git remote -v

该命令会显示当前仓库的远程地址,例如:

origin  https://example.com/project.git (fetch)
origin  https://example.com/project.git (push)

如果远程地址指向一个普通目录而不是 Git 仓库,Git 将无法执行 fetch 或 push 操作。


删除 Git Tag

Tag 常用于标记版本发布。当 Tag 不再需要时,可以删除本地或远程 Tag。

删除本地 Tag

Run:

git tag -d v1.0.0

该命令只会删除本地仓库中的 Tag。


删除远程 Tag

Run:

git push origin --delete v1.0.0

该命令会删除远程仓库中的指定 Tag。

如果远程分支和 Tag 存在同名情况,建议使用更明确的写法:

git push origin :refs/tags/v1.0.0

完整删除流程

删除 Tag 通常需要执行本地删除和远程删除两个步骤。

Run:

git tag -d v1.0.0

Then:

git push origin --delete v1.0.0

同步清理远程已删除的 Tag

如果远程仓库中的 Tag 已被删除,但本地仍然存在,可以执行同步清理。

Run:

git fetch --prune --tags

该命令会同步远程 Tag 状态,并清理本地已经不存在于远程的 Tag。


总结

在 Git 日常使用中,以下操作最为常见:

  • 使用 git reset --hard 恢复仓库到最新提交状态
  • 使用 git clean -fd 清理未跟踪文件
  • 使用 git restore . 撤销当前目录工作区修改
  • 使用 git restore --staged . 取消暂存区修改
  • 使用 git revert <commit> 安全撤销已经推送的 commit
  • 使用 git push --force-with-lease origin main 删除远程误推 commit
  • 使用 git remote -v 检查远程仓库配置
  • 使用 git tag -dgit push origin --delete 删除 Tag

掌握这些命令可以快速解决大部分本地仓库问题,并保持代码仓库处于稳定状态。

对于已经推送到远程仓库的 commit,默认优先选择 git revert。只有确认误推 commit 没有被其他人使用时,才考虑使用 git reset --hardgit push --force-with-lease 改写远程历史。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐