Git

作者: 柳清檀 | 来源:发表于2019-05-26 13:43 被阅读0次

    版本控制系统:

    指能随时间的推进记录一系列文件,以便于开发者以后想要回退到某个版本的系统。主要分为三类:本地版本控制系统、集中版本控制系统和分布式版本控制系统。

    本地版本控制系统(LVCS)

    指将文件的各个版本以一定的数据格式存储在本地的磁盘中,这种方式在一定程度上解决了手动复制粘贴的问题,但无法解决多人协作的问题。

    集中版本控制系统(CVCS)

    它与本地版本控制系统类似,但多了一个中央服务器,各个版本的数据存储在中央服务器,管理员可以控制开发人员的权限,开发人员也可以从中央服务器拉取数据。这解决了LVCS没有解决的多人协作问题,但由于数据集中存储,一旦服务器宕机或者磁盘损坏,会造成不可估量的损失。

    分布式版本控制系统

    与前两者不同,系统保存的不是文件变化的差量而是文件的快照,即把文件的整体复制下来保存,而不关心具体的变化内容。其次,由于分布式版本控制系统是分布式的,开发者从中央服务器拷贝下来代码时,拷贝的是一个完整的版本库,包括历史记录、提交记录等,这样即使某一台机器宕机也能找到文件的完整备份。

    Git

    Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。具有廉价的本地分支,便捷的临时区域和多个工作流程等功能。

    Git保存的是文件的完整快照,而不是差异变化或者文件补丁。每一次提交,Git保存的都是对项目文件的一个完整拷贝,因此开发者可以完全恢复到以前的一个提交而不会发生任何区别。如果文件没有变化,它只会保存一个指向上一个版本文件的指针,也就是说对一个特定版本的文件,Git只会保存一个副本,但可以有多个指向该文件的指针。而二进制文件像视频,图片等,Git也能管理,但不能取得较好的效果(压缩比率低,不能差异分析),Git占用空间几乎随着提交次数线性增长。

    工作区域

    Git工程有三个工作区域:工作目录、暂存区域和本地仓库。工作目录是当前进行工作的区域,文件修改但未提交,处于已修改状态(modified);暂存区域是运行git add命令后文件保存的区域,也就是下次提交要保存的文件,文件处于已暂存状态(staged);本地仓库即版本库,记录了工程提交的完整状态和内容,文件处于已提交状态(committed)。

    工作流程:在工作区域增加,删除或者修改文件-运行git add,将文件快照保存到暂存区域-提交更新,将文件永久版保存到版本库中。

    Git存储与SHA-1

    Git 从核心上来看不过是简单地存储键值对(key-value),value是文件的内容,而key是文件内容与文件头信息的 40个字符长度的 SHA-1 校验和。Git使用该校验和不是为了加密,而是为了数据的完整性,即使对文件进行了微小修改,也会计算出完全不同的 SHA-1 校验和。SHA-1 校验和就是文件的指针,Git将文件的 SHA-1 校验和作为指针目的是为了唯一区分不同的对象。

    Git中三个重要组件:commit,tree,blob

    tree对象类似于操作系统的目录:一个tree对象包含多个指向blob对象和tree对象的SHA-1指针,并包含对象的权限模式、类型和文件名信息等;
    blob对象类似于操作系统的文件;
    commit相当于一个顶层目录,指明了改时间点项目快照的顶层tree对象、作者信息等。除了第一次的commit对象,每个commit对象都有一个指向上一次commit对象的指针;

    当开发者对文件进行修改并提交时,变化的文件会生成一个新的blob对象,记录文件的完整内容,然后针对该文件有一个唯一的 SHA-1 校验和,修改此次提交该文件的指针为该 SHA-1 校验和,而对于没有变化的文件,简单拷贝上一次版本的指针即 SHA-1 校验和,而不会生成一个全新的blob对象。

    Git分支引用:

    最常见的引用:master(Git默认创建的)始终指向你项目主分支的最后一次提交记录。Git鼓励在工作流程中频繁使用分支与合并,它非常轻量级,不像其他的版本控制,Git创建分支是在瞬间完成的。

    Git本质上只是一棵巨大的文件树,树的每一个节点就是blob对象(保存文件的最基本的对象),而分支只是树的一个分叉。简单地说,分支就是一个有名字的引用,它包含一个提交对象的40位校验和,所以创建分支就是向一个文件写入 41 个字节(外加一个换行符)那么简单,所以自然就快了,而且与项目的复杂程度无关。

    • Git默认分支为master,创建分支:git branch [branch-name]
    • 切换分支只需要运行:git checkout [branch-name]

    分支合并:


    fast-forward
    借助公共祖先合并

    总结:

    • Git保存文件的完整内容,不保存差量变化。
    • Git以储键值对(key-value)的方式保存文件。
    • 每一个不同的文件或是相同文件的不同版本,都有唯一的40位的 SHA-1 校验和与之对应。
    • SHA-1 校验和是文件的指针,Git依靠它来区分文件。
    • 每一个文件都会在Git的版本库里生成blob对象来保存。
    • 对于没有变化的文件,Git只会保留上一个版本的指针。
    • Git实际上是通过维持复杂的文件树来实现版本控制的。
    • 使用Git的工作流程基本就是就是文件在三个工作区域之间的流动。
    • 应该大量使用分支进行团队协作。
    • 分支只是对提交对象的一个引用。

    琐碎点

    • 从Github上克隆代码到本地:可用Git GUI 选择源路径和目标路径
    • Git init-主板中选择create new repository设置版本库的位置
    • Git add-rescan-stage changed-commit
    • Git rm-commit-unstage from commit//可以撤销最后一次修改
    • Git branch与checkout:create可以新建分支,建好后就直接切换到新建的分支
    • Git commit-文件添加到staging的区域后需要输入描述就可以commit
    • Git merge-Merge-local Merge(如果有冲突需要解决冲突)
      解决冲突:Tools - add Tool - git mergetool -tool=winmerge
    • SSH授权:生成公钥私钥,私钥保留在本地,公钥上传到远程版本库
      Git config –global user.name “username”
      Git config –global user.email “userEmail”
      Ssh-keygen -t rsa -C”user.email”
      公钥生成后存放在:id_rsa.pub
    • Settings-collaborators添加共同开发的人员
    参考资料说明:软件工程基础课程材料

    相关文章

      网友评论

          本文标题:Git

          本文链接:https://www.haomeiwen.com/subject/lymmzqtx.html