第三章 Git版本回退、文件修改与撤销
一、回顾提交历史(进阶查看)
除了 git log,还可以用更简洁的格式查看提交历史:
bash
git log --oneline
- 输出示例:
a1b2c3d (HEAD -> main) 首次提交:添加README.md文件a1b2c3d是提交的哈希值(版本唯一标识)。HEAD -> main表示当前分支是main,且指向该提交。
- 实际执行界面参考:
二、文件修改与提交流程
1. 修改工作区文件
以 README.md 为例,在文件中添加新内容:
markdown
这是我的第一个Git项目
添加了新的说明内容,用于演示修改流程
2. 查看修改状态
执行 git status,会提示 README.md 处于 **"已修改(Changes not staged for commit)"** 状态。
实际执行界面参考:

3. 查看具体修改内容
用 git diff 查看工作区与暂存区的差异:
bash
git diff README.md
- 输出会显示文件的具体修改(新增行用
+标记)。 - 实际执行界面参考
4. 暂存并提交修改
bash
git add README.md # 暂存修改
git commit -m "更新README.md,添加新说明内容" # 提交到版本库
实际执行界面参考:

查看历史记录 :git log --oneline
实际执行界面参考: 
5. 在重复修改并提交
为后面命令执行效果,再重复修改一次并提交,会多一条修改历史


三、版本回退(回到旧版本)
1. 基于 git reset 的 "硬回退"(慎用,会丢失后续提交)
若要回退到某个历史版本,可使用 git reset --hard <提交哈希值>。示例 :假设提交历史是 f0c1fab(旧版本)→ 596cc1a(新版本),现在要回退到 f0c1fab:
bash
git reset --hard f0c1fab
- 作用:工作区、暂存区、版本库全部回退 到目标版本,后续基于
e4f5g6h的提交会被 "覆盖"(本地未推送的话会丢失,需谨慎)。 - 实际执行界面参考:
2. 基于 git revert 的 "安全回退"(推荐,保留提交历史)
若要撤销某个旧提交的修改(但保留提交记录),用 git revert <提交哈希值>。示例 :假设提交历史是 19a6183(旧版本)→ f0c1fab(新版本),撤销 f0c1fab 这个提交的修改:
bash
git revert f0c1fab
- 执行后会自动打开文本编辑器,让你填写 "撤销提交" 的说明,保存后会生成一个新的撤销提交,历史记录更清晰。

执行git revert期间,打开的编辑器界面:

当前REDME.MD的内容为:

四、撤销操作(后悔药)
1. 撤销工作区的修改(文件回到 "最后一次暂存 / 提交" 的状态)
若工作区修改不满意,可撤销:
bash
git checkout -- README.md
- 注意:此操作会丢弃工作区未暂存的修改,请确保修改无需保留后再执行。
实际执行界面参考:

2. 撤销暂存区的修改(文件从暂存区回到工作区)
若已 git add 但还未 git commit,想撤销暂存:
bash
git reset HEAD README.md
- 执行后,文件状态回到 "已修改但未暂存",可重新修改或放弃。
实际执行界面参考:

附录
Git 常用版本回退、文件修改与撤销命令汇总列表如下
📋 版本回退命令
1. 查看提交历史
| 命令 | 说明 |
|---|---|
git log |
查看详细提交历史 |
git log --oneline |
查看简洁版提交历史 |
git log -n 5 |
查看最近5次提交 |
git log --graph |
图形化显示分支合并历史 |
git reflog |
查看所有操作记录(包括已删除的提交) |
2. 版本回退
| 命令 | 说明 | 风险等级 |
|---|---|---|
git reset --soft HEAD~1 |
回退到上一个版本,保留工作区和暂存区 | 低 |
git reset --mixed HEAD~1 |
回退到上一个版本,保留工作区,重置暂存区 | 中 |
git reset --hard HEAD~1 |
彻底回退到上一个版本,丢弃所有修改 | 高 |
git reset --hard <commit_id> |
回退到指定提交版本 | 高 |
git revert <commit_id> |
创建新的提交来撤销指定提交 | 低 |
3. 相对版本号
| 命令 | 说明 |
|---|---|
HEAD |
当前版本 |
HEAD~1 或 HEAD^ |
上一个版本 |
HEAD~2 |
上两个版本 |
HEAD~3 |
上三个版本 |
📝 文件修改与撤销命令
1. 工作区文件操作
| 命令 | 说明 |
|---|---|
git restore <file> |
撤销工作区的修改(Git 2.23+) |
git checkout -- <file> |
撤销工作区的修改(旧版本) |
git clean -f |
删除未跟踪的文件 |
git clean -fd |
删除未跟踪的文件和目录 |
git clean -n |
预览将要删除的文件(dry-run) |
2. 暂存区操作
| 命令 | 说明 |
|---|---|
git restore --staged <file> |
将文件从暂存区移回工作区(Git 2.23+) |
git reset HEAD <file> |
将文件从暂存区移回工作区(旧版本) |
git reset . |
将所有文件从暂存区移回工作区 |
3. 文件删除与恢复
| 命令 | 说明 |
|---|---|
git rm <file> |
删除文件并添加到暂存区 |
git rm --cached <file> |
从版本控制中删除文件,但保留在本地 |
git restore <file> |
恢复被误删的文件 |
git checkout HEAD -- <file> |
从最新提交恢复指定文件 |
🔄 撤销提交操作
1. 撤销最近提交
| 命令 | 说明 | 使用场景 |
|---|---|---|
git commit --amend |
修改最近一次提交信息 | 提交信息写错 |
git commit --amend --no-edit |
添加文件到最近提交,不修改信息 | 漏文件了 |
git reset --soft HEAD~1 |
撤销提交但保留更改在暂存区 | 重新组织提交 |
2. 撤销特定提交
| 命令 | 说明 | 区别 |
|---|---|---|
git revert <commit_id> |
创建新提交来撤销指定提交 | 安全,保留历史 |
git reset --hard <commit_id> |
直接回退到指定提交 | 危险,重写历史 |
⚠️ 重要注意事项
-
--hard重置会丢失所有未提交的修改 -
已推送到远程的提交不要使用
reset --hard -
revert比reset更安全,适合团队协作 -
操作前先用
git status确认当前状态 -
重要修改前先备份或创建新分支


