git

一、版本控制介绍

1.1 版本控制

工程设计领域中使用版本控制管理工程蓝图的设计过程。在 IT 开发过程中也可以使用版本控制思想管理代码的版本迭代。

1.2 版本控制工具

思想:版本控制

实现: 版本控制工具

集中式版本控制工具:CVS、SVN、VSS...

need-to-insert-img

分布式版本控制工具:Git、Mercurial、Bazzar、Darcs...

need-to-insert-img

二、Git简介

2.1 Git简史

need-to-insert-img

2.2 Git官网和Logo

Git官网

need-to-insert-img

2.3 Git的优势

大部分操作在本地完成,不需要联网

完整性保证

尽可能添加数据而不是删除或修改数据

分支操作非常快捷流畅

与 Linux命令全面兼容

2.4 Git结构

need-to-insert-img

2.5 Git和代码托管中心

代码托管中心的任务:维护远程库

局域网环境

GitLab服务器

外网环境

GitHub、码云

三、本地仓库和远程库

3.1 团队内部协作

need-to-insert-img

3.2 跨团队协作

need-to-insert-img

四、Git命令行操作

4.1 本地仓库初始化

git init

need-to-insert-img

4.2 设置签名

作用:区分不同开发人员的身份信息

辨析:这里设置签名和远程库登录的账号密码没有任何关系 

#项目级别的设置 信息保存位置:.git/config文件git config user.name admingit config user.email [email protected]#系统级别设置 信息保存位置:~/.gitconfig文件git config--global user.name admingit config--global user.email [email protected]

4.3 基本操作

状态查看

git status #查看工作区、暂存区状态

添加和提交

git add[file name]#将工作区的’新建/修改‘添加到暂存区git rm--cached[file name]#将刚才add的文件从暂存区删除掉git commit-m"commit msg"[file name]#将缓存区的内容提交到本地库

查看历史记录

git log #空格下翻页、b上翻页、q退出git log--online #每条记录单行展示git reflog #每条记录单行展示并且显示最新版本到每条记录的回退步数

need-to-insert-img

--soft参数

仅仅在本地库移动HEAD指针

need-to-insert-img

--mixed参数

1. 在本地库移动HEAD指针

2. 重置暂存区

need-to-insert-img

--hard参数

1. 在本地库移动HEAD指针

2. 重置暂存区

3. 重置工作区

删除文件并找回

前提:删除前,文件存在是的状态提交到了本地库

git reset--hard[指针位置] #删除操作已经提交到本地库:指针位置指向历史记录#删除操作尚未提交到本地库:指针位置使用HEAD

比较文件差异

git diff[file name]#将工作区中的文件和暂存区进行比较git diff[本地库中历史版本][file name]#将工作区的文件和本地库历史记录比较git diff #不带文件名比较多个文件

4.4 分支管理

什么是分支

在版本控制过程中,使用多条线同时推进多个任务。

need-to-insert-img

分支的好处

同时并行推进多个功能开发,提高开发效率。

各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任 何影响。失败 的分支删除重新开始即可。

分支的操作

git branch[分支名]#创建分支git branch-v #查看分支git checkout[分支名]#切换分支git merge[源分支名]#合并分支:先切换到目标分支,在执行当前合并的命令

解决冲突

编辑文件,删除特殊符号

把文件修改到满意的程度,保存退出

git add [文件名]

git commit -m "日志信息" 注意此时commit不能带文件名

need-to-insert-img

五、Git基本原理

5.1 哈希

need-to-insert-img

哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下 几个共同点:

① 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。

② 哈希算法确定,输入数据确定,输出数据能够保证不变

③ 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大

④ 哈希算法不可逆

Git 底层采用的是 SHA-1 算法。

哈希算法可以被用来验证文件。原理如下图所示:

need-to-insert-img

5.2 Git保存版本的机制

集中式版本控制工具的文件管理机制

以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。每次的上传到服务器上文件,保存在服务器的部分都是这次和上次版本之间的差异。如果要从服务器更新到本地也是需要把原始文件的版本和每次的差异 都合并起来,组成一个版本。优点点是节约服务器的存储空间,但缺点也很明显,速度慢。

need-to-insert-img

Git的文件管理机制

Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git 的工作方式可以称之为快照流。

need-to-insert-img

快照的意思就是,每次都是直接保存这个版本的所有文件。

当然,一般来说,我们每次更改不会更改一个项目的所有文件,对于没有更改的文件git在这里保存的其实是这个版本对于上一个版本的指针。上图的虚线部分圈起来的相对之前版本没改动,所以所在版本只保留这个文件的指针。

Git文件管理机制细节

Git的”提交对象“

该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的 指针 。

首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象,而由多个分支合并产生的提交对象有多个父对象。

为了更加形象地说明,我们假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。暂存操作会为每一个文件计算校验和,然后会把当前版本的文件快照保存到Git 仓库中(Git 使用 blob 对象来保存它们),最终将校验和加入到暂存区域等待提交。

当使用 git commit 进行提交操作时,Git 会先计算每一个子目录的校验和,然后在Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。如此一来,Git 就可以在需要的时候重现此次保存的快照。

现在,Git 仓库中有五个对象:三个 blob 对象(保存着文件快照)、一个树对象(记录着目录结构和 blob 对象索引)以及一个提交对象(包含着指向前述树对象的指针和所有提交信息)。

用图形表示为如下方式

need-to-insert-img

提交对象及其父对象形成的链表结构

对于B或C都是做些修改后再次提交,那么这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针

need-to-insert-img

5.3 分支管理机制

need-to-insert-img

need-to-insert-img

need-to-insert-img

need-to-insert-img

need-to-insert-img

六、远程库实操

基本命令

git remote-v #查看当前所有远程库git remote add[别名][远程库地址]#给远程库起别名,方便以后使用git push[远程库别名][本地分支名]#推送本地分支到远程库,如果远程没有和本地相对应的分支,则创建同名分支git clone[远程地址]#等同于完成了代码的下载以及初始化本地库和创建了远程库origin的别名git fetch[远程库别名][远程库分支名]#拉取远程库代码git merge[远程库别名/远程库分支名]#将远程代码合并到本地分支git pull[远程库别名][远程分支名]#相当于 fetch和merge的合并操作

Gitlab实操 省略一万字...

七、Git工作流

7.1 概念

在项目开发过程中使用 Git 的方式

7.2 分类

GitFlow 工作流

Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。

need-to-insert-img

7.3 GitFlow工作流详解

主干分支 master

主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境 完全一致。

开发分支 develop

主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。

bug修复分支 hotfix

主要负责管理生产环境下出现的紧急修复的代码。从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。

准生产分支(预发布分支) release

较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集 成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后 可以视情况删除。

功能分支 feature

为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支 中独立出来。 开发完成后会合并到开发分支。

need-to-insert-img

你可能感兴趣的:(git)