说明:
本文献给对版本控制不太熟悉(甚至不太熟悉编程)而又急需使用Git的同学,希望能够对Git的基本操作建立起一个直观的感受。内容主要来源于Pro Git一书的第二章。
什么是版本控制
Git是一种版本控制工具。什么是版本控制呢?我们来看一张图:

这张图反应了一个很常见的问题。我们经常需要对一个文件进行修改,而又不敢轻易舍弃之前的版本。版本控制工具可以帮我们解决这一问题,通过Git可以随时切换回之前的版本。
关于Git是如何实现版本控制的,它的优势是什么以及还有那些其它的作用,就不在这个入门篇里介绍了。
创建一个Git项目
在这里我们先不涉及从服务器克隆仓库,而是在本地文件夹创建。
- 为了方便起见,我们首先创建一个新文件夹
gitlearn, 然后进入这个文件夹执行命令
git init
这时终端会返回
Initialized empty Git repository in /Users/xiaoying/gitlearn/.git/
这意味着我们在该项目中创建了一个git仓库。注意,这个仓库是在本地的。实际上,Git的大部分操作都在本地完成,由于使用Git时通常需要把文件上传到远程服务器上,所以初次接触时可能会误认为服务器上的才是仓库,因此对各种命令产生误解。
如果在当前文件下使用
ls -a
会看到一个.git文件。
- 随便复制几个文件到之前的目录中,然后在终端输入
git add .
git commit -m 'initial project version
其中,git add .将所有的文件加入追踪中,而git commit -m 'initial project version则将它们存入仓库中。
至此,一个Git管理的项目就基本创建完成了。
Git的状态
在下一次介绍Git的命令之前,首先要对文件的各种状态有一个清楚的认识。
Git文件的三种状态
- 已提交(committed):表示数据已经安全的保存在本地数据库中
- 已修改(modified):表示文件进行了修改,但是还没有保存到数据库中
- 已暂存(staged):表示对一个文件的当前版本做了标记,使之包含在下一次提交快照中
由于文件的这三种状态,导致了Git项目的三个工作区域。
Git项目的三个工作区域
- Git仓库:Git仓库目录是Git用来保存项目的元数据和对象数据库的地方。这是Git中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
- 工作目录:工作目录是对项目的某个版本独立提取出来的内容。也就是你在文件夹中看到的内容。
- 暂存目录:暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在Git仓库目录中。
追踪与未追踪
在工作目录中,由于文件不一定被git追踪,所以并非所有文件都处在三种状态中。但所有文件都只有追踪与未追踪两种状态。
- 以追踪的文件是是指在上一次快照中有记录的文件,它们被纳入版本控制中。工作一段时间后,它们的状态可能变为未修改,已修改或已暂存。
- 工作目录中除了以追踪之外的文件都属于未追踪。它们不会自动加入版本控制中。
示例
以上面创建的Git项目为例讲解这些状态。首先在文件夹中加入三个文件address,address.cpp,mnist.py。
- 在执行完
git init之后,可以使用
git status
来查看工作目录中文件的状态。

此时所有的文件都处于未追踪状态。Git仓库和暂存目录都没有文件。
- 执行
git add .(注意.前面的空格)之后
此时文件都被追踪,且处于已暂存状态。
git add .是一个多功能命令,既可以使未被追踪的文件开始被追踪,也可以将修改了的问价添加到暂存目录中。 - 执行
git commit -m 'initial project version后
所有文件都被提交,处于未修改状态。 - 如果此时对
mnist.py文件进行修改,同时创建一个新文件README
修改过的文件变为未修改状态,而新创建的文件不会被自动追踪。
总结
总之,Git中文件的状态是非常重要的。只有在清楚Git状态的基础上,才能明白以下几个概念,从而正确的使用各种命令:
- 配置并初始化一个仓库(repository)
- 开始或停止追逐(track)文件
- 暂存(stage)或提交(commit)修改
- 向远程仓库推送(push)
- 从远程仓库拉取(pull)


