> 技术文档 > 【Git】第四节:文件修改与撤销操作(git restore、git reset)_git restore git reset

【Git】第四节:文件修改与撤销操作(git restore、git reset)_git restore git reset


💻第4节:文件修改与撤销操作(git restore、git reset)


💡引言:灵活控制代码状态,避免误操作的利器

在日常开发中,我们常常会遇到这样的场景:

  • 不小心添加了一个不该提交的文件到暂存区
  • 写了一段代码后发现思路错误,想回到之前的状态
  • 提交了错误的内容,想要“撤回”这个提交

Git 提供了多个强大的命令来帮助我们撤销更改、恢复文件、重置提交。本节课老曹将系统讲解 git restoregit reset 等常用撤销操作,并结合实际案例演示如何安全地处理这些情况。

此外,老曹还将整理 10 个 Git 高频面试题,助你掌握常见考点,提升技术面试通过率!


👽一、撤销暂存操作:git restore --staged

1. 命令说明

git restore --staged <file>

该命令用于将已添加到暂存区的文件从暂存区中移除,但保留工作区中的修改内容。

2. 使用场景

当你执行了 git add 但尚未提交,突然意识到某些文件不应该加入本次提交时,可以使用此命令撤销暂存。

3. 示例:

git add .git status# 发现 index.html 不应该加入本次提交git restore --staged index.html

✅ 相当于老版本 Git 的 git reset HEAD


🤖二、恢复工作区修改:git restore

1. 命令说明

git restore <file>

该命令用于将工作区中的修改还原为最近一次提交的状态(即丢弃本地改动)。

2. 使用场景

  • 放弃某个文件的修改,回到上次提交的状态
  • 快速清理无效代码或测试内容

3. 示例:

git restore style.css

此时 style.css 中的所有未提交改动都会被删除,恢复到最后一次提交的内容。

⚠️ 警告:此操作不可逆,请确认不再需要这些改动后再执行。


🚢三、重置提交:git reset

1. 命令说明

git reset [选项] [提交]

该命令用于将当前分支指针移动到指定提交,并根据选项决定是否保留暂存区和工作区内容。

2. 常用模式详解

模式 命令 行为描述 soft git reset --soft HEAD~1 仅移动 HEAD 指针,保留暂存区和工作区内容 mixed(默认) git reset --mixed HEAD~1git reset HEAD~1 移动 HEAD,清空暂存区,保留工作区内容 hard git reset --hard HEAD~1 移动 HEAD,清空暂存区和工作区,恢复到最后一次提交

3. 使用示例

✅场景 1:撤销最后一次提交,保留所有改动
git reset --soft HEAD~1
✅场景 2:撤销提交并清除暂存区,但保留工作区内容
git reset --mixed HEAD~1
✅场景 3:完全回退到上一个提交,丢弃所有改动
git reset --hard HEAD~1

⚠️ 警告:--hard 模式会丢失所有未提交的改动,慎用!


🌠四、撤销整个提交:git revert

1. 命令说明

git revert <commit-hash>

该命令用于创建一个新的提交,其内容是将指定提交的更改进行反向操作。不会改变历史记录,适用于多人协作环境。

2. 使用场景

  • 已经推送到远程仓库的提交需要撤销
  • 不希望修改历史提交(如 GitHub PR、GitLab MR)

3. 示例:

git revert abcdef1234567890abcdef1234567890abcd

Git 会生成一个新的提交,内容是原提交的“反操作”。


🌋五、查看可恢复的提交:git reflog

1. 命令说明

git reflog

该命令记录了你在本地执行的所有 Git 操作,包括 resetcheckoutcommit 等,即使已经“删除”的提交也可以通过它找回。

2. 使用场景

  • 不小心执行了 git reset --hard,想恢复被删除的提交
  • 想找回某次操作前的提交记录

3. 示例:

git reflog# 找到你想恢复的提交哈希值git reset --hard abcdef1234567890abcdef1234567890abcd

