1.版本回退
我们之前已经提交过了readme.txt,我们用vi再修改一次,再提交。
git log可以查看你的提交历史。如下:
其中,527344…那一长串数字就是你的版本号。
那么,如果我们想回到第一个版本怎么办呢?
可以使用:git reset --hard HEAD^
其中HEAD代表就是最新的版本,^就是上一个版本。我们再次使用git log查看一下:
并且我们发现文件内容已经是第一次的内容了。这个速度很快,其实内部有个指向HEAD的指针,回退只是把指针移动一下,然后工作区更新为指向的版本,所以看到readme更新了。
如果我们回退后后悔了,也是有办法恢复的。我们只需要用用git reflog查看命令历史,确定版本号,以便确定要回到未来的哪个版本。
git reset --hard 版本号
到此,我们已经知道,我们可以在过去和未来的版本任意穿梭,他们都是会保存的,不会丢失。
2.工作区和暂存区
这其实是一个很重要的概念。
工作区就是我们看见的learngit里面的文件readme.txt。而我们在learngit中会有一个.git隐藏目录,里面会有一个暂存区,和创建的唯一master和指向master的HEAD指针(类似于链表的形式)。
我们新建一个文件就是在工作区,git add其实就是把他们放入暂存区,git commit把他们从暂存区移入master中。这样我们就知道这两个操作的含义了,也知道版本回退后为什么文件内容改变了。因为工作区的内容就是HEAD指向的版本内容。
我们知道git管理的是修改,而不是文件。我们如果多次修改,必须先git add到暂存区,才能一次commit。否则修改是不会提交的。所以我们必须对每次修改都要add并commit,否则会丢失你的修改;
3、撤销修改
我们如果修改之后想要撤销修改,有什么办法呢?大家要注意,这和版本回退是不一样的。版本回退后原来的版本还是能够在master树上找到的。如果我们不想要别人看到写的东西,我们就需要撤销修改。
这又分为三种情况:
(1)文件修改后还没有add到暂存区,这时候我们只需要使用
git checkout --文件名就可以撤销修改。
(2)文件已经add到暂存区,但是还没有提交。要分为两步:首先
git reset HEAD 文件名,这个命令是把文件从暂存区的文件重新放回工作区,然后按照(1)git checkout --文件名就可以撤销修改。
(3) 如果文件已经提交了,只能把版本回退一下,不过这并不保险,因为你的commit id仍然是可以查到的,如果它又回到最新版本,还是会被发现的。
4、删除文件
我们要知道,git最大的特点就是跟踪修改,所以删除文件也是一种修改。只要文件已经提交到版本库了,永远不要担心误删,都是可以恢复的,只要知道版本号id,就可以回退到对应版本。
假设我们rm a.txt。我们把工作区的文件删除了,如果我们其实是误删,想要恢复。只需要git checkout – test.txt,就可以恢复最新的版本,这其实就是把版本库中的替代工作区了,无论是修改还是误删,都可以一键还原。
如果我们确实是想要把这个文件删掉,我们还需要git rm test.txt,从版本库中删除,git commit -m "remove test.txt"提交删除这个修改操作。
我们rm–add–commit和git rm—commit是一样的。
但最终,我们只需要回退一下,就可以恢复原来的文件。