一、撤销提交
revert介绍
一种常见的场景是,提交代码以后,你突然意识到这个提交有问题,应该撤销掉,这时执行下面的命令就可以了。
git revert HEAD
上面命令的原理是,在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险。
git revert
命令只能抵消上一个提交,如果想抵消多个提交,必须在命令行依次指定这些提交。比如,抵消前两个提交,要像下面这样写。
$ git revert 98b8b6d
git revert
命令还有两个参数。
-
--no-edit
:执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息。 -
--no-commit
:只抵消暂存区和工作区的文件变化,不产生新的提交。
二、丢弃提交
reset介绍
如果希望以前的提交在历史中彻底消失,而不是被抵消掉,可以使用 git reset 命令,丢弃掉某个提交之后的所有提交。
$ git reset [提交代码hash]
$ git reset 69fde2c#表示代码回撤到这次提交
注意:
重点来了我们使用git reset 69fde2c
进行回滚,这个时候查看log记录发现最后一条新增c
记录没有了,这里还有个问题如果直接使用git push
推送会有以下提示。
这是因为本地的记录因为我们的回滚已经落后于仓库的代码了,这个使用需要使用
git push \-f
进行强制提交。
执行 git reset
命令之后,如果想找回那些丢弃掉的提交,可以使用 git reflog
命令,具体做法参考这里。不过,这种做法有时效性,时间长了可能找不回来。
三、替换上一次提交
提交以后,发现提交信息写错了,这时可以使用 git commit
命令的 --amend
参数,可以修改上一次的提交信息。
$ git commit --amend -m "Fixes bug #42"
它的原理是产生一个新的提交对象,替换掉上一次提交产生的提交对象。
这时如果暂存区有发生变化的文件,会一起提交到仓库。所以,--amend
不仅可以修改提交信息,还可以整个把上一次提交替换掉。