1. git reset 语法
命令格式:git reset [--soft | --mixed | --hard] [
1.1 使用参数--hard,如git reset --hard
①替换引用的指向。引用指向新的提交ID。
②替换暂存区。替换后,暂存区的内容和引用指向的目录树一致。
③替换工作区。替换后,工作区的内容变得和暂存区一致,也和HEAD所指向的目录树内容相同。
1.2 使用参数--soft,如 git reset --soft
即只更改引用的指向,不改变暂存区和工作区。
只改变commit(指针指向),stage index 和 working directory 不变
1.3 使用参数--mixed或者不使用参数(默认为--mixed),如 git reset
更改引用的指向及重置暂存区,但是不改变工作区。
只改变commit(指针指向) 和 add (stage index),working directory不变
eg.
git status # 查看工作区是否干净
subl readme.md # 修改md文件
git add readme.md # 提交到缓存区 stage index
git commit -m '201907071410' # 提交到版本库
git reset --mix head # 将 stage index 和指针退回到上一次提交
git status # 检查工作区状态
git checkout --README.md # 将缓存区文件拉回到工作区
已经push到远程仓库的代码
通过 git reset
直接删除指定的commit id后面所有的提交,指针指向commit id
git push origin HEAD --force
强制提交代码,因为本地版本早于远程仓库代码
2. git reset 原理
--hard:重置位置的同时,直接将 working Tree工作目录、 index 暂存区及
repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和
工作区。
--soft:重置位置的同时,保留working Tree工作目录和index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。
--mixed(默认):重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。