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

Git学习笔记(一)

版本号控制系统简单介绍

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

版本号控制系统的种类

1.      集中化版本号控制系统CVCS(Centralized Version Control Systems): 如CVS, Subversion, Perforce等。

这类系统有一个单一的集中管理的server,保存全部文件的修订版本号,而协同工作的人都通过client连接到这台server,取出最新的文件或者提交更新。

长处:每一个人都能够在一定程度上看到项目中其它人正在做些什么,而管理员也能够轻松掌控每一个开发人员的权限,而且管理一个CVCS远比在各个client上维护本地数据库easy。

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

2.      分布式版本号控制系统DVCS(Distributed Version Control System): 如Git, Mercuril, Bazaar, Darcs等。client不仅仅是提取最新版本号的文件快照,而是把原始的代码仓库完整地镜像下来。这样以来,不论什么一处协同工作用的server发生问题,事后都能够用不论什么一个镜像出来的本地仓库恢复。由于每一次的提取操作,实际上都是一次对代码仓库的完整备份。

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.       从远程server现有仓库中克隆,使用的命令格式为git clone<url>,如: $git clonegit://github.com/schacon/grit.git。这便会当前文件夹下创建一个名为“grit”的文件夹,当中包括一个.git的文件夹。用于保存下载下来的全部版本号记录。然后从中取出最新版本号的文件拷贝。同一时候,gerit文件夹下还包括该项目中的全部文件。须要注意的是。刚从远程server中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学习笔记(一)