注意那个 C3' 和 C5' — 在 master 分支上已处于提交链的“顶部”,由于产生了更改而创建了新提交。但是也要注意的是,rebase 后“原始的” C3 和 C5 仍然在那里 — 只是再没有一个分支指向它们而已。
如果我们做了这个变基,然后确定这不是我们想要的结果,希望去撤销它,我们可以做下面示例所做的操作:
$ git reset 79768b8
由于这个简单的变更,现在我们的分支将重新指向到做 rebase 操作之前一模一样的位置 —— 完全等效于撤销操作(图 6)。
图 6:撤销 rebase 操作之后
如果你想不起来之前一个操作指向的一个分支上提交了什么内容怎么办?幸运的是,Git 命令依然可以帮助你。用这种方式可以修改大多数操作的指针,Git 会记住你的原始提交。事实上,它是在 .git 仓库目录下,将它保存为一个特定的名为 ORIG_HEAD 的文件中。在它被修改之前,那个路径是一个包含了大多数最新引用的文件。如果我们 cat 这个文件,我们可以看到它的内容。
$ cat .git/ORIG_HEAD 79768b891f47ce06f13456a7e222536ee47ad2fe
我们可以使用 reset 命令,正如前面所述,它返回指向到原始的链。然后它的历史将是如下的这样:
$ git log --oneline feature 79768b8 C5 000f9ae C3 259bf36 C2 f33ae68 C1 5043e79 C0
在 reflog 中是获取这些信息的另外一个地方。reflog 是你本地仓库中相关切换或更改的详细描述清单。你可以使用 git reflog 命令去查看它的内容:
$ git reflog 79768b8 HEAD@{0}: reset: moving to 79768b c4533a5 HEAD@{1}: rebase finished: returning to refs/heads/feature c4533a5 HEAD@{2}: rebase: C5 64f2047 HEAD@{3}: rebase: C3 6a92e7a HEAD@{4}: rebase: checkout master 79768b8 HEAD@{5}: checkout: moving from feature to feature 79768b8 HEAD@{6}: commit: C5 000f9ae HEAD@{7}: checkout: moving from master to feature 6a92e7a HEAD@{8}: commit: C4 259bf36 HEAD@{9}: checkout: moving from feature to master 000f9ae HEAD@{10}: commit: C3 259bf36 HEAD@{11}: checkout: moving from master to feature 259bf36 HEAD@{12}: commit: C2 f33ae68 HEAD@{13}: commit: C1 5043e79 HEAD@{14}: commit (initial): C0
你可以使用日志中列出的、你看到的相关命名格式,去重置任何一个东西:
$ git reset HEAD@{1}
一旦你理解了当“修改”链的操作发生后,Git 是如何跟踪原始提交链的基本原理,那么在 Git 中做一些更改将不再是那么可怕的事。这就是强大的 Git 的核心能力之一:能够很快速、很容易地尝试任何事情,并且如果不成功就撤销它们。
【编辑推荐】
- 前后端必备Linux基础知识大科普
- Linux内存管理之全局框架
- Chrome OS优化支持Linux应用:可双击.deb文件安装
- 对 Linux 用户一记暴击:Dropbox 或将停止支持 Linux
- 如何在Linux中使用Fio来测评硬盘性能
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0
(编辑:ASP站长网)
|