Git版本控制工具学习(二) , 承接Git版本控制工具学习(一)
在上一节的学习当中,我们创建了一个Git库,使用了git init ,git add ,git commit等命令成功进行了一个文件的提交
那么现在我们不妨写改一下这个文件的内容(readme.txt)
下面是修改过后的文档内容
Welcome to zhonghangAlex's index
welcome to learn something
this message is created by zhonghangalex for testing status
这个时候我们可以进入git bash ,注意还是要处于这个git库的文件目录之下。
$ git status
可以看到下面的结果
进行了modifed提示,这个命令用来查看现在的git库状态,但它只能告诉你,你的哪个文件被改动了,那么怎么去查看具体做了什么样的修改呢?
$ git diff readme.txt
注意在这个命令的书写当中diff后面要加文件名,于是就有了下面的运行结果
我们可以很清楚得看到我们新增的这一条消息
在了解并确认好修改的内容之后就可以,就可以按照add 和commit两步进行文件的库提交了
$ git add readme.txt
$ git status
$ git commit -m "add a note"
$ git status
每执行一步命令我们都可以通过$ git status去查看git库状态,运行的结果如下:
此时我们就可以看到readme.txt这个文件成功提交了,但是,由于我们之前的操作,在git目录下形成了一个readme.txt.bak的文件,所以我们可以直接通过 "$git add ."这个命令进行全部添加,最后完成commit,于是就形成了一个干净的工作树
版本管理综述
做完一次修改之后,我们紧接着进行再进行一次修改增加一句
this is my git
接着完成相应的提交操作
然后我们开始进入到真正意义上的版本控制。
从readme.txt这个文件的创建,到我们进行了两次修改,我们怎么去进行每个版本的控制呢?
事实上我们可以通过$ git log 这个命令进行git 日志的查看(--pretty=oneline这个参数可以使得输出更简洁)
$ git log
下面就会打印出日志的内容:
在打印的数据中,我们看到的长串字符,是commit id的版本号,git的commit id是一个SHA1计算出来的非常大的数字,用十六进制表示。现在我们要进行一个版本的还原操作,就可以使用git reset命令
$ git reset --hard HEAD^
至于为什么要在reset后面加 --hard在后面的内容中会机继续介绍,这里直接用即可
此时我们看到文本中的内容也已经被还原了
但是这个命令执行之后,你会发现你的log日志中,没有了关羽最后一次的记录,要想恢复该怎么办呢?如果你之前的命令行没有关闭的话,就可以找到这个版本的commit id 只需要找到前几位就可以了,git会自动帮你找到
其实这里的HEAD是git内部的一个指针,在各个版本控制的时候,git只是改变了HEAD的指针指向地址。
但如果在你进行恢复上一次版本的操作后,关闭了命令行,甚至关闭了计算机,却希望再一次回到最新的版本,没有了命令行已经输入过的commit id 那该怎么办,其实我们的每一条命令都被git记录,通过git reflog这个命令,我们可以查看到这个commit id
所有操作基于的commit id都被记录了,然后我们就可以继续按照之前的操作,通过commit id 进行版本的前置还原了
什么是工作区,什么是暂存区 ?
其实说回来,git add ,git commit 分部操作,并不是繁琐,在git的版本控制中,我们能看到的目录,你实际进行操作的文件资源管理器,是git的工作区,而通过git add或者git add .的操作之后,文件就被提交到了git的暂存区,最后的git commit命令则是将所有的内容提交到分支(master)
还有一个需要注意的地方,git管理的是修改,比如你再readme.txt文件中添加了一句话,然后再运行git add .命令,然后再添加一句话,然后再运行 git commit 命令,此时使用git status查看状态,会发现第二次的修改并没有被提交。
提交后,用git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别:
$ git diff HEAD --readme.txt
撤销修改
那么在完成工作区的修改之后,有些时候我们发现修改错了,想恢复到之前的内容,那么我们可以先通过git status查看下git状态
git会提醒你使用git checkout --<file> 取消这次工作区的修改
$ git checkout --readme.txt
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
但是如果你做了一次修改,而且使用了git add 把文件添加到了暂存区,应该如何撤销修改呢?
$ git reset HEAD <file>
这样就可以使得已经添加到git暂存区的文件回到工作区
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。HEAD其实就是指向各个库版本的指针。
这个时候再使用 git status查看,会发现你的暂存区是干净的,工作区有修改,
那么还记得怎么丢弃工作区吗?
$ git checkout -- readme.txt
$ git status
最后发现工作树终于干净了 。
那么扯了这么一大堆, 最后就留下删除了,其实如果你是在文件管理器中误删了某个文件,和修改是一样的,在工作区和在暂存区的两套方法一样适用。