git reset 命令
简介
git reset 是 Git 中用于回退到指定提交的命令。它可以重置 HEAD 指针、暂存区和工作区。
基本概念
Reset 的三种模式
- –soft:只重置 HEAD,保留暂存区和工作区
- –mixed(默认):重置 HEAD 和暂存区,保留工作区
- –hard:重置 HEAD、暂存区和工作区(危险!)
Reset vs Revert
| 特性 |
Reset |
Revert |
| 历史 |
重写历史 |
创建新提交 |
| 安全性 |
可能丢失更改 |
安全,不丢失 |
| 使用场景 |
本地未推送的提交 |
已推送的提交 |
| 协作 |
不适合共享分支 |
适合共享分支 |
命令语法
1 2 3 4 5
| git reset [模式] [提交]
git reset [提交] -- <文件>
|
查看帮助文档
常用选项
| 选项 |
说明 |
--soft |
只重置 HEAD,保留暂存区和工作区 |
--mixed |
重置 HEAD 和暂存区,保留工作区(默认) |
--hard |
重置 HEAD、暂存区和工作区 |
--merge |
重置并保留未暂存的更改 |
--keep |
重置但保留工作区的更改 |
-q, --quiet |
静默模式 |
--pathspec-from-file=<file> |
从文件读取路径规范 |
基本使用
1. Soft Reset(保留更改)
1 2 3 4 5
| $ git reset --soft HEAD~1
$ git reset --soft abc1234
|
使用场景:想修改最后一次提交,保留所有更改。
2. Mixed Reset(默认,保留工作区)
1 2 3 4 5 6 7 8
| $ git reset HEAD~1
$ git reset --mixed HEAD~1
$ git reset abc1234
|
使用场景:想取消暂存,但保留工作区的更改。
3. Hard Reset(危险!)
1 2 3 4 5
| $ git reset --hard HEAD~1
$ git reset --hard abc1234
|
警告:--hard 会永久丢失未提交的更改!
4. 重置文件
1 2 3 4 5
| $ git reset HEAD file.txt
$ git reset HEAD~1 -- file.txt
|
5. 重置到远程分支
1 2 3
| $ git fetch origin $ git reset --hard origin/main
|
实际应用场景
场景1:撤销最后一次提交(保留更改)
1 2 3 4 5
| $ git reset --soft HEAD~1
$ git commit -m "Updated commit message"
|
场景2:取消暂存
1 2 3 4 5
| $ git reset HEAD file.txt
$ git restore --staged file.txt
|
场景3:回退到之前的提交
1 2 3 4 5
| $ git reset HEAD~1
$ git status
|
场景4:完全重置(危险)
1 2 3
| $ git fetch origin $ git reset --hard origin/main
|
场景5:重置特定文件
1 2 3 4 5
| $ git reset HEAD~1 -- file.txt
$ git reset abc1234 -- file.txt
|
常见问题和解决方案
问题1:误用了 –hard
解决方案:
1 2 3 4 5
| $ git reflog
$ git reset --hard abc1234
|
问题2:想保留工作区的更改
解决方案:
1 2 3
| $ git reset --soft HEAD~1 $ git reset HEAD~1
|
问题3:重置后想恢复
解决方案:
1 2 3 4 5
| $ git reflog
$ git reset --hard HEAD@{1}
|
最佳实践
1. 谨慎使用 –hard
1 2 3 4 5 6
| $ git reset --hard HEAD~1
$ git status $ git reset --soft HEAD~1
|
2. 重置前备份
1 2 3 4 5
| $ git branch backup-branch
$ git reset HEAD~1
|
3. 使用 reflog 作为安全网
1 2 3 4 5
| $ git reflog
$ git reset --hard HEAD@{n}
|
4. 只对本地提交使用
1 2 3 4 5
| $ git reset HEAD~1
$ git revert HEAD
|
总结
git reset 是回退提交的强大命令:
- –soft:只重置 HEAD,保留更改
- –mixed:重置 HEAD 和暂存区,保留工作区
- –hard:完全重置(危险!)
- 文件重置:可以重置特定文件
关键要点:
- ✅ 谨慎使用
--hard,会丢失更改
- ✅ 使用
--soft 或默认模式保留更改
- ✅ 使用 reflog 恢复误操作
- ✅ 只对本地未推送的提交使用 reset
- ❌ 不要对已推送的提交使用 reset(使用 revert)