如何撤销 Git 操作?

Git 版本管理时,往往需要撤销某些操作。

本文介绍几种最主要的情况,给出详细的解释。更多的命令可以参考《Git 常用命令清单》。

一、撤销提交

一种常见的场景是,提交代码以后,你突然意识到这个提交有问题,应该撤销掉,这时执行下面的命令就可以了。

$ git revert HEAD

上面命令的原理是,在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险。

git revert 命令只能抵消上一个提交,如果想抵消多个提交,必须在命令行依次指定这些提交。比如,抵消前两个提交,要像下面这样写。

$ git revert [倒数第一个提交] [倒数第二个提交]

git revert命令还有两个参数。

  • --no-edit:执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息。

  • --no-commit:只抵消暂存区和工作区的文件变化,不产生新的提交。

二、丢弃提交

如果希望以前的提交在历史中彻底消失,而不是被抵消掉,可以使用git reset命令,丢弃掉某个提交之后的所有提交。

$ git reset [last good SHA]

git reset的原理是,让最新提交的指针回到以前某个时点,该时点之后的提交都从历史中消失。

默认情况下,git reset不改变工作区的文件(但会改变暂存区),--hard参数可以让工作区里面的文件也回到以前的状态。

$ git reset --hard [last good SHA]

执行git reset命令之后,如果想找回那些丢弃掉的提交,可以使用git reflog命令,具体做法参考《Git 常用命令清单》。不过,这种做法有时效性,时间长了可能找不回来。

三、替换上一次提交

提交以后,发现提交信息写错了,这时可以使用git commit命令的--amend参数,可以修改上一次的提交信息。

$ git commit --amend -m "Fixes bug #42"

它的原理是产生一个新的提交对象,替换掉上一次提交产生的提交对象。

这时如果暂存区有发生变化的文件,会一起提交到仓库。所以,--amend不仅可以修改提交信息,还可以整个把上一次提交替换掉。

四、撤销工作区的文件修改

如果工作区的某个文件被改乱了,但还没有提交,可以用git checkout命令找回本次修改之前的文件。

$ git checkout -- [filename]

它的原理是先找暂存区,如果该文件有暂存的版本,则恢复该版本,否则恢复上一次提交的版本。

注意,工作区的文件变化一旦被撤销,就无法找回了。

五、从暂存区撤销文件

如果不小心把一个文件添加到暂存区,可以用下面的命令撤销。

$ git rm --cached [filename]
展开阅读全文

本文系作者在时代Java发表,未经许可,不得转载。

如有侵权,请联系nowjava@qq.com删除。

编辑于

关注时代Java

关注时代Java