说明

有时候,我们用Git的时候有可能commit提交代码后,发现这一次commit的内容是有错误的,那么有两种处理方法:

  1. 修改错误内容,再次commit一次
  2. 使用git reset 命令撤销这一次错误的commit

第一种方法比较直接,但会多次一次commit记录。错误的commit没必要保留下来,那么今天来说一下git reset

1
git-reset - Reset current HEAD to the specified state

本质上reset是移动HEAD指针,他做了2件事情:

  1. 从某个commit节点移动到之前的某个cimmit节点
  2. 处理工作空间、暂存区、仓库这3处的变化

Working Tree 当前的工作区域

Index/Stage 暂存区域,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面

Repository 提交的历史,即使用git commit提交后的结果

这张图片红色箭头的尾部表示内容的起点,头部表示内容的去向

  • –soft:将指针移动之间的变化放进stage(清理提交记录可以使用一下)
  • –mixed:将指针移动之间的变化放进worktree,并且顺带把stage区的内容也放进worktree(后悔的时候)
  • –hard:将指针移动之间的变化、stage、worktree的内容统统扔掉(一般不用)

暂存区回到工作区

即通过 git add 提交到暂存区的文件

reset 如果不加参数,那么默认使用 –mixed 参数。它的行为是:保留工作目录,并且清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。

1
2
3
git reset 文件名.后缀名
#或者全部取消暂存
git reset .

本地仓库回到暂存区

即已经在本地执行过 git commit ,但是还没有push

注意:如果时第一次执行git commit(即该仓库到目前为止只有 commit 过一次代码),因为已经是 head 版本,所以如果执行以下命令会报错

fatal: ambiguous argument ‘HEAD~1’: unknown revision or path not in the working tree.

我先多创建几次 commit ,撤销上次 commit 的几种方法

1
2
3
4
5
git reset --soft 记录id
#或者
git reset --soft HEAD^
#或者
git reset --soft HEAD~1

HEAD^ 表示上一个版本,即上一次的 commit

可以通过 git log来查看最近几次提交到仓库的信息,确实是否成功撤销 commit

修改 commit 注释

如果git commit 后注释写错了,需要改一下注释

1
git commit --amend

本地仓库已经 push 到远程仓库

通过 git reflog查看最近的几次记录

撤销本次提交

1
git reset --soft 记录id

然后强制推送到远程仓库,远程仓库的本次提交就会消失(应该理解为强制覆盖)

本地还是修改之后的状态,而远程仓库已经是本次提交之前的状态。

1
git push --force