一:前言
Git的定义是:分布式版本控制系统,用于项目开发中的版本控制。
从本质上来讲 Git 是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。
Git 的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索(retrieve)该内容。
git管理的项目工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。
已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。
工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。
初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。在进行提交操作时,Git 会保存一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针。 但不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。
二:git存储
git将项目的存储分为4部分,每部分有自己作用,见下图:

Workspace
:工作区(当前用户操作修改的区域)Index / Stage
:暂存区 (add后的区域)Repository
:仓库区或本地仓库(commit后的区域)Remote
:远程仓库(push后的区域)
整体过程可以简述为:
- 工作区–>add–>暂存区–>commit–>本地仓库区–>push–>远程仓库区
- 远程仓库区–>fetch–>使用refsremotes下对应分支文件记录远程分支末端commit_id–>merge–>工作区 和 本地仓库区
- 远程仓库区–>pull–>使用refsremotes下对应分支文件记录远程分支末端commit_id and 本地仓库区 and 工作区
git pull和git fetch有什么不同呢?下面简单说一下
想要知道他们得不同,我们需要先了解两个概念
- FETCH_HEAD:可以看做是一个版本链接,记录在本地的refsremotes下对应分支文件中,指向着目前已经从远程仓库取下来的分支的最新版本的commit_id。
- commit-id:在每次本地commit来保存当前工作到本地仓库区后, 会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程仓库。
所以他们之间的不同在于:
- git pull 直接将远程分支的修改更新到本地仓库区和本地工作区,我们就可以在本地工作区中看到最新代码
- git fetch 只将远程分支的修改更新到FETCH_HEAD,记录远程分支最新的commit_id,不会更新本地工作区和本地仓库区代码,只有使用了git merge 才会将提交更新到本地仓库区和工作区
在git status中
的体现,见下图:

- Changes to be committed::代表被add的文件,被加载到了暂存区
- Changes not staged for commit:代表在当前分支中被修改的文件,还没有被add,存储在工作区
- Untracked files :代表不被git追踪的文件,可以理解为不被git管理的文件
- 如果没有Changes to be committed和Changes not staged for commit说明现阶段所有的修改已经被commit到本地仓库
- 如果git status后出现下述情况,说明还有已经的commit到本地仓库的还未被push到远程仓库
$ git status
On branch network-master
Your branch is ahead of 'origin/network-master' by 2 commits.
(use "git push" to publish your local commits)
Git 作为一个系统,是以它的一般操作来管理并操纵(HEAD、index、Working Directory)三棵树的
HEAD: 是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点。 通常,理解 HEAD 的最简方式,就是将它看做 你的上一次提交的快照。
index: index索引是你的 预期的下一次提交。 我们也会将这个概念引用为 Git 的 “暂存区域”,这就是当你运行 git commit 时 Git 看起来的样子。Git 将上一次检出到工作目录中的所有文件填充到索引区,它们看起来就像最初被检出时的样子。 之后你会将其中一些文件替换为新版本,接着通过 git commit 将它们转换为树来用作新的提交。
Working Directory:最后,你就有了自己的工作目录。 另外两棵树以一种高效但并不直观的方式,将它们的内容存储在 .git 文件夹中。 工作目录会将它们解包为实际的文件以便编辑。

三:git提交规则
首先,有个问题需要确认一下,提交信息是使用中文还是英文呢?
如果