重置
git reset 是 Git 中一个强大的命令,主要用于 撤销更改 和 移动 HEAD 指针。
一、核心功能
- 移动 HEAD 指针 : 改变当前分支所指向的提交,。这允许“撤销”提交,将分支指针移回之前的某个提交
- 更新暂存区 : 根据制定的选项,决定是否将暂存区的内容同步回 HEAD 指向的提交状态
- (可选)更新工作目录 : 根据制定的选项,决定是否将工作目录的内容同步回 HEAD 指向的提交状态(这是很危险的)
二、 get reset 的模式
git reset 需要指定一个 模式 ,这个模式决定了操作会影响哪些区域( HEAD , Index , Working Directory )。
| 模式 | --soft | --mixed (默认模式) | --hard |
|---|---|---|---|
| 移动 HEAD | ✅ | ✅ | ✅ |
| 更新暂存区 | ❌ | ✅ | ✅ |
| 更新工作目录 | ❌ | ❌ | ✅ |
1. --soft
相当于“撤销”了自目标提交以来的所有 git commit 和 git add 操作。所有在目标提交之后所做的提交变成了“未暂存的更改”。
最常见的用途是合并多个提交或修改最近提交的信息(通常结合 git commit -- amend )
2. --mixed 默认模式
撤销了自目标以来的所有 git add 操作(取消暂存),但保留了工作目录的更改。
这是最常用的模式,用于撤销 git add 或清理暂存区。
3. --hard
彻底丢弃自目标提交以来的所有本地更改(包括未提交的提交和未暂存的修改),将工作目录、暂存区和 HEAD 都回退到指定的提交。
三、其他有用的 git reset 选项/用法
1. git reset -- <file> ...
这个语法只重置 暂存区 中指定的文件,使其匹配 HEAD 提交中的对应文件。
它 不会 移动 HEAD 指针,也 不会 影响工作目录。
效果等于 git restore --staged <file> ,用于取消特定文件的暂存。
2. git reset --merge/git reset --merge ORIG_HEAD
在合并冲突中终止合并。它会尝试恢复到开始合并前的状态(ORIG_HEAD),并停止合并过程。比直接 reset --hard 安全。
3. git reset --keep
移动 HEAD 到目标提交,但尝试保留工作目录中那些尚未提交的、与重置不冲突的更改。
如果工作目录中会有与目标提交冲突的修改,重置会失败。比 --hard 更安全,比 --mixed 更智能地保留工作目录修改。