技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战
用简洁而优雅的 Git 命令撤销仓库中的改变。
使用 Git 工作时其中一个鲜为人知(和没有意识到)的方面就是,如何轻松地返回到你以前的位置 —— 也就是说,在仓库中如何很容易地去撤销那怕是重大的变更。在本文中,我们将带你了解如何去重置、恢复和完全回到以前的状态,做到这些只需要几个简单而优雅的 Git 命令。
重置
我们从 Git 的 reset 命令开始。确实,你应该能够认为它就是一个 “回滚” —— 它将你本地环境返回到之前的提交。这里的 “本地环境” 一词,我们指的是你的本地仓库、暂存区以及工作目录。
先看一下图 1。在这里我们有一个在 Git 中表示一系列提交的示意图。在 Git 中一个分支简单来说就是一个命名的、指向一个特定的提交的可移动指针。在这里,我们的 master 分支是指向链中最新提交的一个指针。
图 1:有仓库、暂存区、和工作目录的本地环境
如果看一下我们的 master 分支是什么,可以看一下到目前为止我们产生的提交链。
$ git log --oneline b764644 File with three lines 7c709f0 File with two lines 9ef9173 File with one line
如果我们想回滚到前一个提交会发生什么呢?很简单 —— 我们只需要移动分支指针即可。Git 提供了为我们做这个动作的 reset 命令。例如,如果我们重置 master 为当前提交回退两个提交的位置,我们可以使用如下之一的方法:
$ git reset 9ef9173
(使用一个绝对的提交 SHA1 值 9ef9173 )
或:
$ git reset current~2
(在 “current” 标签之前,使用一个相对值 -2)
图 2 展示了操作的结果。在这之后,如果我们在当前分支(master)上运行一个 git log 命令,我们将看到只有一个提交。
$ git log --oneline -
9ef9173 File with one line
图 2:在 reset 之后
git reset 命令也包含使用一些选项,可以让你最终满意的提交内容去更新本地环境的其它部分。这些选项包括:hard 在仓库中去重置指向的提交,用提交的内容去填充工作目录,并重置暂存区;soft 仅重置仓库中的指针;而 mixed (默认值)将重置指针和暂存区。
这些选项在特定情况下非常有用,比如,git reset --hard <commit sha1 | reference> 这个命令将覆盖本地任何未提交的更改。实际上,它重置了(清除掉)暂存区,并用你重置的提交内容去覆盖了工作区中的内容。在你使用 hard 选项之前,一定要确保这是你真正地想要做的操作,因为这个命令会覆盖掉任何未提交的更改。
恢复
git revert 命令的实际结果类似于 reset ,但它的方法不同。reset 命令(默认)是在链中向后移动分支的指针去“撤销”更改,revert 命令是在链中添加一个新的提交去“取消”更改。再次查看图 1 可以非常轻松地看到这种影响。如果我们在链中的每个提交中向文件添加一行,一种方法是使用 reset 使那个提交返回到仅有两行的那个版本,如:git reset HEAD~1 。
另一个方法是添加一个新的提交去删除第三行,以使最终结束变成两行的版本 —— 实际效果也是取消了那个更改。使用一个 git revert 命令可以实现上述目的,比如:
$ git revert HEAD
因为它添加了一个新的提交,Git 将提示如下的提交信息:
Revert "File with three lines" -
This reverts commit b764644bad524b804577684bf74e7bca3117f554. -
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # modified: file1.txt #
图 3(在下面)展示了 revert 操作完成后的结果。
(编辑:ASP站长网)
|