撤销

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

撤销的场景很容易想象,还是以游戏存档为例,当我们在某个时间点存档之后,我们继续游戏,我们的人物的状态( 经验、红蓝条、装备、金币等 )在发生变化,在这个过程中我们可能又存档了,也可能没有,但这不重要,重要的是:出于某个原因我们现在想退回到最近的那个存档,甚至是退回到更远的某个存档。

一旦发生「退回」的行为,我们的人物这段时期内的状态的变动都将消失,也就是撤销。

有意思的是,Git 的撤销功能比上述游戏的比喻更强大,它又分为「硬撤」和「软撤」。

提示

在英语单词上,这里的撤销,在 Git 中使用的是 Reset( 重置 )这个单词,而非某个撤销的英语单词。

在 GitKraken 中,图形化界面中触发撤销( git reset 命令 )的地方主要靠 2 处:

  1. 在工作区上方有一个「垃圾桶」的图标和鼠标右键的选项( 在工作区和暂存区的文件身上点击鼠标右键 ),代表 Discard changes 功能。

    git-reset-GitKraken-1

  2. 在某个历史记录点击鼠标右键,有一个 Reset ... + Soft 选项。

    git-reset-GitKraken-2.png

1. Unstage 和 Discard changes

无论是 Unstaged 状态文件,还是 Staged 状态文件,本质上,它们都是「自上一次存档后,有变动,还未再次存档」的文件。

对于它们的撤销,用游戏做类比,这个操作就是「退回到最近的那个存档,刚刚发生的一切就当没有发生过,让它们消失。」

1.1 Staged 文件撤销:Unstage

Staged 状态的文件就是你提交到暂存区中( 还未 Commit )的文件。

这些文件当初是从“上面( Unstaged 区域 )”下来的,这里,我们通过 Unstage 操作,可以让它们再“上去” 。

git-reset-GitKraken-6

如上图所示,Staged 状态的文件被撤销后,它们就从 Staged 状态变为了 Unstaged 状态。从右侧中间的区域变到右侧上方区域去了。

这样的变动除了在视觉效果上有变动,但是实际上它对磁盘的文件的内容没有影响,因为这些变动仍然还在( 在你的磁盘上、工作区 )

那么这个操作的价值是什么?它在什么时候用?

因为 git commit 提交操作提交的是暂存区的文件,即将 Staged 状态的文件变为 Commited 状态,而不管 Unstaged 状态的文件。

所以,将一个文件「挪出」暂存区的目的是为了在接下来的 git commit 提交中不包含它,不把它的变动存档( 而是留在下次再存档 )

1.2 Unstaged 文件撤销:Discard changes

git-reset-GitKraken-4

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

补充

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

2. 点击「垃圾桶」

点击垃圾桶也是回退到上一次、也就是最近一次存档的样子。它会让未提交的文件,即 Unstaged + Staged 文件都丢弃变动,恢复成之前未修改的样子。

git-reset-GitKraken-3

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

3. 撤销刚才的提交

虽然都是叫撤销,但是这里的撤销和上面的撤销有个本质性的不同:

  • 上面的撤销,是在上次存档之后,数据有变动,但变动的数据并未存档而进行的撤销。
  • 下面要介绍的撤销是我们已经存档了,我们想撤销、丢弃的最近的某个或某些存档。

3.1 「硬」撤

( hard )撤销是完全符合我们的常识的。

你一关一个存档,然后现在走到了第四关,突然觉得又想回退到第一关的存档那里,从那里开始再来一遍。

硬撤到过去的某个存档之后,从那里开始到「现在」所有所发生的一切都会消失,如同从未出现过。

[缺图一张]

3.2 「软」撤

如果用显示中游戏的示例作类比,你会发现「软( hard )撤销」有点不科学...

软撤销会让你从第四关回到第一关,第二三四关的存档会消失,但是,你在二三四关经历的变动,例如打出来的装备仍然在你的身上!

当然,你可以再进一步操作:舍弃身上的这些变动,那么,到这一步,软撤就和硬撤一样了。

git-reset-GitKraken-5

注意上面那个撤销后的「虚圈」,硬撤中是没有这个的,硬撤时直接就丢了,而软扯要你手动丢。

另一种效果图:

git-top-10-07

提示

之所以软撤这么「奇怪」是因为相较于硬撤的一刀切,软扯给为你撤销你的撤销留了机会:你可以不丢虚圈,而是再次提交。

Last Updated:
Contributors: hemiao