常用 Git 撤销与清理命令速查
本文总结了Git中常用的撤销修改、清理工作区、修复远程配置及删除Tag等操作命令。主要内容包括:使用git reset --hard恢复仓库到最后提交状态;git clean -fd彻底清理未跟踪文件;新版git restore .撤销当前目录修改;git remote -v检查远程配置;以及删除本地和远程Tag的完整流程(git tag -d和git push origin --delete)。
文章目录
常用 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 -d和git push origin --delete删除 Tag
掌握这些命令可以快速解决大部分本地仓库问题,并保持代码仓库处于稳定状态。
对于已经推送到远程仓库的 commit,默认优先选择 git revert。只有确认误推 commit 没有被其他人使用时,才考虑使用 git reset --hard 和 git push --force-with-lease 改写远程历史。
更多推荐
所有评论(0)