咱们在上一节介绍了git及一些简单的配置,具体在各个平台上(如Linux、windows)的安装,能够参考廖雪峰老师的博客上的文章(传送门)html
版本库,又名仓库,英文名:repository,咱们能够把它当作是一个目录,git能管理这个目录里的全部文件,包括对这些文件的修改、删除的跟踪。git
建立版本库很简单,假设咱们须要新开发一个项目,那么咱们首先建立一个新的目录,做为这个项目的工做区vim
上面咱们建立项目目录gitTest并进入这个目录。windows
执行 git init 命令,在当前工做目录建立git,那么在当前目录下就会有一个隐藏的.git目录,全部的记录都会在这个目录中。测试
接下来咱们直接建立一个测试的html文件,并用vim进行编辑,写入html基本结构,保存后退出,如今这个index.html是没有被跟踪的spa
咱们使用 git add index.html 命令来说刚建立的index.html文件添加到暂存区,这时咱们尚未将新建的文件提交到仓库,只是放在了暂存区指针
OK,接下来咱们把这个新的文件提交到仓库htm
咱们能够看到,index.html已成功提交到了仓库,在 git commit 后面加上了-m参数,后面写上这次提交的说明,这是很是有必要的。开发
好了,接下来咱们对index.html作出修改,向HTML文件里添加一个p标签,并写入一些信息,而后咱们使用 git status 来查看下当前文件状态,结果以下:get
上面第一排的On branch master表示咱们正在master分支上,下面的红色部分说明index.html已被修改
如今咱们把修改添加到暂存区,以后再次查看下当前状态
红色部分没有了,这表示修改已提交到了暂存区,接着咱们把它提交到仓库并附上说明
如今有个问题,若是咱们对文件作了更改,但没有提交,而咱们又想知道文件到底作了哪些更改呢?咱们再次为index.html添加第二个p标签,并写入一些内容
当咱们对index.html再次作出更改后,咱们用 git diff 命令来查看最近有些更改
从上图能够看出,第二个p标签前面有个+号,表示这段代码是咱们后面加入的,但并无提交,好了咱们知道了上次对文件作了哪些更改,就能够对更改后的文件作提交了
咱们来试想下,上面显示了一个建立和两次对文件内容的更改(添加),并且内容都不多,若是咱们在几个月内对一个或多个文件作了成百上千此更改呢?有谁会记得这些,好了,咱们可使用 git log 来查看历史修改记录
能够看到咱们每次在修改以后提交到仓库的动做,都记录在这里,不过好像有点不太清楚,OK,咱们在命令后面加上参数 --pretty=oneline
这样就舒服多了,如今咱们来作回退的工做,若是最近一次的修改你并不满意,但修改量很大,并且也记不清是哪些地方作了修改,咱们就使用 git reset 来回退到上一个版本,那么要回退,必需要让git知道咱们须要回退到那个版本,在git中,HEAD 用来表示当前版本,上一个版本使用 HEAD^ 表示,上上一个版本使用HEAD^^表示,那100个呢?不是要写100个^?呵呵,像这样的状况咱们使用 HEAD~100 来表示。好,咱们如今来把index.html的内容回退到上一个版本,在作这个操做以前,咱们先使用cat index.html来查看下当前index.html的内容是怎样的。
接着咱们使用git reset --hard HEAD^来回退到上一个版本
好了,没有错误提示,咱们再次查看下index.html的内容,发现文件内容已回退到了上一个版本,也就是没有第二个P标签的时候
完成上面的操做后,咱们回到了咱们但愿的版本,次日一睡醒,完了,后悔了,这么办?这个好办,咱们使用命令 git reflog 来查看咱们的每次操做
能够看到,咱们作的第三次操做的commitid是:469e0de,好了,有这个就好办了,咱们再次执行 git reset --hard 469e0de
再次cat一下index.html的内容
看到了吗?刚刚的第二个p标签又回来啦!
就是你在电脑里能看到的目录,好比个人gitTest文件夹就是一个工做区
工做区有一个隐藏目录 .git,这个不算工做区,而是Git的版本库。
Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支 master,以及指向 master 的一个指针叫HEAD
咱们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用 git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用 git commit提交更改,实际上就是把暂存区的全部内容提交到当前分支。
由于咱们建立Git版本库时,Git自动为咱们建立了惟一一支 master 分支,因此,如今,git commit 就是往 master 分支上提交更改。
你能够简单理解为,须要提交的文件修改统统放到暂存区,而后,一次性提交暂存区的全部修改。
Git管理的是修改,而非文件,好比新增是一个修改,删除也是一个修改,更改了某些字符也是一个修改,删了一些又加了一些也是一个修改,甚至建立一个新文件也算一个修改。
好比有一个文件,咱们第一次作了修改,而后 git add 了,这时咱们再次作了一次修改,并无add,而是直接 git commit 了,git diff下就能够看到,git commit 是将暂存区的修改提交到了仓库,而第二次的修改并无 add 到暂存区,因此看到的只是第一次修改的结果。
咱们也可使用 git diff -- index.html 这样的命令来查看工做区与仓库之间的文件差别,若是没有返回结果,那么这两处的结果是同样的。
当咱们的工做量很大时,必须会在编写代码时出错,这时,咱们来分析下下面的几种状况:
一、咱们写错了代码,并无提交到暂存区,也就是没有执行 git add 操做,这时你发现了错误,OK,咱们执行 git checkout -- file 命令,撤销工做区的修改,返回到跟暂存区版本一致。
二、咱们写错了代码,并且已经提交修改到了暂存区,但没有commit,这时,咱们执行 git reset HEAD file ,丢弃暂存区的修改,这样就返回到了上面的阶段,而后再次执行上面的 git checkout -- file就能够了。
三、咱们写错了代码,不但提交到了暂存区,并且已经commit了,这时,能够参看上面的版本回退部分,不过前提是没有提交到远程仓库。
6、删除文件
在Git中,删除也是一种修改操做,下面咱们用一个实例来讨论下。首先咱们建立一个test.txt文件,并把它提交到仓库
这时,咱们直接在工做区将这个文件删除
咱们使用 git status 来查看下
git告诉咱们,test.txt已被删除了,由于它发现了工做区和版本库的不一致了,这时,咱们有两个选择,一是直接删除版本库里的test.txt ,另一种就是删错了,要从版本库里恢复
下面,咱们首先来恢复被误删的test.txt,使用 git checkout -- test.txt 命令
被删除后,项目目录里没有test.txt,当咱们恢复文件后,就出如今目录里了
若是咱们肯定要删除,那么咱们可使用 git rm 命令来执行删除操做