git reset 命令用于回退版本,可以指定退回某一次提交的版本。git reset 有三个主要模式,每种模式对 HEAD、暂存区和工作目录的影响不同。
git reset --soft
- 作用:将当前分支的 HEAD 重置为指定的
,但不会更改暂存区和工作目录中的文件。 - 影响:
HEAD: 更新到指定的。 - 暂存区: 保持不变。
- 工作目录: 保持不变。
- 使用场景:如果你只是想重写最近的提交记录(例如,将多次提交合并为一次提交),但不改变文件的内容。
使用示例
你有几个连续的提交,但希望将它们合并为一个提交,以保持提交历史的简洁。例如,假设你的提交历史如下:
A - B - C - D (HEAD)
你希望将提交 B、C 和 D 合并为一个新的提交。
步骤
查看当前提交历史:
git log --oneline
这会显示简化的提交历史,如:
dddddd D
cccccc C
bbbbbb B
aaaaaa A
重置 HEAD 到 B 提交:
git reset --soft HEAD~3
这会将 HEAD 重置到 B 提交之前的状态,同时保留 B、C 和 D 的修改在暂存区。结果是提交历史变为:
A (HEAD)
而所有更改都在暂存区中。
创建一个新的提交:
git commit -m "Combine B, C, and D into one commit"
这会将暂存区的所有更改作为一个新的提交添加到提交历史中。
验证新的提交历史:
git log --oneline
现在你会看到:
eeeeee Combine B, C, and D into one commit
aaaaaa A
git reset --mixed (默认模式)
- 作用:将当前分支的 HEAD 重置为指定的
,同时更新暂存区使其与 HEAD 匹配,但不会更改工作目录中的文件。 - 使用场景:如果你想撤销最近的提交并取消暂存这些更改,使它们再次变为未暂存状态。
- 影响:
- HEAD: 更新到指定的
。 - 暂存区: 与 HEAD 同步,所有变更取消暂存。
- 工作目录: 保持不变。
- HEAD: 更新到指定的
git reset --hard
- 作用:将当前分支的 HEAD 重置为指定的
,同时更新暂存区和工作目录使其与 HEAD 匹配。这会丢失未提交的更改。 - 使用场景:如果你想完全撤销所有未提交的更改并重置仓库到某个特定的提交状态。
- 影响:
- HEAD: 更新到指定的
。 - 暂存区: 与 HEAD 同步。
- 工作目录: 与 HEAD 同步,所有未提交的更改丢失。
- HEAD: 更新到指定的
总结
上面提到每种模式对 HEAD、暂存区和工作目录的影响不同。
- soft模式,只变更HEAD,暂存区和工作目录不作处理
- mixed模式,只变更HEAD和暂存区,工作目录不作处理
- hard模式,HEAD、暂存区和工作目录都变更