复习宝典之Git分布式版本控制

查看更多宝典,请点击《金三银四,你的专属面试宝典》

第三章:Git分布式版本控制

1)git文件状态

git中的文件有以下几种状态:

未跟踪(untrack):表示文件为新增加的。

已修改(modified):表示修改了文件,但还没保存到git仓库中。

已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

已提交(committed):表示文件已保存在git仓库中。

 

2)git工作区域

按照本地计算机与远程计算机划分,工作区域有以下几种:

本地计算机:

Working Directory(工作目录):即正在编辑的文件状态。文件状态为未跟踪(untrack)和已修改(modified)在此区域内。

Staging Area(暂存区):保存了下次将提交的文件列表信息。文件状态为已暂存(staged)在此区域内。

Repository(本地仓库):提交到本地仓库的文件。

远程计算机:

Repository(远程仓库):已提交到远程计算机内的文件。

 

3)git常用命令

git clone :将远程仓库clone到本地计算机。

git pull :拉取远程仓库的数据。

git status :展示工作区及暂存区域中不同状态的文件。

git add :将内容从工作目录添加到暂存区。

git commit :所有通过 git add 暂存的文件提交到本地仓库。

git push :将本地仓库的记录提交到远程仓库。

git reset HEAD <file> :从暂存区移除指定文件。

git checkout -- <file> :从本地仓库恢复指定文件。

git mv:重命名文件

git log:查看提交历史

 

4)git配置级别

config 配置有system级别(系统级别), global(用户级别) 和local(当前仓库),三个设置先从system-》global-》local ,底层配置会覆盖顶层配置。

查看系统config

`git config --system --list`

查看当前用户(global)配置

`git config --global  --list`

查看当前仓库配置信息

`git config --``local`  `--list`

由此可见--global中存储了提交用户的email和用户名,如果需要手动设置则可以使用如下指令:

`git config --global user.name ``"myname"``git config --global user.email  ``"test@gmail.com"`

 

5)git工作方式

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容:

 

 

Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。Git 的工作方式就像下图所示:

 

 

6)git安装后的配置

Git安装之后需要进行一些基本信息设置

  a、设置用户名:git config -- global user.name '你再github上注册的用户名';

  b、设置用户邮箱:git config -- global user.email '注册时候的邮箱';

注意:该配置会在github主页上显示谁提交了该文件

  c、配置ok之后,我们用如下命令来看看是否配置成功

  git config --list

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

 

7)git上传基本流程

7.1 创建git仓库

在要上传的项目文件夹右击选择Git Bash Here->输入$ git init

7.2 向仓库中添加文件 

通过$ git add '文件名'添加到暂存区

$ git status查看目前状态

7.3 提交到本地仓库 

$ git commit -m '这里写提交说明'

7.4 修改文件与删除文件

直接修改或直接删除

命令:

修改:$ vi '文件名',修改之后执行添加与提交

删除:$ git rm '文件名',删除后直接提交

7.5 Git克隆操作与提交到远程

克隆操作:$ git clone 仓库地址

提交到远程:先添加到暂存区》》提交到本地仓库》》git push提交到远程仓库

如果提交出错,可能由 .git 文件夹中的文件被设为“只读”所致,将 .git 文件夹下的所有文件、文件夹及其子文件的只读属性去掉即可。

注意用户名与密码要与远程仓库一致:

将远程连接地址改为:https://用户名:密码@github.com/用户名/仓库名.git

 

8)一些相关概念

sha-1散列:SHA (Secure Hash Algorithm,译作(安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数。正式名称为 SHA 的家族第一个成员发布于 1993年。然而人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了。 另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)。

 

快照:快照技术主要是在操作系统以及存储技术上实现的一种记录某一时间系统状态的技术。近来,Oracle等数据库厂家以及Vmware等虚拟化产品也把这种技术引入各自的数据保护当中。存储中使用快照技术由于其广泛的实用性成为应用最广泛的。

SINA对于快照的定义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。

为什么使用快照?

瞬时备份:在不产生备份窗口的情况下,可以帮助客户创建一致性的磁盘快照,每个磁盘快照都可以认为是一次对数据的全备份。从而实现常规备份软件无法实现的分钟级别的RPO。

快速恢复:用户可以依据存储管理员的定制,定时自动创建快照,通过磁盘差异回退,快速回滚到指定的时间点上来。通过这种回滚在很短的时间内可以完成。大大的提高了业务系统RTO的水平。

应用测试:用户可以使用快照产生的虚拟硬盘的数据对新的应用或者新的操作系统版本进行测试,这样可以避免对生产数据造成损害,也不会影响到目前正在运行的应用。

报表打印等资源消耗较大的业务的分离:用户可以将指定时间点的快照虚拟硬盘分配给一个新的服务器,从而实现将报表打印等对于服务器核心业务会产生较大影响的剥离。使核心业务服务器运行更加平稳有效快速的运行。

降低数据备份对于系统性能的影响: 通常数据备份是在业务服务器上完成的。每次发起数据备份必然对当前业务系统运行性能造成影响。通过快照虚拟硬盘的提取后,备份工作可以转移到其他服务器上。从而实现了零备份窗口(针对应用主机),零影响的理想数据备份。

 

传输协议:传输协议中各层都为上一层提供业务功能。为了提供这种业务功能,下一层将上一层中的数据并入到本层的数据域中,然后通过加入报头或报尾来实现该层业务功能,该过程叫做数据封装。用户的数据要经过一次次包装,最后转化成可以在网络上传输的信号,发送到网络上。当到达目标计算机后,再执行相反的拆包过程。

HTTPS和HTTP的区别: https协议需要到ca申请证书,一般免费证书很少,需要交费。 http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。 http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。 http的连接很简单,是无状态的。 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。

SSH传输协议:SSH 为 Secure Shell的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台-包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。

 

9)git忽略文件(.gitignore)

