Git reset 命令有三个主要选项:git reset --soft; git reset --mixed; git reset --hard;
git reset --soft
将HEAD引用指向给定提交。索引(暂存区)和工作目录的内容是不变的,在三个命令中对现有版本库状态改动最小。
git reset --mixed(git reset默认的模式)
HEAD引用指向给定提交,并且索引(暂存区)内容也跟着改变,工作目录内容不变。这个命令会将索引(暂存区)变成你刚刚暂存该提交全部变化时的状态,会显示工作目录中有什么修改。
git reset --hard
HEAD引用指向给定提交,索引(暂存区)内容和工作目录内容都会变给定提交时的状态。也就是在给定提交后所修改的内容都会丢失(新文件会被删除,不在工作目录中的文件恢复,未清除回收站的前提)。
用表格看起来会更清楚些:
操作一下看一下实际效果:
首先在一个版本库中修改追踪文件,然后提交,description叫做 add button
使用git log 查看历史提交
copy记录add button 的前一次提交 add label 的哈希ID “7c5a658fbceb904ad877c4254d183e68aed1ddd0”,作为我们reset的给定提交。
git stauts 查看一下当前版本库中文件状态
显示nothing to commit ,在add button 提交后未对版本库中文件做修改
执行git reset --soft 7c5a658fbceb904ad877c4254d183e68aed1ddd0 命令,然后使用git status 查看文件状态。
然后再使用git log 查看历史提交记录。
会发现add button 已经没有了,版本库已经回滚到add label提交的状态了,但是在我们add button 提交修改的文件 里面修改的内容没有丢失,只是回到了未提交的状态。
将文件再次提交,同样取名add button ,继续git reset --mixed 操作。
同样是回滚到了add button 之前的add label 提交。被修改的文件内容也没有丢失,但是修改的文件为红色了(未执行add 操作)。
将文件再次提交,同样取名add button ,继续进行git reset --hard 操作。
执行完git reset --hard 命令后,使用git status 查看文件状态,回滚到add label 提交,add button被修改的文件内容已经没有了,丢失了。版本库中的文件已经完全回到刚提交完add label时的状态。
git reset 根据需要使用不同的命令,使用 --hard时一定考虑回滚后文件的丢失!