undefined

撤销 Git 操作

一、撤销提交

当 commit 后,想要撤销。使用:

1
git revert HEAD

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

如果想要抵消多个提交,必须在命令行依次指定这些提交。如下:

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

git revert 命令还有两个参数

1
2
--no-edit 执行时不打开默认的编辑器,直接使用 Git 自动生成的提交信息
--no-commit 只抵消暂存区和工作区的文件变化,不产生新的提交

二、丢弃提交

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

1
git reset [last good SHA]

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

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

1
git reset --hard [last good SHA]

执行 git reset 命令之后,如果想要找到哪些丢弃的提交,可以使用 git reflog 命令。这种方法有实效性,时间长了可能找不回来

三、替换上一次提交

提交之后,修改提交信息

1
git commit --amend -m "fixes bug"

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

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

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

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

1
git checkout -- [filename]

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

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

五、从暂存区撤销文件

如果把一个文件添加到暂存区,使用

1
git rm --cached [filename]

不会影响已经提交的内容

六、撤销当前分支的变化

在当前分支上做了几次提交,突然发现放错了分支,这几个提交本应该放到另一个分支

1
2
3
4
5
6
7
8
# 新建一个 feature 分支,指向当前最新的提交。这时依然停留在当前分支
git branch feature

# 切换到这几次提交之前的状态
git reset --hard [当前分支此前的最后一次提交]

# 切换到 feature 分支
git checkout feature

上面的操作等于是撤销当前分支的变化,将这些变化放到一个新建的分支