Git分布式版本控制工具

Git分布式版本控制工具

Git与Svn对比

下图就是标准的集中式版本控制工具管理方式:

image-20201115160657262

下图就是分布式版本控制工具管理方式:

image-20201115161048056

区别说明:

Svn是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器那里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就郁闷了。集中管理方式在一定程度上可以看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限。但是相较于其优点而言,集中式版本控制工具缺点更明显:第一:服务器单点故障。第二:容错性差。

Git是分布式版本控制系统,那么它就没有中央服务器,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

Git远程仓库简介

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

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

-- Git中从远程的分支获取最新的版本到本地有这样2个命令:
git fetch:相当于是从远程获取最新版本到本地,不会自动merge
git pull:相当于是从远程获取最新版本并merge到本地

Git文件状态

Git中的文件有4种状态:

img

状态说明:

1)Untracked:未跟踪,此文件在文件夹中,但并没有加入到Git库,不参与版本控制,通过git add将状态变为Staged。

2)Unmodified:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果它被修改,则变为Modified,如果使用git rm移出版本库,则成为Untracked文件。

3)Modified:文件已修改,仅仅是修改,并没有进行其他的操作,这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout则丢弃修改过,返回到Unmodified状态,这个git checkout即从库中取出文件,覆盖当前修改。

4)Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodified状态,执行git reset HEAD filename取消暂存,文件状态为Modified。

Git文件图标含义

正常的:绿色的勾
被修改过的:红色感叹号
新添加的:蓝色的加号
未受控的(无版本控制的):蓝色的问号
忽略不受控的:灰色的减号
删除的:红色的x号
有冲突的:黄色的感叹号

Git工作区域

img

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

本地计算机:
Working Directory(工作目录):即正在编辑的文件状态。文件状态为未跟踪(Untracked)和已修改(Modified)在此区域内。
Staging Area(暂存区):保存了下次将提交的文件列表信息。文件状态为已暂存(staged)在此区域内。
Repository(本地仓库):提交到本地仓库的文件。

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

Git工作方式

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

img

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

img

Git配置级别说明

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

-- 查看系统配置
git config --system --list

-- 查看当前用户配置
git config --global --list

-- 查看当前仓库配置信息
git config --local --list

-- 由此可见--global中存储了提交用户的email和用户名,如果需要手动设置则可以使用如下指令
git config --global user.name "myname" 
git config --global user.email "test@gmail.com"

Git用户信息配置

注意:该配置会在github主页上显示谁提交了该文件
-- 设置用户名:
git config --global user.name '你在github上注册的用户名'
-- 设置用户邮箱:
git config --global user.email '注册时候的邮箱'

-- 配置ok之后,我们用如下命令来看看是否配置成功
git config --list

注意:git config --global 参数,有了这个参数表示你这台机器上所有的git仓库都会使用这个配置,当然你也可以对某个仓库指定不同的用户名和邮箱,在项目根目录下进行单独配置:
$ git config user.name "gitlab's Name"
$ git config user.email "gitlab@xx.com"

-- 查看当前配置,在当前项目下面查看的配置是全局配置+当前项目的配置,使用的时候会优先使用当前项目的配置。
git config --list

Git忽略文件(.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配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效。

Git中的rebase

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

Git上传远程仓库流程

1)创建git仓库
在要上传的项目文件夹右击选择Git Bash Here,输入git init

2)向仓库中添加文件
-- 将文件添加到暂存区
git add '文件名'
-- 查看目前状态
git status

3)提交到本地仓库
git commit -m '这里写提交说明'

4)修改文件与删除文件,直接修改或直接删除
-- 修改
vi '文件名' #修改之后执行添加与提交
-- 删除
git rm '文件名' #删除后直接提交

5)Git克隆操作与提交到远程
-- 克隆操作
git clone 仓库地址
-- 提交操作
git push

提交到远程仓库:先添加到暂存区(git add)>>>提交到本地仓库(git commit)>>>提交到远程仓库(git push)。如果提交出错,可能由.git文件夹中的文件被设为只读所致,将.git文件夹下的所有文件、文件夹及其子文件的只读属性去掉即可。注意用户名与密码要与远程仓库一致。

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

Git取消修改与回退

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

2)已经使用了git add缓存了代码,可以使用:
git reset HEAD filepathname
如:
git reset HEAD readme.md
此命令用来清除Git对于文件修改的缓存。相当于撤销git add命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了(1)的状态(未使用git add缓存代码状态)。继续用(1)中的操作,就可以放弃本地的修改。放弃所以的缓存可以使用git reset HEAD .命令。

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

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>
posted @ 2019-03-06 19:18  肖德子裕  阅读(379)  评论(0编辑  收藏  举报