上篇文章我们简单的介绍了 Git 的诞生和发展,然后也说了 Windows 环境下 Git 的安装和一些基本的配置,本文我们就来说一说 Git 中的一些基本概念和基本操作。
本文是 Git 系列的第二篇,了解前面的文章有助于更好的理解本文:
1.Git 概述
# 工作区和暂存区
和 Svn 有很大的不同,Git 中引入了暂存区/缓存区 (Stage/Index) 的概念,如下图:
- 工作区很好理解,就是我们能看到的工作目录,就是本地的文件夹。
- 这些本地的文件夹我们要通过 git add 命令先将他们添加到暂存区中。
- 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》
← Git 概述 Git 中的各种后悔药 →