Git
一、初识Git
1.1 Git的简史
同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。
Linus在1991年创建了开源的Linux,Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。 到了 2005 年,开发Samba的Andrew试图破解BitKeeper的协议,随后开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,Linus仅仅使用了两周的时间用C写出了Git,开发出自己的版本系统,一个月之内,Linux系统的源码已经由Git管理了。 他们对新的系统制订了若干目标:
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub。
这时候是不是有很多小伙伴已经被Linus所惊讶到了呢?使用了两周时间用C写出了Git!
1.2 Git到底是什么?
Git是一个开源的
分布式
版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理
1.3 什么是版本控制系统?
版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。
1.3.1 版本控制系统的作用
版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。
版本控制系统不仅为我们解决了实际开发中多人协同开发的问题,还提供了一些功能:检入检出控制 、分支和合并 、历史记录
检入检出控制
:同步控制的实质是版本的检入检出控制。检入就是把软件配置项从用户的工作环境存入到软件配置库的过程,检出就是把软件配置项从软件配置库中取出的过程。检人是检出的逆过程。同步控制可用来确保由不同的人并发执行的修改不会产生混乱。分支与合并
:版本分支(以一个已有分支的特定版本为起点,但是独立发展的版本序列)的人工方法就是从主版本——称为主干上拷贝一份,并做上标记。在实行了版本控制后,版本的分支也是一份拷贝,这时的拷贝过程和标记动作由版本控制系统完成。版本合并(来自不同分支的两个版本合并为其中一个分支的新版本)有两种途径,一是将版本A的内容附加到版本B中;另一种是合并版本A和版本B的内容,形成新的版本C。历史记录
:版本的历史记录有助于对软件配置项进行审核,有助于追踪问题的来源。历史记录包括版本号、版本修改时间、版本修改者、版本修改描述等最基本的内容,还可以有其他一些辅助性内容,比如版本的文件大小和读写属性。 如果我们开发中的新版本发现不适合用户的体验,这时候就可以找到历史记录的响应版本号,回退到历史记录版本!
1.4 版本控制系统的分类(了解)
常见流行的分布式版本控制管理系统有Git
常见流行的集中式版本控制管理系统有CVS、SVN
代 | 网络 | 操作 | 并发性 | 示例 |
---|---|---|---|---|
第一代 | 无 | 仅一个文件 | 锁定的 | RCS、SCCS |
第二代 | 集中式 | 多文件 | 提交之前合并 | CVS、SourceSafe、Subversion、Team Foundation Server |
第三代 | 分布式 | 变更的集合 | 合并之前提交 | Bazaar、Git、Mercurial |
1.5 分布式与集中式
1.5.1 集中式
集中式系统
是指由一台或多台主计算机组成的中心节点,数据集中存储于这个中心节点中,并且整个系统的所有业务单元都集中部署在这个中心节点上,系统的所有功能均由其集中处理。简单提了集中式的概念,那集中式版本控制也是如此。如图,我们需要合并版本、更新版本时,是将各个版本上传服务器实现集中式合并!
举例来说,集中式版本控制系统在公司中的使用,需要安装一个Server(服务器),然后各个使用版本控制系统的成员安装客户端,然后就是客户端连接服务器了,只有脸上这个服务器才能做版本控制,如果连不上那就不行了。
工作流程: 比较熟悉的SVN是集中式的版本控制系统,每次在进行版本控制之前,需要先从中央服务器(服务端)取出最新的版本,然后开始工作,工作完后推送给中央服务器。此时的中央服务器就好比是一个图书馆,如果你要修改一本书,需要先从图书馆借出来,然后回到自己家修改,改完之后,需要在送回到图书馆。
1.5.2 分布式
分布式
系统是一个硬件或软件组件分布在不同的网络计算机上(本地化存储),彼此之间仅仅通过消息传递进行通信和协调的系统。又一次简单提了分布式的概念,那分布式版本控制更是如此。如图,我们需要合并版本、更新版本时,各台计算机都可以去实现彼此之间合并、更新,不再只依赖于一个中心节点,为我们开发提供了灵活与便捷!
举例来说,分布式版本控制系统在公司中的使用与集中式不同,各个成员需要安装一个Git客户端,而各个成员之间可以随时随地的实现版本控制(比如:两个人合并后,再与第三个人合并或者小组与小组之间合并进行版本控制),不再依赖于必须连接服务器才能实现,那么我们实现了各个小组之间的灵活控制后,最终还是得落到了服务器的手中。我们需要把各个成员、小组之间的版本控制结果,上传到服务器(GitHub)中进行最终合并!
工作流程: 分布式版本控制系统是没有“中央服务器”,每个人的电脑上都是一个完整的版本库,工作的时候,不再需要联网。开始工作前,在客户端克隆出完整的代码仓库,然后就可以在家、在公交车等等随心所欲地修改代码并提交了,提交到本地电脑,等到有网的时候就可以一次性地将本地仓库推送到远端仓库(临时中心服务器)中,这样一来,每个人都可以独立进行改动资料,并且所有的改动都是在完整资料信息的环境下进行的。
1.5.3 分布式与集中式的区别
集中式
- 有一个单一的集中管理的服务器,保存所有文件的修订版本,所有代码库。
- 对网络的依赖性强,必须联网才能工作,上传速度受网络状况、带宽影响。
- 客户端记录文件内容的具体差异,每次记录有哪些文件做了更新,以及更新了哪些行的什么内容。
缺点: 中央服务器的单点故障。 如果中央服务器发生宕机,所有客户端将无法提交更新、还原、对比等,也就无法协同工作。如果磁盘发生故障,信息尚无备份,还会有数据丢失的风险。
分布式
- 本地客户机进行操作,离线工作,快速。
- 安全性高,每个人电脑里都有完整的版本库,如果电脑发生了更换复制一份就可以。
- 原子性提交,提交不会被打断(git)。
- 工作模式非常灵活(传统的集中式工作流 + 特殊工作流 + 特殊工作流和集中式工作流的组合)。
缺点: 缺少权限管理、命令复杂混乱
1.6 Git的下载安装
Git官网下载:https://git-scm.com/
TortoiseGit官网下载:https://tortoisegit.org/
Git文档下载:https://git-scm.com/book/zh/v2
Git详细安装教程参考:Git安装教程详解
注意: 关于Git的可视化工具下载与否取决于自己,笔者不建议下载可视化工具,因为我们要大量使用并熟练使用命令来操作Git!
Git客户端下载 | Git可视化工具下载 |
---|---|
1.7 安装后测试
1.7.1 打开命令的两种方式
- Wins+R输入cmd打开Dos命令窗口
- 右键单击打开Git Bash Here窗口
1.7.3 命令查看Git版本号
@查看Git版本号:
git version
1.7.2 提交版本控制人信息
安装后打开命令窗口,第一次需要提交我们的信息,这样可以让我们在版本控制的时候知道是谁做的这一次的版本控制。毕竟合并、更新代码等是一件很重要的事,万一缺失损坏了怎么办呢?是吧!
@提交信息版本操作者信息:
git config --global user.name "Ziph"
【用户名】
git config --global user.email "mylifes1110@163.com"
【邮箱】@查看信息:
git config -l
二、仓库
2.1 仓库是什么?
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
2.2 基本结构
工作区: 由我们使用命令
git init
初始化的一个本地文件夹,而初始化后的这个文件夹就被称为工作区暂存区: 由我们使用命令
git add .
把文件添加到暂存区,而被添加的位置则是工作区中.git目录中的index文件,所以这也叫做索引版本库: 工作区中会有一个隐藏的.git文件夹,这个不算是工作区,而是Git的版本库,版本库中记录了我们提交过的所有版本,也就是说版本库管理着我们的所有内容
分支: 版本库中包含若干分支,提交后的文件就会存储在分支中,而开始的时候版本库中只会有一个主分支master
基本结构 |
---|