工作区回滚:文件修改错误

使用 git checkout 命令

1
2
3
4
# 查看指定文件的历史版本
$ git log <filename>
# 回滚到指定commitID
$ git checkout <commitID> <filename>

暂存区回滚:git add 添加了多余文件

这样的错误是由于直接 go add . 一把梭,把当前目录所有文件都暂存了,不小心就会提交其他文件

撤销操作

1
2
3
4
5
6
7
8
# 先看一下add 中的文件
git status

# 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 ,HEAD 可以不写,直接git reset
git reset HEAD

# 就是对某个文件进行撤销了,HEAD 可以不写,直接git reset XX文件
git reset HEAD XXX/XXX/XXX.java

本地仓库回滚:git commit 了错误文件

如果不小心 弄错了 git add后 , 又 git commit 了,但还没push到远程。

先使用 git log 查看 commit 节点的信息,关键是获取到 commit id

1
2
3
4
commit xxxxxxxxxxxxxxxxxxxxxxxxxx
Merge:
Author:
Date:

方法一:git reset

使用 git reset commit_id 命令进行本地回滚

  • git reset commit_id :mixed 模式,回退到上一个 提交的节点(即目标版本号) 代码还是原来你修改的
  • git reset –hard commit_id :回退到上一个 commit 节点, 代码也发生了改变,变成上一次的
  • git reset –soft commit_id:回退到上一个 commit 节点, 工作区和暂存区还是原来你修改的

使用 git reset 会将错误的 commit 节点删除

方法二:git revert

使用 git revert -n commit_id 命令进行本地回滚

-n 参数表示不自动提交 commit,即在撤销了所有指定的 commit 后,不会立即创建新的 commit 记录撤销操作。这样可以让用户手动检查撤销的结果是否正确,并根据需要进行修改、补充等操作,最终再手动提交撤销 commit。

通过 git revert 还原已经提交的修改,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交。

git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。实际上这是用修改代替删除的一种撤销方式

1
2
3
4
5
6
7
8
# 撤销前一次 commit
git revert HEAD

# 撤销前前一次 commit
git revert HEAD^

# 撤销指定的版本,撤销也会作为一次提交进行保存
git revert commit-id

远程仓库回滚:错误的 commit 已经同步到了远程仓库

针对 git reset

如果使用 git reset 方法回滚的本地仓库,那么远程仓库回滚需要在本地仓库回滚的基础上,进行强制推送即可

-f 即强制推送,因为本地仓库在reset之后,版本比远程仓库低,普通推送无法推送,会报错,需要进行强制提交

1
2
git reset --hard 目标版本号
git push -f

针对 git revert

因为使用 git reset 方法并不会将历史的 commit 节点删除,所以能够正常推送

一般而言,这是首选,因为可以规避使用 git push -f ,防止操作失误导致数据丢失