2022年4月28日
# 前言
今天遇到一个问题,以前也遇到过,时间久了就给忘了,然后这次又重蹈覆辙的犯了一次,所以记录下。
当你本地commit了错误的文件,你通过reset回滚之后,发现上次提交的变更代码以及放在工作目录中的代码都消失了,只剩下上一次你提交的代码。这个就糟心,之前写的代码都没了。本篇文章就是记录这个问题的解决方案的。
# git reset的三种模式
hard 模式:重置到指定commit号的代码,会清空之前修改的代码,比如 commit、add、工作目录中的修改全部都清空掉了。顶多你知道之前的commit号,可以通过git checkout commit号
切换到那次commit,然后把代码拷出来,但add过和工作目录中未add过的代码还是会丢失。反正 原commit会丢失,原add也会丢失,原工作目录中未add和未commit的也会丢失,只保留你指定commit号的所有记录。
soft 模式:重置到指定的commit号的代码,不会清空之前修改的代码,之前在工作目录中的代码依旧保留,而之前commit的代码会被放到 add过的暂存区中去,原来add过还未commit的部分也依旧保留。反正之前的commit都会放入add中保留,原add也保留,原工作目录中依旧保留。
mixed 模式:重置到指定的commit号的代码,会将之前commit的代码放入工作目录中,会把之前add暂存区中的代码也放入工作目录中,原工作目录中未add和未commit的依旧保留。反正就是之前commit和add全都放入工作目录中保留下来。
# hard模式(灰飞烟灭模式,慎用)
撤销暂存区和工作区的内容
git reset --hard
撤销掉当前commit的内容以及暂存区和工作区的内容
git reset --hard HEAD^
撤销到指定commit,并且清空之前commit的内容以及暂存区和工作区的内容
git reset --hard commit号
# soft模式(耦断丝连,还能接上)
撤销掉当前commit的内容到暂存区中
git reset --soft HEAD^
撤销到指定commit,把之前所有commit记录中的内容都放入暂存区中
git reset --soft commit号
# mixed模式(尘归尘,土归土,可能有点乱)
撤销当前add暂存区中的内容到工作目录下
git reset --mixed
撤销掉当前commit内容以及add的内容到工作目录下
git reset --mixed HEAD^
撤销到指定commit,并把之前commit以及add的内容放到工作目录下
git reset --mixed commit号
# 默认模式 与 拓展
# 默认模式
默认模式就是mixed,但是还是建议加上,避免这个默认配置被更改了,从而导致医疗之外的问题发生。
git reset
# 拓展
如果你想清空当前工作区,可以使用 git checkout .
。
如果你只是想清空当前工作区中某个文件的记录,也就是还原某个文件到最近一次commit时的状态,可以使用以下命令
# git checkout -- index.js
git checkout -- fileName
如果你想撤销一个有commit记录的文件,那只能先将commit还原到工作区,也就是要git reset --mixed HEAD fineName
。
然后再git checkout -- fileName
。
比如以下示例
git reset --mixed HEAD index.js
git checkout -- index.js
# 其它git操作
# 修改commit信息
比如你本次commit,不小心把commit msg 打错了,可以通过git commit --amend
,修改commit信息。
# 查看某次commit中修改记录
查看最新的commit记录git show
查看指定commit记录所有修改git show commit号
查看某次commit中某个文件的修改记录git show commit号 fileName
# 查看所有commit记录
查看当前commit及以下所有commit记录:git log
查看所有的commit记录包括reset过的记录:git reflog show
以树形图的方式查看commit记录:git log --graph
# 总结
通过这次一不小心的reset,算是长了个小见识,可能一不小心就把你辛苦写很久的代码全部清空,所以要注意噢。非必要,千万不能git reset --hard commit号
。