感觉对Git讲解的比较好,翻译下来,便于自己学习和参考。对一些名词保留了英文。
1、Repository(仓库)包含的内容
Git的目标是管理一个工程,或者说是一些文件的集合,以跟踪它们的变化。Git使用Repository来存储这些信息。一个仓库主要包含以下内容(也包括其他内容):
(1) 许多commit objects
(2)到commit objects的指针,叫做heads
Git的仓库和工程存储在同一个目录下,在一个叫做.git的子目录中。
2、Commit objects
commit objects包含 三个部分:
(1) 一组文件的集合,代表工程在特定时间点上的一个状态。
(2)到父commit objects的指针
(3)一个SHA1名,一个40个字符的字符串,用来唯一标示commit object。这个名字是通过与commit objects相关的内容通过哈希运算得到的,因此,相同的commits具有相同的名字。
通常,一个commit object具有唯一的父commit object。但是在特殊情况下(如分支合并时),一个commit object也可能有多个父 commit object。
一个工程总是会有一个commit object没有任何的父commit object,这是对仓库的第一次 commit。
Git的核心思想就是操作所有的commit构成的图结构。
3、Heads
Heads仅仅是指向一个commit的指针。每个Head都有一个名字。默认情况下,在每个仓库下都有一个head,叫做master。一个仓库可以包含任意数量的heads。在任何时候,一个Head被选为“当前head”。这个head的别名为HEAD,每个字母都是大写。
"head"(全部小写)可以指仓库中的任意一个head,而"HEAD"(全部大写),仅仅指的是当前有效的head。
4、一个简单的仓库
要创建一个仓库,为该工程创建一个目录,进入该目录,运行命令 git init,这个目录不必是空目录。
mkdir [project]
cd [project]
git init
这样,就在[project]目录下创建了一个 .git目录
要建立一个commit,你要做以下事情:
(1)告诉Git这个commit包含那个文件,使用git add命令。如果一个文件在前一次commit之后没有改变,Git自动将这个文件添加到你要执行的commi中去。因此,你只需要添加你要添加或者是修改的文件。要注意,对目录的添加是递归进行的,因此git add将会添加任何的改变。
(2)调用git commit来创建一个commit object。新的commit object将会把当前的HEAD作为它的父亲(新的commit执行后,HEAD将会指向新的commit object)
使用git commit -a命令会自动添加所有修改的文件(新建的文件不包含在内)
要注意的是,如果你修改了文件,但是没有添加它,那么Git将会把之前版本的文件包含到这个commit中。
例如你创建了三个commit,你的仓库将会是这个样子:
----> time ---->
(A) <-- (B) <-- (C)
^
master
^
HEAD
(A)、(B)、(C) 分别为第一个、第二个和第三个commit。
其他的比较有用的命令:
(1)git log:列出所有从HEAD到初始commit的日志。(当然它的功能不止这些)
(2) git status:列出当前工程的状态和HEAD之间的那些文件发生了改变。文件有三中状态:新的没有被添加的文件(使用git add命令)、修改的但是没有被添加的文件、已经被添加的文件(即表明文件状态已经被记录)。
(3)git diff:列出HEAD和当前状态之间的差别。使用--cached选项,它可以比较新添加的文件之间的区别,否则,它比较没有被添加的文件。
(4)git mv和git rm分别用来标记要被删除或者重命名的文件,与git add类似
我的个人工作流程通常是这个样子:
(1)进行编程
(2)git status来查看我更改了哪些文件
(3)git diff [file]来查看我到底进行了哪些更改
(4)git commit -a -m [message]来创建commit
5、引用Commit:
现在你已经创建了一些commits,怎样引用一个特定的commit?Git提供了许多中不同的方法:
(1) 通过它的SHA1名字,你可以通过git log查看
(2)通过SHA1前面的几个字符
(3) 通过一个head。例如,HEAD指向当前commit。你也可以使用名字,如master。
(4)通过^符号。如HEAD^指向当前commit的父commit。