Git教程

87 阅读8分钟

Git

版本控制

​ 版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统. 简单讲就是备份和记录. 接下来我们要了解三种不同版本控制的发展历程.。

本地版本控制系统

​ 人们把项目拷贝到本地磁盘上进行备份, 然后以命名方式来区分. 这种做法好处是简单, 但坏处也不少比如备份比较多或许就会混淆不同版本之间的区别. 那为了解决这个问题, 有人就开发了一个本地版本的管理系统, 它的结构图如下:

在这里插入图片描述

本地版本管理就是把版本号存入数据库来记录文件的历次更新差异。

集中化版本控制系统

​ 本地版本控制系统能够将不同版本的文档保存下来并且借助版本记录可以很方便定位相关文件但又引入了新的问题,如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法 。

​ 这样做的好处是解决了人们开发协同的问题, 但是把所有的代码提交到同一台服务器上有一个很明显的问题就是单点故障, 如果这台服务器宕机了, 那所有人都不能提交代码, 还有如果这台服务器如果磁盘发生故障,碰巧没做备份,或者备份不够及时,就还是会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端提取出来的某些快照数据除外,但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。

分布式版本控制系统

​ 为了解决集中化版本管理所带来的问题分布式版本管理控制系统(Distributed Version Control System,简称 DVCS)就应运而生了. 在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等, 客户端不只是提取出最新版的文件快照, 而是把最原始的代码仓库镜像到本地. 这样一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。

​ 所以综上来看的集中化版本控制系统是对本地版本控制系统的一次升级, 因为它加入了协同操作, 分布式版本控制系统是对集中化控制系统的一次补充, 使之更加完善。

Windows上安装Git

​ 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。

​ 在Windows上使用Git,先从Git官网直接下载安装程序,选择指定系统下载,然后按默认选项安装即可。安装完成后,在开始菜单里找到“Git”->“Git Bash”,显示出类似命令行的窗口,说明Git安装成功!

在窗口内输入 git --version 查看git 版本信息如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZgAlpggy-1609138085266)(Git教程.images\1557460306743.png)]

​ 在使用用Git工作之前,我们需要做个一次性的配置。方便后续Git能跟踪到谁做了修改,我们需要设置对应的用户名与邮箱地址。

git config --global user.name "your_username"
git config --global user.email your_email@domain.com
git config --list 查看所有配置

​ 注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DQZwMTFB-1609138085267)(Git教程.images\1557460929191.png)]

理解Git文件的三种状态与工作模式

使用Git 操作文件时,文件的状态有以下三种:

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

针对Git 文件的三种状态,这里需要了解Git项目的三个工作区域:工作区、暂存区和Git仓库。

分类描述
工作区简单的理解为在电脑里能看到的目录,比如自己创建的本地项目目录
暂存区Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
Git仓库工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

基本的Git 工作流程描述如下:

  • 在工作区中修改某些文件。

  • 对修改后的文件进行快照,然后添加到暂存区。

  • 提交更新,将保存在暂存区域的文件快照永久转储到 Git 仓库中。

创建版本库并提交文件

​ 版本库又名仓库,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。理解了Git 文件状态与三种工作区域之后,通过一个例子来体验Git对于文件的基本操作。

编写一个文本文件并将文件提交到git仓库

  • 初始化git 本地仓库

    通过执行git init 命令在本地初始化一个本地仓库,执行该命令后会在本地初始化一个没有任何文件的空仓库。

  • 新建文本文件 git01.txt 并添加到暂存区

文本内容如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZVDtMwef-1609138085272)(Git教程.images\1557718421862.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RXe7wK3F-1609138085274)(Git教程.images\1557716676204.png)]

在 .git 同级目录下添加git01.txt 文件后,使用 git status 查看工作目录与暂存区文件状态

git status 命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。

执行git add 命令添加文件到暂存区

git add path 通常是通过git add <path>的形式把<path>添加到索引库中,<path>可以是文件也可以是目录。
git不仅能判断出<path>中,修改(不包括已删除)的文件,还能判断出新添的文件,并把它们的信息添加到索引库中。

此时可以看到有一个git 已tracked 到新文件git01.txt,文件被成功存放到暂存区

  • 提交文件到本地版本库

文件被添加到暂存区后,执行git commit 命令提交暂存区文件到本地版本库中。

git commit 命令用于将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中。通常在执行提交时 在 git commit 命令后跟上 -m 属性  加入本次提交的记录说明 方便后续查看提交或改动记录。

git log :命令用于显示提交日志信息。 (比较常用,后续讲到时光穿梭时会经常使用该命令)。

时光穿梭机

​ 企业中在多人的项目开发环境下,使用Git 版本控制工具对项目版本进行管理时,通常会对项目不同版本的文件进行查看,项目历史版本,未来版本的切换操作,对于一个项目开发人员,此时对于Git 的这些基本命令操作就成为了一项基本技能。