首页 > 代码库 > Git学习笔记(一)

Git学习笔记(一)

版本控制系统简介

版本控制系统是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。该系统不仅可以度软件源代码的文本文件进行版本控制管理,也可以对任何其他类型的文件进行版本控制。有了版本控制系统,我们便可以将某个文件回溯到之前的状态,甚至将整个项目都回溯到过去的某个时间点的状态;我们可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而导致出现怪异的问题,又是谁在何时报告了某个功能缺陷等等。

版本控制系统的种类

1.      集中化版本控制系统CVCS(Centralized Version Control Systems): 如CVS, Subversion, Perforce等。这类系统有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人都通过客户端连接到这台服务器,取出最新的文件或者提交更新。

优点:每个人都可以在一定程度上看到项目中其他人正在做些什么,而管理员也可以轻松掌控每个开发者的权限,并且管理一个CVCS远比在各个客户端上维护本地数据库容易。

缺点: 中央服务器的单点故障。如果中央服务器出现故障,如中央服务器磁盘发生故障、死机等,都可能导致无法提交更新和数据丢失等问题。

2.      分布式版本控制系统DVCS(Distributed Version Control System): 如Git, Mercuril, Bazaar, Darcs等。客户端不只是提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这样以来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。

Git简介

Git是由Linux鼻祖Linus Torvalds开发的,用于管理Linux的内核代码,并具有速度飞快、设计简单、对非线性开发模式强力支持(允许上千个并行开发的分支)、完全分布式、有能力高效管理类似Linux内核一样的超大规模的项目。

Git特性

1.      直接记录快照,而非差异比较: Git只关心文件数据的整体是否发生变化,而大多数其他系统只关心文件内容的具体差异,这类系统(CVS, Subversion, Perforce, Bazaar等)每次记录哪些文件做了哪些更新。而Git并不保存这些前后变化的数据差异,而是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵让览以便所有文件的指纹信息并对文件作以快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git不会再次保存,而只对上次保存的快照作一链接。Git工作方式如下:

                                                                                     

   svn工作方式如下:

                                                              

2.      近乎所有操作都是本地执行: Git的绝大多数操作都只需要访问本地文件和资源,不用连网。因为Git在本地磁盘

上就保存这所有当前项目的历史更新,所以处理起来速度飞快。用CVCS的话,没有网络或者断开VPN便无法做和任何事。但用Git的话,没有网络时可以频繁地提交,到有网络时再上传到远程仓库。

  3.时刻保持数据完整性: 在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为

数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。

4. 多数操作仅添加数据: 常用的Git操作大多仅仅是把数据添加到数据库中。因为任何一种不可逆的操作,比如删除数据,都会使回退或重现历史版本变得困难重重。在别的VCS中,若还未提交更新,就有可能丢失或者混淆一些修改的内容,但在Git里,一旦提交快照后就完全不用担心丢失数据,特别是养成定期推送到其他仓库的习惯的话。

基本的Git工作流程

1.      在工作目录中修改某些文件

2.      对修改后的文件进行快照,然后保存到暂存区域

3.      提交更新,将保存在暂存区域的文件快照永久转储到Git目录中

获取项目的Git仓库的两种方法

1.      在现存的目录下,通过导入所有文件来创建新的Git仓库。即进入到项目所在的目录,执行$git init语句。初始化后,在当前目录下会出现一个名为.git的目录,所有Git需要的数据和资源都存在这个目录中。不过目前,仅仅是按照既有的结构框架初始化了里边所有的文件和目录,但还没有开始跟踪管理项目中的任何一个文件。当用git add命令add项目中的文件数据时,Git便开始对这些文件数据进行跟踪管理。

2.       从远程服务器现有仓库中克隆,使用的命令格式为git clone<url>,如: $git clonegit://github.com/schacon/grit.git。这便会当前目录下创建一个名为“grit”的目录,其中包含一个.git的目录,用于保存下载下来的所有版本记录,然后从中取出最新版本的文件拷贝。同时,gerit目录下还包含该项目中的所有文件。需要注意的是,刚从远程服务器中clone出代码仓库时,git处于本地master分支上,而该本地master分支上是没有数据的,要获得数据(远程代码仓库中的数据),需要切换到远程代码仓库中的分支上;或者,将远程代码仓库上的分支合并到本地master分支上,这样以来,本地master分支便有了项目的所有文件数据。如果希望在克隆的时候,自己要定义新建的项目的目录名称,可以在clone命令后面指定新的名字,如:$git clone git://github.com/schacon/grit.git MyGrit。    

忽略某些文件

如果不希望某些文件总出现在未跟踪的文件列表中,如自动生成的日志文件、编译过程中创建的临时文件等,我们可以将这些文件不纳入Git的管理中。这可通过定义一个名为.gitignore的文件,文件中列出要忽略的文件模式。文件爱你.gitignore的格式规范如下:

● 所有空行或者以注释符号#开头的行都会被Git忽略。

    ● 可以使用标准的glob模式匹配。*匹配模式最后跟反斜杠(/)说明要忽略的是目录。*要忽略指定模式以外的文件或目录,可以在模式前加上感叹号(!)取反。

例如:

    # 此为注释 – 将被 Git 忽略

*.a         # 忽略所有 .a 结尾的文件

!lib.a       # 但 lib.a 除外

/TODO     # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO

build/      # 忽略 build/ 目录下的所有文件

doc/*.txt    # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

gitdiff简介

  git diff用于查看已暂存和未暂存的更新。不仅能列出哪些文件被修改过,还能列出当前做的哪些更新还没有暂存,哪些更新已经暂存起来准备好了下次提交,同时还会以文件补丁的格式显示具体添加和删除的行。&git diff比较工作目录中当前文件和暂存区域快照之间的差异,&git diff –cached 或 $git diff –staged比较已经暂存起来的文件和上次提交时的快照之间的差异。

Git学习笔记(一)