git reset 命令及参数样解
git reset 命令用于回退版本,可以指定退回某一次提交的版本。git reset 有三个主要模式,每种模式对 HEAD、暂存区和工作目录的影响不同。
git reset --soft
- 作用:将当前分支的 HEAD 重置为指定的
,但不会更改暂存区和工作目录中的文件。 - 影响:
HEAD: 更新到指定的。 - 暂存区: 保持不变。
- 工作目录: 保持不变。
- 使用场景:如果你只是想重写最近的提交记录(例如,将多次提交合并为一次提交),但不改变文件的内容。
使用示例
你有几个连续的提交,但希望将它们合并为一个提交,以保持提交历史的简洁。例如,假设你的提交历史如下:
prismjs
A - B - C - D (HEAD)
你希望将提交 B、C 和 D 合并为一个新的提交。
步骤
查看当前提交历史:
prismjs
git log --oneline
这会显示简化的提交历史,如:
prismjs
dddddd D
cccccc C
bbbbbb B
aaaaaa A
重置 HEAD 到 B 提交:
prismjs
git reset --soft HEAD~3
这会将 HEAD 重置到 B 提交之前的状态,同时保留 B、C 和 D 的修改在暂存区。结果是提交历史变为:
prismjs
A (HEAD)
而所有更改都在暂存区中。
创建一个新的提交:
prismjs
git commit -m "Combine B, C, and D into one commit"
这会将暂存区的所有更改作为一个新的提交添加到提交历史中。
验证新的提交历史:
prismjs
git log --oneline
现在你会看到:
prismjs
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、暂存区和工作目录都变更
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!