哪些年,我们玩过的Git (5)

值得注意的是,我们通过指定id来进行版本回退的时候,由于id过长,我们没必要全写,只需要传入前几个字符保证id的唯一性即可。有使用过Docker的朋友,应该会熟悉,我们在指定容器的时候,也是类似的操作。

下面Taoye版本三的论文迅速回退到版本一,骚操作如下:

1$ git reset --hard dc1dcd
2$ cat paper.txt
3Oh, my god, I will write my graduate paper.
4Come on, Taoye.

关于版本穿梭的简单解释:其实,在Git中,有个HEAD指针用于指向当前版本,当我们进行版本回退的时候,其实就是改变HEAD的指向,指向对应的版本也就实现了版本的回退。这有点类似于数据结构中链表的操作。

此外,我们还可以通过git reflog来查看当前版本文件的变换:

1$ git reflog paper.txt
2dc1dcd9 HEAD@{1}: reset: moving to dc1dcd                       # 版本的回退(回退到版本一)
3d793831 (HEAD -> master) HEAD@{2}: commit: fixed the typos      # 第三次提交(版本三)
4454cc57 HEAD@{3}: commit: finished the summary                  # 第二次提交(版本二)
5dc1dcd9 HEAD@{4}: commit (initial): start writing my paper      # 第一次提交(版本一)
撤销修改

假设Taoye在写论文的时候,每天都在不断地修修改改,心里面非常的烦躁,很不是滋味。于是乎,在paper.txt中添加如下一句话:

1I don't like my tutor, he often criticizes me.

然而,在打算提交的时候,想了想还是有点不太妥,要是因为这么一句话,最终导致无法毕业那就完蛋了。对此,我们在对文件commit之前使用'git status paper.txt'命令发现,可以通过checkout --来进行修改撤销,撤销至修之前的状态,操作如下:

1$ git checkout -- paper.txt
2$ cat paper.txt     # 执行之后,可以发现已经撤销到无最后一句的状态

以上是发生在我们对工作区中的文件进行修改,但是还没有执行git add操作,将工作区中的paper.txt添加至暂存区中的场景,已达到撤销至修改之前的状态。假设我们在对paper.txt修改之后,再执行git add paper.txt命令将文件添加至暂存区,那么我们该怎样撤销呢?按照思路,我们可以先通过git reset HEAD将暂存区中的内容撤销掉放回工作区,然后撤销工作区即可实现需求,对此,有如下操作:

1# 将暂存区中的内容撤销掉放回工作区
2git reset HEAD paper.txt
3# 撤销工作区修改的内容
4git checkout -- paper.txt

如此一来,就完美的将I don't like my tutor, he often criticizes me.撤销掉,Taoye也就能顺利毕业了。关于撤销,要记得与版本回退区分开来,撤销是我们在对文件进行修改但是还没有进行commit的时候发生的,而版本回退是在执行了commit提交操作之后发生的。

文件的删除

在上面的内容中,我们已经详细的介绍了关于文件的修改、版本回退、撤销等操作,下面我们来讲讲文件在删除之后应该会出现哪些操作。

假设现在出现了这么一种情况:Taoye有个顽皮的妹妹,她在用我电脑的时候,不小心将我的paper.txt论文文件从本地磁盘删除了。一气之下,Taoye将妹妹关进了小黑屋自我反省七天。悲剧啊,Taoye忙活了将近一个月的论文就此烟消云散,Git该如何挽回这样的结局呢?

在paper.txt文件删除之后,我们使用git status来查看一下文件的状态:

1$ git status
2On branch master
3Changes not staged for commit:
4  (use "git add/rm <file>..." to update what will be committed)
5  (use "git checkout -- <file>..." to discard changes in working directory)
6
7        deleted:    paper.txt
8
9no changes added to commit (use "git add" and/or "git commit -a")

在Git看来,你将文件从工作区中删除,其实也是对文件的一种修改。也就是说,现在我们的工作区中的内容与版本库中的内容不一致(工作区没有了paper.txt文件,而版本库依然存在paper.txt文件)。为了将两者空间中的内容达到一致,我们现在有两种选择,一是将版本库中的paper.txt文件删除掉,二是将工作区中的paper.txt文件恢复。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdfzz.html