Git 的撤销操作总结

本文介绍几种常用的 Git 撤销的操作。

撤销提交

提交代码之后,意识到该提交有问题,想要撤回这个提交:

git revert HEAD

git revert 命令的原理是再 新增一次提交 ,撤销掉上一次提交的所有变化,这种方式是在历史基础上进行修订,不会丢失代码。

git revert 命令只能抵消上一次提交,如果想要抵消多个提交,可以这样写:

git revert <commit1> <commit2>

之前提交信息的记录可以用 git log 查看。

git revert 常用的参数:

  • --no-edit: 不打开默认编辑器编辑提交信息,使用默认提交信息
  • --no-commit: 不产生新的提交,只是撤销缓存区和工作区的变化

修正上一次提交

提交代码之后,发现提交信息写错了,可以用如下命令修改上一次提交的修改信息:

git commit --amend -m "new message"

--amend 的原理是产生一次新的提交覆盖上一次的提交对象。

值得注意的是,如果再次提交期间缓存区有文件变化,那么也会一起提交到仓库,不仅仅是更改提交信息,所以这种方式在一定程度上可以取代撤销操作。

从缓存区撤销文件

如果不小心将文件添加到了缓存区,那么可以使用如下命令撤销:

git rm --cached <filename>

撤销工作区的文件修改

如果工作区的的文件已经修改了,但是没有提交,可以用 git checkout 找回本次修改之前的文件:

git checkout -- <filename>

git checkout 的原理是现在缓存区里找,如果缓存区里有缓存的版本,则恢复该版本,否则恢复上一次提交的版本,工作区的文件修改一旦被撤销,就无法再找回了,也就是说这个撤销是不可逆的。

丢弃某个提交点之后的所有提交

如果希望最新的提交记录回到提交历史中的某一个时间点,这个时间点之后的所有提交都被丢弃,那么可以使用如下命令:

git reset <commit>

默认情况下 git reset 只会修改缓存区,而不会修改工作区,如果想要工作区也回滚到以前的状态,那么需要使用 --hard 参数:

git reset --hard <commit>

撤销当前分支的提交

如果已经在某一个分支上做了多次提交,发现提交错了分支,应该提交到另一个分支上,那么可以通过以下操作修正:

# 首先创建一个新的分支用来接收新的提交,但此时并没有切换到新的分支
git branch feature

# 然后将当前分支恢复到错误提交之前的最后一次提交点
git reset --hard <本分支错误提交之前最后一次提交点>

# 然后切换到新分支上,新的提交在新的分支保留了下来,接下来的提交也应该在新分支上
git checkout feature

参考资料