git reset --hard <version>
作用:切换节点(通过切换节点 达到撤销commit的目的)
一共3种方式 hard soft mixed
准备demo
git log
文件创建完毕 并且提交了2次改动 分别增加一行内容
文件内容
1.hard
会清空 工作区 暂存区的修改 并将不会保留当前节点和原节点之间的差异
演示:
此时 同时在工作区 暂存区 添加修改内容
每次修改 各增加了一行 就不上图了
没有commit 所以git log 同之前的内容
接着 reset --hard到git log的 第一次修改 也就是版本号ff92caae00a346229272985118e501c27284276e
结果:第二次修改的commit 内容 都没了 就不上图了
恢复demo为接下来的测试做准备
2.soft
演示:
同hard
此时 同时在工作区 暂存区 添加修改内容
每次修改 各增加了一行 就不上图了
没有commit 所以git log 同之前的内容
接着 reset --hard到git log的 第一次修改 也就是版本号ff92caae00a346229272985118e501c27284276e
结果:
git status
从git status 中 看不出来具体结果
文件内容
可以看到 工作区 暂存区 之前的修改 都在
并且 当前节点 与 原节点的差异 放到了暂存区
恢复demo
3.mixed
同hard soft
此时 同时在工作区 暂存区 添加修改内容
每次修改 各增加了一行 就不上图了
没有commit 所以git log 同之前的内容
就不上图了
结果:
git status
文件内容
仔细看代码行数右边的绿线 vscode 自带的提示效果 说明所有改动(节点之间的差异,reset前的工作区 暂存区改动)都在工作区
至此 reset 3种不同参数的演示结束了
从演示结果来看 hard模式 是最容易理解的 丢弃所有修改 回到目标head
但是 soft mixed模式 不得不引起思考:
1.把节点间的差异 放在工作区 与暂存区 有什么区别?
2.如果节点间的差异 存在冲突 如何处理?
3.如果节点间差异 和 commit之后的修改 即 “暂存区的修改 工作的修改”又有冲突 如何处理?
问题2:
1.增加第三次commit 在第二次修改行 增加内容“第三次修改”
2.reset回第一次修改
结果:第2 3次修改 内容都在 这里比较容易理解 merge了;那么接下来 我在第二次修改的基础山 删除一些内容
恢复demo
写到这里,我认为,git 应该只是对比节点之间的差异,把差异放在工作区/暂存区,而不关心中间的改变是如何发生的
结果:和我想的一样