1、版本控制系统
1.1、集中化的版本控制系统
一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新
1.2、分布式的版本控制系统
客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来
2、三种状态
Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)
- Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
- 工作目录是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
- 暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。有时候也被称作`‘索引’‘,不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
1. 在工作目录中修改文件。
2. 暂存文件,将文件的快照放入暂存区域。
3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
3、文件状态
请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
4、常用命令
这里用到了如下几个命令:
git status:查看工作目录的状态
git add 文件名:将文件添加到暂存区。暂存区就是下次要提交的文件列表。
git commit:提交到本地仓库
git log:查看所有的历史记录
本例中用到了两个新命令:
git checkout -- 文件名:丢弃工作目录的改变
git diff:查看当前工作目录和暂存区快照之间的差异
如果想要查看暂存区中的和上一次提交之前的差异,可以使用git diff --staged
git diff 比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容
git diff --staged 比较已暂存的文件和上一次已经之间的差异
现在各个地方的文件是这样的
所以,从这里我们就可以清晰的知道:git diff命令不加任何参数的时候比较的是未暂存的和已暂存的文件之间的差异,而加上--staged选项之后比较的时候下一次提交与已经提交的之前的差异或者说比较的是以暂存和已提交之间的差异。
小结:
git diff 比较未暂存和已暂存之间的差异
git diff --staged 比较已暂存和已提交之间的差异
接下来,再好好理解一下暂存区的作用
本例中,最开始git status的时候是一个已暂存一个未暂存,执行git commit以后再看git status竟然还有未暂存的。说明,git commit提交的是暂存区中的内容,未暂存的内容不会被提交。同时也进一步证明,暂存区相当于下一次提交的文件列表。如果想要跳过暂存区,可以在git commit后面加-a选项。
移除文件
git rm 文件:从暂存区中删除,并删除工作目录中的文件
git rm --cached 文件:只是从暂存区中删除,不会删除工作目录中的文件
git log查看日志
撤销操作
参考《progit-zh-v2.1.1.pdf》