文章目录
场景
如果你刚对工作区的代码进行了修改,或者将部分代码加入了暂存区,或者是提交了一个commit,此时你后悔了,那么如何反悔呢?
注意:本节操作全是对本地分支的撤回操作
回顾
工作区就是开发区,刚开始工作区中会有一些文件,然后执行 git add 命令可以将工作区中的文件加入到暂存区中。接着执行 git commit 命令,可以将暂存区中的文件一次性提交到 git 仓库中,同时创建一个 commit object 指向一个 tree object,tree object 指向那些文件对应的 blob object。然后 master 指针会指向那个 commit object,HEAD 指针指向 master
对文件进行修改后,会让一个文件变成第二个版本,然后再次 git add 和 git commit,此时暂存里的文件会变成第二个版本,同时也会提交到仓库里创建一个新的 commit object,新的 commit object 会引用上一个 commit object。循环如此。
reset 撤回
假设工作区、暂存区和仓库中目前有3个版本
git reset --soft HEAD^
该命令的作用如下:
- 在仓库中,将master分支指向上一个 commit
- 暂存区和工作区还是停留在第三个版本
也就是说该命令相当于是撤回了 git commit 操作。
因为 git commit 操作就是将暂存区中的第三个版本放入仓库,同时创建一个新的 commit object 指向第三个版本,master 指针也指向最新的 commit object。
比如提交一次 commit

此时后悔了,使用 git reset --soft head^ 来撤回此次的提交

可以发现此时工作区的代码并没有被撤销

暂存区的内容也没有发生变化。
git reset HEAD^
该命令的作用如下:
- 将 master 指针指向上一个 commit
- 将 master 指针指向的 commit 对应的版本恢复到暂存区中
这个命令,相当于是撤回了 git commit 和 git add 操作
再执行一次 commit

执行 git reset head^

可以发现此时工作区的内容没有被还原,但是暂存区的文件被还原了。查看日志发现最近一次的commit也被撤销了

git reset --hard HEAD^
该命令的作用如下:
- 将 master 指针指向上一个 commit
- 暂存区里的内容变成上一个 commit 的版本,同时将上一个 commit 的内容恢复到工作区
这个命令彻底撤回了上次的 git commit 和 git add 操作,相当于是回退了到历史上的某一个版本

执行命令

修改了工作区中的内容,同时放入了暂存区,但是还没提交
git reset head
如果希望将暂存区里加入进去的内容撤销掉,然后在工作区里面重新修改代码。可以使用该命令


git reset --hard HEAD
将暂存区和工作区里面的内容一次性抹掉


修改了工作区中的内容放入了暂存区且提交了
比如说本来今天的代码你都提交了,但是你的leader说,这块代码不要了,此时怎么办呢?
回退版本,直接回退到没做任何代码修改的那个版本即可。
# 回退上一个版本
git reset --hard head^
# 回退到指定版本
#git reset --hard commit标识符
git reset --hard 9654657

本文详细介绍了如何使用Git的reset命令撤销工作区、暂存区及仓库的修改,包括git reset --soft、git reset 和 git reset --hard的不同用法,帮助读者理解如何在不同场景下撤回提交。
1034

被折叠的 条评论
为什么被折叠?



