Git最全基础学习!!纯干货!!!简单理解(一)

什么是git?

A Distributed Revision Control System

一种分布式的版本控制系统

通常用的版本控制系统有GIT、SVN

那他们两者有什么区别呢?

就从它们的优缺点开始说起吧


Git

优点:

  • 分布式,每个参与开发的人电脑上都有一个完整的仓库,不需要担心硬盘出现问题。每个克隆(clone)的版本库都是平等的。可以从任何一个版本库的克隆来创建属于自己的版本库,同时你的版本库也可以作为源提供给他人。
  • Git 的每一次提取操作,实际上都是一次对代码仓库的完整备份。
  • 不联网的情况下,一样可以提交到本地仓库,可以查看过往的所有log,有网之后push操作到远程即可。而且无需别人授权,提交总会成功。
  • 提供了非常强大的分支管理功能
  • Git的内容完整性优于SVN----原因:Git的内容存储使用的是SHA-1哈希算法,可以确保代码内容的完整性,确保在遇到磁盘故障和网络问题的时候降低对版本库的损坏

缺点:

  • 权限管理不够方便,一般通过系统设置文件读写权限的方式来做权限控制。需要安装插件gitolite,配置麻烦,或者直接使用gitlab管理
  • 工作目录只能是整个项目。比如 checkout,建分支,都是基于整个项目的。而 svn 可以基于项目中的某一个目录

SVN

优点:

  • 较好的权限管理功能,可以精确地控制每个目录的权限
  • 使用相对git来说简单一些

缺点

  • 集中式,如果中心服务器出现了问题,所有人都不能干活,回复也很麻烦,因为SVN记录的是每次改动的差异,而不是完整的文件
  • 分支功能没有git强大
  • 速度没有git快,如果有五个分支,会把五个分支的文件全部拷贝下来
  • 必须联网才能commit

总结

主要差别

  • Git关心文件数据的整体是否发生变化,而SVN这类的版本控制系统基本上只关心文件内容的具体差异。这类系统每次记录有哪些文件做了哪些更新,然而Git并不保存这些前后变化的差异数据。Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新的时候,会总览一遍所有的文件的信息并对文件做一快照,然后保存一个指向这次快照的索引。为了提高性能,如果文件没有变化,Git不会再次保存,只对上次保存的快照做一链接。

     我觉得,Git没有像SVN一样每次提交的是否都将更新的详细信息分析并提交,是很科学的,因为 大部分时间我们不会要去查看        每一个文件都做了哪些更新,因为git会在本地保存完整的历史版本库,又是个用户开发就会有十份库,就会出现特别多的冗余      数据。但是在SVN上这样就是科学的,服务器保存唯一一份历史版本库,包含了所有的详细信息,需要的时候就可以去查看某个      文件与之前版本的更新变动信息。而Git则会取出前一天的快照和当前的文件做一次差异运算,显示出更新变动的信息

  • Git中的绝大多数操作都只需要访问本地文件,不需要联网就可以看到所有的历史版本记录,而SVN需要联网。如果想要查看当前版本和历史版本的差异,git会取出一个月前的快照和当前文件做一次差异运算
  • SVN断开网络或者断开VPN就无法commit代码,但是Git可以先commit到本地仓库。用SVN的话,断网或者断开VPN时,无法commit代码,长时间不commit代码就会丢失大量的开发进程的历史记录,就像是用word码字却不能用ctrl+s保存一样的危险。Git可以随时频繁的提交更新,本地仓库的commit几乎不需要时间。
  • Git内容完整性要优于SVN。因为Git 在commit(存储在本地)或者push(上传到远程仓库)之前,通过对文件的内容或目录的结构计算出一个 SHA-1哈希值,作为指纹字符串进行内容的校验,并将此结果作为数据的唯一标识和索引,在远处仓库接受到commit的文件之后,会再计算一遍哈希值然后跟传递过来的哈希值做比较,如果不一致,说明文件在传输时变得不完整,或者磁盘损坏导致文件数据损坏。另外在 Git 数据库中的东西都是用此哈希值来作索引,而不是靠文件名。 
  • Git克隆一个完整项目的速度很快,SVN很慢。我们以克隆一份拥有五个分支的完整项目以及版本库来说,SVN是同时复制5个版本的文件,也就是说重复五次同样的动作。而Git 只是获取文件的每个版本的元素,然后只载入主要的分支(master)
  • Git分支比SVN强大

分支(Branch)

SVN:分支是一个完整的目录,而且这个目录拥有完整的实际文件。如果工作成员想开启新的分支,将会影响所有的人,每个人都会有一个一样的分支。如果你的分支是对系统模块进行安全检查测试的,改变一个分支,其他人就得切分支重新下载,还会对稳定版本有一定的破坏性。

Git:每个工作成员可以任意在在自己的本地版本库开启无限个分支。举例:当我想尝试破坏自己的程序(安检测试),并且想保留这些被修改的文件供日后使用, 我可以开一个分支,做我喜欢的事。完全不需担心妨碍其他工作成员。只要不合并及提交到主要版本库,没有一个工作成员会被影响。等到我不需要这个分支时, 我只要把它从我的本地版本库删除即可。


开发中分支的创建时间

如果开发了一个新的网站,已经在主分支(master)上开发出了1.0发布版本,如果开发一个新的功能模块,我们就需要创建一个分支(dev),而不是在主分支继续开发。

原因:

  1. 开发新的模块时,可能会遇到各种bug或者冲突,如果依然在主分支开发,如果冲突严重,影响了当前本来稳定的版本,会增加很多麻烦。如果在新的分支上开发,冲突严重时,大不了删除当前分支,重新分一个分支出来。而且分支还可以保留开发中可能出现的各种bug方便修复单不影响主分支多的使用。
  2. 如果我们要求二环分支。如切换到master分支的时候,会保存当前dev分支的状态,以便于日后继续开发,防止丢失开发进度。比如,正在dev开发新模块,然后1.0出现了严重的bug,就先切换回主分支,然后为主分支建立一个紧急修补的repair分支,在其中修复问题。通过测试后,再返回主分支,将repair分支合并,然后push到远程仓库。再切回开发新模块的dev分支,从之前退出时的进度继续开发。

Git可以在任意一个提交点开启分支,可以说是十分方便了!


 Git 有三种状态:

  • 已提交(committed) 表示数据已经安全的保存在本地数据库中。
  • 已修改(modified)表示修改了文件,但还没保存到数据库中。
  • 已暂存(staged)表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

Git 项目的三个工作区域的概念:

  • Git 仓库:Git 用来保存项目的元数据和对象数据库的地方。这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
  • 工作目录:是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
  • 暂存区域:是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”,不过一般说法还是叫暂存区域。

基本的 Git 工作流程如下:

  1. 在工作目录中修改文件。
  2. 暂存文件,将文件的快照放入暂存区域。
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

一般开发流程

  1. 创建仓库(web端Remote创建)从远程仓库克隆到本地
  2. 创建并切换到特性分支
  3. 创建/修改文件
  4. 提交工作区文件到暂存区
  5. 提交暂存区文件到本地仓库
  6. 合并主干分支代码
  7. 推送本地仓库到远程仓库

下一篇我将介绍git的基本用法,以上的概念掌握就好

发布了120 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Zhengxinyu666/article/details/103317858