1. 版本回退
在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用 git log
命令查看:
退出git log命令行是: q。
Git提供了一个命令 git reflog
用来记录你的每一次命令:
如果我们要实现回退, Git必须知道当前版本是哪个版本,在Git中,用 HEAD
表示当前版本,也就是最新的提交009befc...711741
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是 HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
现在,我们要把当前版本回退到上一个版本,就可以使用 git reset
命令:
我们也可以是使用 commit_id 来在不同版本之间回退。
使用 git commit命令将文件添加到本地仓库,要撤销文件修改,可以使用如下命令:
git reset --hard commit_id
2. 版本库(Repository)
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用 git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用 git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
2. 撤销修改
1. 在Git中,git checkout -- file
可以丢弃工作区的修改:
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次 git commit
或 git add
时的状态。
git checkout -- file
命令中的 --
很重要,没有 --
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
2. 如果我们修改了文件,还 git add
到暂存区了,庆幸的是,在commit
之前,你发现了这个问题。用git status
查看一下,修改只是添加到了暂存区,还没有提交:
Git同样告诉我们,用命令 git reset HEAD file(即撤销git add 命令修改的文件)
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。再用git status
查看一下,现在暂存区是干净的,工作区有修改:然后按照第一步的方法回退。总结如下: