Git 基本操作

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

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


1.Git 概述


工作区和暂存区

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

p166

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

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

基本操作

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

初始化仓库

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

1
$ git init

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

查看仓库状态

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

p167

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

p168

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

添加文件到暂存区

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

1
$ git add git01.txt

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

p169

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

提交到本地仓库

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

p170

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

p171

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

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

p172

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

p173

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

1
git commit --amend

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

查看提交日志

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

p174

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

p175

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

p176

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

p177

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

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

p201

查看更改前后的差异

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

p178

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

p179

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

p180

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

p181

压缩提交历史

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

p200

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

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

参考资料:

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

# Git

喜欢这篇文章吗?扫码关注公众号【牧码小子】【牧码小子】专注于 SPRING BOOT+微服务以及前后端分离技术,每天推送原创技术干货,关注后回复 JAVA,领取松哥为你精心准备的 JAVA 干货!

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×