.gitignore忽略规则的匹配语法

在 .gitignore 文件中,每一行的忽略规则的语法如下:

1)空格不匹配任意文件,可作为分隔符,可用反斜杠转义

2)以#”开头的行都会被 Git 忽略。即#开头的文件标识注释,可以使用反斜杠进行转义。

3)可以使用标准的glob模式匹配。所谓的glob模式是指shell所使用的简化了的正则表达式。

4)以斜杠"/"开头表示目录;"/"结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件;"/"开始的模式匹配项目跟目录;如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录。

5)以星号"*"通配多个字符,即匹配多个任意字符;使用两个星号"**" 表示匹配任意中间目录,比如a/**/z可以匹配 a/z, a/b/z 或 a/b/c/z等。

6)以问号"?"通配单个字符,即匹配一个任意字符;

7)以方括号"[]"包含单个字符的匹配列表,即匹配任何一个列在方括号中的字符。比如[abc]表示要么匹配一个a,要么匹配一个b,要么匹配一个c;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配。比如[0-9]表示匹配所有0到9的数字,[a-z]表示匹配任意的小写字母)。

8)以叹号"!"表示不忽略(跟踪)匹配到的文件或目录,即要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。需要特别注意的是:如果文件的父目录已经被前面的规则排除掉了,那么对这个文件用"!"规则是不起作用的。也就是说"!"开头的模式表示否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用"!"也不会再次被包含。可以使用反斜杠进行转义。

需要谨记:git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;

 

10)git取消修改与回退

10.1 未使用 git add 缓存代码时:

可以使用 git checkout --filepathname (比如: git checkout --readme.md ,不要忘记中间的 “--” ,不写就成了检出分支了!!)

放弃所有的文件修改可以使用 git checkout . 命令。此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。

 

10.2 已经使用了 git add 缓存了代码:

可以使用 git reset HEAD filepathname (比如: git reset HEAD readme.md)来放弃指定文件的缓存,放弃所以的缓存可以使用 git reset HEAD . 命令。

此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了10.1所示的状态。继续用10.1中的操作,就可以放弃本地的修改。

 

10.3 已经用 git commit 提交了代码:

可以使用 git reset --hard HEAD^ 来回退到上一次commit的状态。此命令可以用来回退到任意版本:git reset --hard commitid ,你可以使用 git log 命令来查看git的提交历史,第一行就是 commitid。

 

11)git创建分支与合并分支

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

 

12)git中的rebase

我们在使用git pull命令的时候,可以使用--rebase参数,即git pull --rebase,这里表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把本地当前分支更新为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上。

 

13)github

可以通过命令 git remote show [remote-name] 查看某个远程仓库的详细信息,比如要看所克隆的origin仓库,可以运行:$ git remote show origin

 

Git中从远程的分支获取最新的版本到本地有这样2个命令:

git fetch:相当于是从远程获取最新版本到本地,不会自动merge

git pull:相当于是从远程获取最新版本并merge到本地

 

GitLab和GitHub一样属于第三方基于Git开发的作品,免费且开源(https://github.com/gitlabhq/gitlabhq 基于MIT协议),与Github类似,可以注册用户,任意提交你的代码,添加SSHKey等等。不同的是,GitLab是可以部署到自己的服务器上,数据库等一切信息都掌握在自己手上,适合团队内部协作开发,你总不可能把团队内部的智慧总放在别人的服务器上吧?简单来说可把GitLab看作个人版的GitHub。

 

Webhook就是用户通过自定义回调函数的方式来改变Web应用的一种行为,这些回调函数可以由不是该Web应用官方的第三方用户或者开发人员来维护,修改。通过Webhook,你可以自定义一些行为通知到指定的URL去。Webhook的“自定义回调函数”通常是由一些事件触发的,比如推送代码到代码库或者博客下新增一个评论,源站点会为Webhook进行HTTP请求的URI配置。用户通过配置,就可以使一个网站上的事件调用在另一个网站上表现出来,这些事件调用可以是任何事件,但通常应用的是系统集成和消息通知。

Webhook是一个API概念,并且变得越来越流行。我们能用事件描述的事物越多,webhook的作用范围也就越大。Webhook作为一个轻量的事件处理应用,正变得越来越有用。

准确的说webhook是一种web回调或者http的push API,是向APP或者其他应用提供实时信息的一种方式。Webhook在数据产生时立即发送数据,也就是你能实时收到数据。这一种不同于典型的API,需要用了实时性需要足够快的轮询。这无论是对生产还是对消费者都是高效的,唯一的缺点是初始建立困难。

Webhook有时也被称为反向API,因为他提供了API规则,你需要设计要使用的API。Webhook将向你的应用发起http请求,典型的是post请求,应用程序由请求驱动。

 

原文地址:https://www.cnblogs.com/xdzy/p/10485398.html