Git与GItHub的关系
本文于2021年1月16日由AlvinCR更新
文章导引
一:背景
前两天写了搭建GitHub_Pages的文章,又用到了Git,不禁令人猜想GitHub和Git到底有什么关系,为什么Github要以此为名?
二:Git
1 基础知识
首先先来了解一下什么是Git。
git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。
2 Git特点
Git是一个分布式版本控制软件,仅此一句话我们便能看出:
- Git使用场景是分布式的,而非中心式管理,那么使用对象应该就是个人PC;
- Git的作用是对文件进行版本控制。
此外Git还有以下特点:
- git是用C语言开发的,以追求最高的性能。
- git能自动完成垃圾回收,也可以用命令git gc –prune直接调用。
- Git服务器典型的TCP监听端口为9418。
- Git使用packs操作使用差分压缩法将文件压缩入一个文件中(packfile),packfile与索引文件都用SHA-1作为校验和并作为文件名。
3 最大的优势
Git最大的优势是能够分步分时记录文件修改的内容,这对于保存历史文件,多人共同修改文件拥有不可比拟的优势。
(1)保存历史文件:由于Git只记录修改的内容,因此其它未修改的内容无需额外进行保存,节省了大量的存储空间。
(2)多人修改:假设alvincr今天写了一个程序,大神A看了看程序里面BUG满天飞,便拿走了一个备份修改BUG,alvincr自己看了看自己的程序确实是BUG堆积成山,自己也修改了一下。第二天大神A把修改好的程序传给了我,那么此时我必须要考虑一下我自己修改了什么地方,大神修改了什么地方,要如何将两者合并起来,这其中的辛酸一言难尽。使用Git则能够直接解决此类痛点,使用Git可以直接记录下修改的内容然后自动合并。
4 对比其它管理方式
与Git拥有同样效果的管理系统有CVS、Subversion以及Perforce,它们虽然在实现效果上与Git类似,但是实现的原理却截然不同。
以下内容总结自Git官网:https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-Git-%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F,其它参考:WIKI
- Git直接记录快照建立索引
CVS、Subversion、Perforce、Bazaar等管理方式:是基于差异(delta-based) 的版本控制,也就是说会查找两个文件(1V1)不同之处,仅记录两者的不同。
Git先根据所有初始文件建立索引(多V多),如果你添加了其它内容那么只建立你添加内容的索引。
个人理解:CVS相当于班主任,每个班主任负责记录各个班变化的情况,只有当出现变动的班级,班主任才会上报学校;Git相当于级部主任,每段时间记录整个级部的整体变化,只记录有变动的部分,然后上报学校。即:CVS对单个文件负责,Git对整体文件负责。
以下图片来自原文(如果自动添加水印还请原作者见谅):
使用CVS、Subversion、Perforce、Bazaar
使用Git
- Git几乎将所有文件储存在本地
在本地磁盘上就有项目的完整历史,不过多依赖网络。
- Git只能添加数据
由于只能添加数据,因此使用Git不会导致数据库数据误删,因此Git 基本不会执行任何可能导致文件不可恢复的操作。但是同别的VCS一样,未提交更新时有可能丢失或弄乱修改的内容。
5 补充:CVS瓶颈
原文:https://developer.ibm.com/zh/devpractices/devops/articles/os-cn-git-and-github-1/
代码库的存储和复制并非版本控制系统的瓶颈所在,分析文件的差异、查看代码库的各历史版本常常是真正的瓶颈所在。基于这种快照流的设计,Git 可以快速地获取到某一时刻的代码库所有文件,同时也可以快速地进行文件各个历史版本的差异比对,甚至是各历史版本或者各分支的代码库整体差异比对。想像一下如果是传统的增量存储方式,一个代码库经过长期的开发,假设代码库已经有 10 万个文件,每个文件平均经历了 100 次修改,那么要检索最新的代码库和原始的代码库的差异,就需要检索出 1000 万个增量才能最终成功比对,这需要难以想象的时间成本。而 Git 就不存在这个问题,Git 只需要检索出最新的代码库快照和原始代码库快照直接进行比对即可,再依托于 Git 的 diff 算法(Myers 算法),Git 可以高效快速地检索出二者的差异来。
三:GitHub
1 介绍
官网介绍:https://github.com/about
GitHub是全球最大的开源代码托管平台。(完)
2 功能
常见的选项
新建仓库相当于在硬盘上新建一个文件夹,这个文件夹专门用来放置某个项目文件,
Fork命令可以将其他人的资源复制到自己的这个文件夹中。
Star用于收藏,相当于收藏夹
Clone可以复制别人的文件或是github上自己的仓库到本地
此外如果访问的是个人仓库,还可以在线修改添加文件
浏览Github
在github首页可以选择explore github,通过此选项可以查看github推荐的文章
四:两者关系
(1)GitHub是一个代码托管平台,而它利用的是基于 Git 的托管服务。
(2)GitHub上面也有Git的源码。
(3)可以通过git克隆github上的文件(需要登录)。
个人猜测:GitHub以此为名是因为主要采用了Git的方式,并且Github主要的存储方式也是基于Git,因此我们在Github上传的数据都会有历史版本,查找起来相当友好。
附:
.git文件夹
参考文章:https://juejin.cn/post/6844903986839945229
新建的Git文件夹默认有以下文件:
Config文件:
在此设置.git一些相关信息。
Descripton:
这个文件用于GitWeb。GitWeb 是 CGI 脚本(Common Gateway Interface,通用网关接口,简单地讲就是运行在Web服务器上的程序, 但由浏览器的输入触发),让用户在web页面查看git内容。如果我们要启动 GitWeb 可用如下命令:
# 确保lighttpd已安装: brew install lighttpd
$ git instaweb –start
默认会启动 lighttpd 服务并打开浏览器 http://127.0.0.1:1234,页面直接显示当前的 git 仓库名称以及描述。
个人测试上面给出的代码无效:
Hooks文件:
hooks里存放 git 提交的各个阶段文件,用于在 git 命令前后做检查或做些自定义动作。
HEAD:
修改head里面的内容可以更改指针的位置,使其指向所需的工作分区。
Objects:
原文:Git 往磁盘保存对象时默认使用的格式叫松散对象 (loose object) 格式,当你对同一个文件修改哪怕一行,git 都会使用全新的文件存储这个修改了的文件,放在了objects中。Git 时不时地将这些对象打包至一个叫 packfile 的二进制文件以节省空间并提高效率
综上objects相当于temp文件夹。
Ref:
存放git生成文件的分支以及标签的使用。