# 撤销

Git 中的撤销功能很强大,能应对多种常见、不常见场景,因此代价就是对初学者而言学习门槛很高,并且有很多特殊用法用不上,因此,通常各个图形化工具会做出简化,仅仅暴露常见、常用的撤销功能。

在 GitKraken 中执行撤销常见 2 处:

  1. 在工作区上方有一个 “垃圾桶” 的图标。

  2. 在工作区和暂存区的文件身上点击鼠标右键,有一个 “Discard changes” 选项。

    git-reset-GitKraken-1

# 1. 撤销所有未提交变动

当你点击 “垃圾桶” 的图标时,你的工作区和暂存区的内容(即,所有未提交的内容),会全部撤销。

这意味着,你的工作区的内容将会回到当初你什么都没动过的时候的样子,即,上一轮提交之后的样子。

git-reset-GitKraken-3

当然,GitKraken 会想你确认一下,怕你是手抖点错了。

这个图形化界面操作的背后,执行的是 git reset --hard 命令。

hard 方式的 git reset 会同时撤销你工作区和暂存区中的内容(discard all changes)。撤销后,你的项目就一步到位地回到『当初什么都没动过的样子』。

注意

你如果是手动执行 git reset --hard 命令的话,记得它是不带参数的,它直接就撤销了所有未提交的变动。

# 2. 单独撤销某个文件的未提交变动

这个功能执行很简单,如果你想撤销你对某个文件的变动,那么在它身上鼠标右键,点击 “Discard changes” 。

git-reset-GitKraken-4

点完之后,这个文件就恢复成没动过之前的样子。

这个操作背后执行的命令是: git checkout -- <文件名>

注意

不是 git reset 什么的。这个命令从版本库中的最新、最近版本来覆盖工作目录中的内容,即恢复成你变动之前的样子。

# 3. 撤销刚才的提交

不排除这种情况,你已经提交、或手抖提交了,然后发现,本不该提交的 ......

执行 git reset --soft HEAD~1 命令就可以用来实现撤销已提交的变更。

TIP

git reset --soft HEAD~1 命令的本意是:移动 HEAD 到指定的上一次的提交上。而 HEAD 指针是你的分支的逻辑上的(当前的)终点。

这里有 2 点注意的:

  1. HEAD~1 的含义就是最新版本的上一个版本,毫无疑问,还可以有 HEAD~2 、HEAD~3 等等,表示最新版本的上上个版本、上上上个版本。

  2. 你所提交的东西(也就是你想撤销的代码),会被 Git 放到暂存区,给你多一次考虑的机会,是真得删除掉,还是改改再提交。

在 GitKraken 图形化界面中,有这样的一个撤销操作:

git-reset-GitKraken-5

另一种效果图:

git-top-10-07