zoukankan      html  css  js  c++  java
  • GIT入门笔记(1)- Git的基本概念

    一、概念和定义

    1、git是什么

    许多人习惯用复制整个项目目录的方式来保存不同的项目版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单。不过坏处也不少:有时候会混淆所在的工作目录,一旦弄错文件丢了数据就没法撤销恢复。

    为了解决这个问题,人们很久以前就开发文件版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。

    文件版本控制系统 是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。

    CVS及SVN是一种集中式的版本控制系统,Git 是一个分布式的版本控制和源代码管理系统。

    Git 最初由Linus Torvalds为管理Linux内核代码开发而设计开发,后来很多自由软件项目也使用了 Git。

    2、集中式版本控制系统 - CVCS 

    集中式版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这 已成为版本控制系统的标准做法。

    这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。

    集中式版本控制系统最大的毛病就是必须:

    • 开发人员必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,提交代码很慢,工作效率很低。
    • 中央服务器出现故障也会导致开发人员无法工作,宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要 是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就还是会有丢失数据的风险。

    3、分布式版本控制系统

    在分布式版本控制系统中,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜 像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份

    更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。

    4、分布式版本控制系统与集中式版本控制系统比较

    首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

    既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

    和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

    在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。

    因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

    分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。

    二、GIT的特别之处

    Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。

    1、关注文件数据整体的变化

    1.1、其他版本控制系统

    这类系统 (CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容

    1.2、git版本控制系统

    Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。

    每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照 的索引。

    为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

    这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。

    Git 更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不只是一个简单的 VCS。

    2、近乎所有操作都是本地执行

    在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用 CVCS 的话,差不多所有操作都需要连接网络。因为 Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。

    举个例子,如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。

    如果想要看当前版本的文件和一个月 前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。

    3、使用内容校验和保持数据完整性

    在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。

    换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。

    所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。

    Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。

    该字串由 40 个十六进制字符(0-9 及 a-f)组成,如:24b9da6552252987aa493b52f8696cd6d3b00373 

    Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。

    三、重中之重:Git 基础

    1、Git内文件的三种状态

    Git 内的文件有三种状态:

    • 已提交(committed):表示该文件已经被安全地保存在本地数据库 中了;
    • 已修改(modified):表示修改了某个文件,但还没有提交保存;
    • 已暂存(staged):表示把已修改的文件放在下次提交时要保存的清单中。

    由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。

    2、Git的本地目录

    2.1、Git目录

    每个项目都有一个 Git 目录(译注:如果 git clone 出来的话,就是其中 .git 的目录;如果git clone --bare 的话,新建的目录本身就是 Git 目录。),它是 Git 用来保存元数据和对象数据库的地方。

    该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。

    2.2、工作目录

    项目开发过程中,我们会从Git目录中取出某个版本的所有文件和目录,用以开始后续工作,这个时候创建的目录叫做工作目录。

    工作目录的文件实际上都是从 Git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。

    2.3、暂存文件

    所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中。

    有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。

    3、基本的 Git 工作流程

    • 1. 在工作目录中修改某些文件。 --------------------------------------------------------已修改状态(工作目录内容变了)
    • 2. 对修改后的文件进行快照,然后保存到暂存区域。------------------------------已暂存状态(暂存区记录了变化)
    • 3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。---------已提交状态(Git目录记录了变化,远端服务器还是没有的)
  • 相关阅读:
    JAVA不可变类(immutable)机制与String的不可变性
    如何高效学习
    [细品java]ThreadLocal源码学习
    Spring 入门知识点笔记整理
    spring远程服务知识梳理
    Spring Security 入门详解
    Selenium 安装 geckdriver Firefox 对应关系 历史版本下载
    Redhat linux 下 Jmeter 非GUI界面执行压力测试
    Spring Boot 进程守护 修改启动端口号 Spring Boot 监听端口被占用无法启动
    Redhat Linux 部署maven环境
  • 原文地址:https://www.cnblogs.com/lexiaofei/p/GIT.html
Copyright © 2011-2022 走看看