今天我来介绍下Git,Git是一款免费、开源的分布式版本控制系统。
我们在上一个学习学习add、commit、status、diff、checkout、reset、rm命令。
这一章,我们学习log、reset、reflog、checkout、rm
Mac中Git的简单实用(1) — Git基本命令(1)
现在,我们再对git.txt文件进行一次修改,并提交到仓库当中,修改如下:
git is ok and good.
git is nice and great.
提交情况:
MBP:git qiuyu$ git add git.txt
MBP:git qiuyu$ git commit -m "the third release"
[master 9e4ea15] the third release
1 file changed, 1 insertion(+), 1 deletion(-)
MBP:git qiuyu$
下面我们回顾一下总共提交了哪些版本:
第一个:
git is ok.
git is nice.
第二个:
git is ok and good.
git is nice.
第三个:
git is ok and good.
git is nice and great.
如此,我们可以看到,之前提交了三次,具体的时间,提交的人,
还有一个SHA1计算出来的一个非常大的数字用于区分所有人提交的内容。
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,
也就是最新的提交9e4e......cf(注意我的提交ID和你的肯定不一样),
上一个版本就是HEAD^,上上一个版本就是HEAD^^,
当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
现在我们来把当前版本the third release回退到the second release,我们使用git reset命令
我们通过cat指令查看git.txt中的内容
MBP:git qiuyu$ cat git.txt
git is ok and good.
git is nice.
内容已经变为了第二个版本
这里可以看到,第三个版本已经不见了,但是这时候我们想回退到第三个版本,我们就需要之前的commit id来实现了。
通过git reset来实现,版本号没必要写全,前几位就可以了
Git提供了一个命令git reflog用来记录你的每一次命令:
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
你可以发现,Git会告诉你,git checkout -- file可以丢弃工作区的修改:
$ git checkout -- git.txt
命令git checkout -- git.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是git.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是git.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
现在,看看git.txt的文件内容:
内容变回了上次commit的版本。
git.txt文件内容:
git is ok and good.
git is nice and great.
[email protected]
我们使用了add命令将文件加入了暂存区,但是没有commit,我们先用git status查看
Git同样告诉我们,用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
再用git status查看一下,现在暂存区是干净的,工作区有修改。在通过上面所说的checkout来丢弃工作区的修改。
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:
$ rm git.txt
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
现在,文件就从版本库中被删除了。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。