2

上篇文章我们简单的介绍了Git的诞生和发展,然后也说了Windows环境下Git的安装和一些基本的配置,本文我们就来说一说Git中的一些基本概念和基本操作。

本文是Git系列的第二篇,了解前面的文章有助于更好的理解本文:


1.Git概述


工作区和暂存区

和Svn有很大的不同,Git中引入了暂存区/缓存区(Stage/Index)的概念,如下图:

图片描述

1.工作区很好理解,就是我们能看到的工作目录,就是本地的文件夹。
2.这些本地的文件夹我们要通过git add命令先将他们添加到暂存区中。
3.git commit命令则可以将暂存区中的文件提交到本地仓库中去。

在Svn中我们都是直接将文件提交到版本仓库中去,而在Git中,则多了一层关卡。

基本操作

下面我主要介绍一下Git中的常见操作。

初始化仓库

仓库的初始化有两种方式:一种是直接从远程仓库克隆,另一种则是直接从当前目录初始化,这里我们主要介绍当前目录初始化,远程仓库克隆我们在后面的文章中会说到。从当前目录初始化的方式很简单,直接执行如下命令:

$ git init

执行完成后当前目录下会多出一个.git的隐藏文件夹,所有git需要的数据和资源都存放在该目录中。

查看仓库状态

我们可以通过git status命令来查看仓库中文件的状态,比如,在我们仓库刚刚初始化完成之后,我们执行git status命令,执行效果如下:

图片描述

执行结果首先展示了我们当前处于master分支下,然后又说暂时没有东西可以提交,因为当前仓库中还没有记录任何文件的任何状态。此时,我在当前目录下创建一个名为git01.txt的文件,然后再执行git status命令,如下:

图片描述

此时执行结果中显示有一个未被追踪的文件就是我们刚刚添加的git01.txt,这个表示该文件目前并未被git仓库所管理,所以接下来我们要将这个文件添加到暂存区。

添加文件到暂存区

git add命令可以将一个文件添加到暂存区,我们现在已经有一个git01.txt文件了,接下来,执行如下命令将文件添加到暂存区中:

$ git add git01.txt

文件添加到暂存区之后,我们再执行git status命令,可以看到如下结果:

图片描述

文件提交到暂存区之后,我们看到此时的状态已经发生了变化。

提交到本地仓库

当文件提交到暂存区之后,此时我们可以通过git commit命令将当前暂存区的文件提交到本地仓库,如下:

图片描述

注意,执行commit命令时,我们需要加上提交备注,即-m参数,提交成功之后,我们再执行git status命令,结果如下:

图片描述

此时一切又恢复宁静了,没有需要add的东西,也没有需要commit的东西。

如果我们要写的备注非常多,我们可以直接执行git commit命令,此时会自动打开一个vi编辑器,我们直接在编辑器中输入备注信息即可。假设我在git01.txt中随意添加一行内容,然后依次执行git add、git commit命令,此时系统会自动打开一个vi编辑器,如下:

图片描述

如图所示,我们在vi编辑器中按照既定的格式编辑内容,编辑完成之后保存退出,此时文件就commit成功了。如果在备注信息编辑的过程中我们不想提交了,则直接删除备注信息,保存退出,此时提交就终止了,如下:

图片描述

提交成功之后,我们可以通过如下命令修改提交备注:

git commit --amend

运行该命令,会自动打开vi编辑器,此时我们可以重新编辑上次提交的备注信息。

查看提交日志

通过git log命令我们可以查看以往仓库中提交的日志,比如提交的版本号、提交者、提交者邮箱、提交时间、提交备注等信息,如下:

图片描述

有的时候我们要查看的命令并不用这么详细,可以在git log后面加上--pretty=short,这样显示出来的就只是简略信息了:

图片描述

此时显示出来的是我们这个仓库中的所有日志信息,如果我只想查看某一个文件的提交日志,在git log后面加上文件名即可。如下:

图片描述

如果我还想查看提交时文件的变化,加上-p参数即可,如下:

图片描述

绿色的+表示新增的行,红色的-表示删除的行(当然这里没有删除的行)。

但是git log有一个局限性,就是不能查看已经删除的commit的日志,举个例子:下班了,我发现今天下午提交的代码全都是有问题的,于是做了一个版本回退,回退到今天早上的状态,然后关机回家,第二天来了后我发现搞错了,其实那些代码都是OK的,于是我又想让仓库版本前进到昨天下午的状态,却发现git log命令查看不到昨天下午提交的版本号。此时,我们可以使用git reflog命令来实现这一个请求,git reflog命令可以显示整个本地仓库的commit, 包括所有branch的commit, 甚至包括已经撤销的commit, 只要HEAD发生了变化, 就会在reflog里面看得到,而git log只显示当前分支的commit,并且不显示删除掉的commit。如下图:

图片描述

查看更改前后的差异

使用git diff命令我们可以查看工作区和暂存区的区别以及工作区和最新提交的差别。我往git01.txt文件中再添加一行hello world,此时执行git diff命令,结果如下:
图片描述

此时这里显示我们新增了一行。此时我们执行git add命令,将文件提交到暂存区,然后再执行git diff,如下:

图片描述

此时没有任何信息输出,因此此时工作区的内容和暂存区的内容已经保持一致了。但是此时工作区和本地仓库中最新提交的内容还是不一致,我们可以通过git diff HEAD命令来查看,如下:

图片描述

此时我们需要执行git commit命令将暂存区中的文件提交,提交成功之后,再执行git diff HEAD命令,则又恢复宁静了。如下:

图片描述

压缩提交历史

git rebase -i命令可以实现提交历史的压缩。比如我们在开发某一个功能时,提交了很多次,当所有功能都写完时,想将这些提交压缩为一个,就可以使用该命令,如下:

图片描述

如上图,该命令执行之后,会自动打开一个vi编辑器,在vi编辑器中将最新提交的日志的pick改为fixup即可。压缩之后,最新一次的提交日志就没了,但是数据还在。

OK,Git基本操作我们就先说这么多,有问题欢迎留言讨论。

参考资料:

1.《GitHub入门与实践》
2.《Pro Git》

更多JavaEE和Git资料请关注公众号:

图片描述


江南一点雨
9.1k 声望7.6k 粉丝

《Spring Boot+Vue全栈开发实战》作者


« 上一篇
Git概述