🌊六、综合实战演练:从修改到撤销全流程

✅步骤 1:修改已有文件并添加到暂存区

echo \"This is a mistake\" >> README.mdgit add README.md

✅步骤 2:发现错误,撤销暂存

git restore --staged README.md

✅步骤 3:放弃修改,恢复原始内容

git restore README.md

✅步骤 4:再次修改并提交

echo \"Correct content\" >> README.mdgit add README.mdgit commit -m \"feat(readme): update content\"

✅步骤 5:发现提交错误,撤销提交

git revert HEAD

此时会创建一个新提交,内容是撤销上一次提交所做的更改。


⛄七、最佳实践与注意事项

✅ 最佳实践

  • 在执行任何撤销操作前,先使用 git statusgit diff 审核当前状态
  • 多人协作项目中优先使用 git revert 而非 git reset --hard
  • 使用 git reflog 可以挽救“误删”的提交
  • 编写清晰的提交信息有助于后续回溯

⚠️ 注意事项

  • git reset --hard 会永久丢失未提交的改动,慎用!
  • 推送后的历史提交不要轻易重写(rebase/reset),以免影响他人工作

🎄八、Git 高频面试题 Top 10(附答案)

Q1: Git 中有哪些撤销操作?它们的区别是什么?

A:

  • git restore:用于恢复工作区或暂存区的文件
  • git reset:用于移动 HEAD 指针并选择性保留/清除暂存区和工作区内容
  • git revert:创建反向提交,不修改历史记录

Q2: 如何撤销一次提交而不删除历史?

A: 使用 git revert 创建一个反向提交,保留原有提交记录。

Q3: git reset 的 soft、mixed、hard 有什么区别?

A:

  • --soft:只移动 HEAD,保留暂存区和工作区
  • --mixed(默认):移动 HEAD 并清空暂存区,保留工作区
  • --hard:移动 HEAD,清空暂存区和工作区,恢复到最后一次提交

Q4: 如何撤销对某个文件的修改?

A: 使用 git restore 恢复为最近提交的内容。

Q5: 如何撤销已经添加到暂存区的文件?

A: 使用 git restore --staged 或旧版 git reset HEAD

Q6: 什么是 reflog?它的作用是什么?

A: git reflog 是本地操作日志,记录所有 Git 操作,可用于恢复“误删”的提交。

Q7: 如果我已经 push 到远程仓库,还能不能撤销提交?

A: 可以使用 git revert 创建反向提交,或者强制推送(git push -f),但后者可能影响他人工作。

Q8: 如何查看 Git 的操作历史?

A: 使用 git reflog 查看本地所有 Git 操作记录。

Q9: git checkout 和 git restore 的区别?

A: git checkout 主要用于切换分支和恢复文件;git restore 更专注于恢复文件状态,功能更明确。

Q10: 如何一次性撤销多个提交?

A: 使用 git reset --hard abcdef1234567890abcdef1234567890abcd 回退到指定提交。


📚九、总结

本节课我们深入讲解了 Git 中常见的撤销与恢复操作,包括:

✅ 使用 git restore 撤销暂存和恢复工作区内容
✅ 使用 git reset 控制提交历史和暂存区状态
✅ 使用 git revert 安全撤销远程提交
✅ 使用 git reflog 查找回滚操作前的提交

这些命令是 Git 日常使用和团队协作中不可或缺的工具,熟练掌握它们可以帮助你快速修复错误、避免数据丢失,并提高开发效率。


附录:推荐资源

  • 📘 Git 官方文档:https://git-scm.com/book/zh/v2
  • 🧰 Git 常用命令速查表:https://education.github.com/git-cheat-sheet-education.pdf
  • 📊 Git 图形化工具推荐:VSCode、Sourcetree、GitKraken、Meld

🎯 下一步建议:尝试故意制造多种修改场景,练习撤销不同阶段的操作。下一讲我们将进入《第5节:分支管理基础》,学习如何创建、切换、合并分支等内容。敬请期待!

F1赛车迷社区