reset current branch to here是git命令中的一种回滚操作。
其使用场景如下,
- 1)提交了多次错误的提交,想回滚到之前的某次提交。
- 2)合并了错误的分支,想回滚到合并之前。
该操作回滚到某次commit提交后,该commit提交之后提交的代码都可以再次修改重新提交。
另外,还有一种情况,边拉代码边提交代码可能导致拉取的代码一直有冲突,解决办法可以把本地代码暂存(git stash changes)起来,然后回滚到某个commit(git reset current branch to here),最后在取出暂存代码(git unstash changes),注意这里stash相当于一个栈的操作进行压栈和出栈,如果有多次stash注意取的代码是哪一次压栈。
git reset current branch to here回滚有四种模式,soft,mixed,hard,keep。一般情况下,不要轻易使用hard模式,这几种有什么区别,如何使用往下看,其中三种如下图,
- Working Tree 当前的工作区域
- Index/Stage 暂存区域,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面
- Repository 提交的历史,即使用git commit提交后的结果
文件从工作树存入到仓库的流程参考文末1。
git reset current branch to here的本质:是移动 HEAD 以及它所指向的 branch。几种模式的主要区别是:
- --soft:重置位置的同时,保留working Tree工作目录和index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。
- --mixed(默认):重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。
- --hard:重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
- --keep:重置位置的同时,直接将 working Tree工作目录 和 repository 都重置成目标Reset节点的內容,**index 暂存区 **的内容保持不变。
参考链接:
1、Git Reset 三种模式hard,soft,mix - 博客 - 编程圈 (bianchengquan.com)
2、Git 中文开发手册 - 开发者手册 - 云+社区 - 腾讯云
3、Git让你从入门到精通,看这一篇就够了! - SegmentFault 思否
版权归原作者 四问四不知 所有, 如有侵权,请联系我们删除。