【linux基础】版本控制工具git、github、gitlab
Git概述
Git是一个免费、开源、分布式的版本控制系统/工具,可以快速高效的处理从小型到大型的各种项目,最初由林纳斯·托瓦兹创作。
Git易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和ClearCase等版本控制工具。
Git简史

版本控制简介
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制其实最重要的是可以记录文件修改的历史纪录,从而让用户能够查看历史版本,方便版本切换。

版本控制的优势
从个人开发到团队协作

版本控制工具
集中式版本控制工具
CVS、SVN(Subversion)、VSS......
集中式的版本控制系统诸如CVS、SVN等,都有一个单一的集中管理服务器,保存所有文件的修订版本,而协同工作的人都通过客户端连接到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什么,而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。

分布式版本控制工具
Git、Mercurial、Bazaar、Darcs......
像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整的镜像下来(本地库)。这样任何一处协同工作的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
- 服务器断网的情况下也可以进行开发,因为版本控制是在本地进行的
- 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
![c2f08eb9c670464c9eac6ad87947cc0d]()
Git工作机制

- 工作区:存放代码的磁盘的位置,代码可以删除
- 暂存区:将工作区的代码添加到暂存区,是临时添加,还没有生成历史版本,代码可以删除
- 本地库:将暂存区的代码提交到本地库,会生成历史版本,代码无法删除。本地库的代码可以根据情况推送到远程库,也可从远程库中拉取。
Git代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简称为远程库。
局域网
GitLab
互联网
GitHub(国外)
Gitee(国内)
Git安装
Git官网:https://git-scm.com/
此处安装环境为Windows,官网下载好对应版本的安装包,双击运行即可
- GNU协议,Next
- 选择安装目录位置,不要有中文和空格,Next
- 选择组件,基本默认即可。分别有:桌面快捷方式、windows右键菜单、大文件支持、使用默认的文件编辑器关联git的所有配置文件、关联.sh格式文件、每日检测更新、添加git bash配置文件到windows终端、追加大规模库,Next
- 选择开始菜单文件夹,Next
- 选择默认编辑器,一般选择Vim,Next
- 设置初始化分支的名称,选择默认的master即可,Next
- 设置环境变量,选择"Use Git from Git Bash only",Next
- 选择后台客户端连接协议,选择"Use bundled OpenSSH",Next
- 选择后台HTTPS连接协议,选择"Use the native Windows Secure Channel library",Next
- 配置行末换行符,选择"Checkout Windows-style, commit Unix-style line endings",系统自动转换,Next
- 选择Git Bash的终端类型,选择"Use MinTTY (the default terminal of MsYS2)",Next
- 选择默认的git pull行为,选择"Fast-forward or merge",默认的合并模式,Next
- 选择凭据管理器,选择"Git Credential Manager",跨平台的凭据管理器,Next
- 选择其他配置,"Enable file system caching"使用文件缓存机制,"Enable symbolic links"使用符号链接,Install直至安装完成即可。
- 右键任意位置,在右键菜单里选择Git Bash Here即可打开Git Bash命令行终端
Git常用命令
| 命令名称 | 作用 |
|---|---|
| git config --global user.name | 设置用户签名:用户名 |
| git config --global user.email | 设置用户签名:虚拟邮箱(不会验证) |
| git init | 初始化本地库 |
| git status | 查看本地库状态 |
| git add | 添加到暂存区 |
| git commit -m "描述信息" | 提交到本地库 |
| git reflog | 查看历史记录 |
| git reset --hard | 版本穿梭 |
设置用户签名

说明:签名的作用是区分不同操作者的身份。用户的签名信息在每一个版本的提交信息中都能够看到,以此确认本次提交是谁做的。Git首次安装必须设置一下用户签名,否则无法提交代码。
注意:这里设置用户签名和将来登录GitHub或其他代码托管中心的账号没有任何关系。
我们设置的用户签名信息可以在Windows当前用户家目录中的.gitconfig配置文件中查看。如:C:\Users\Admin.gitconfig

初始化本地库
git init

此时在Windows环境的当前目录下会生成一个.git的隐藏文件夹

git bash客户端命令行也可以查看,Linux命令通用,都是一个人开发的。

查看本地库状态
git status

新增文件

再次查看本地库状态

添加暂存区
git add {文件名}

再次查看本地库状态

此时,暂存区的文件可以被删除

但是原文件没有被删除

继续添加文件到暂存区,并查看本地库状态

提交本地库
git commit -m "日志信息" 文件名

查看本地库

查看版本信息

修改文件

查看本地库

添加暂存区并查看本地库状态

提交本地库

查看本地库状态

查看版本

查看修改后的文件内容

是基于第一次提交内容的修改后的文件
再次修改文件

添加暂存区并提交本地库

查看本地库并查看版本

查看文件内容

当前指针指向的是第三次提交的文件,所以查看的内容也是第三次修改后的。
历史版本
查看历史版本
git reflog #查看版本信息
git log #查看版本详细信息
版本穿梭
git reset --hard {版本号}

查看文件内容,发现是第二个版本的内容

可以查看当前工作区下.git目录下的HEAD文件,会显示当前指针所在的分支;也可查看refs文件夹下的heads下的master文件,会显示当前指针所指的版本


Git切换版本,底层其实是移动的HEAD指针
Git分支操作
在版本控制过程中,同时推进多个任务,我们就可以为每个任务创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。
分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支的操作
| 命令名称 | 作用 |
|---|---|
| git branch 分支名 | 创建分支 |
| git branch -v | 查看分支 |
| git checkout 分支名 | 切换分支 |
| git merge 分支名 | 把指定的分支合并到当前分支上 |
查看分支
git branch -v

创建分支
git branch {分支名}

切换分支
git checkout {分支名}

在切换后的分支上修改文件内容

将修改后的文件添加暂存区、提交本地库,并查看文件内容

合并分支
先从hot-fix分支切回到master分支

git merge {要合并的分支名}

查看当前master分支的文件内容

合并冲突
产生冲突的原因:合并分支时,两个分支在同一个文件有两套完全不同的修改。Git无法替我们决定使用哪一个,必须人为决定新代码内容。
合并冲突产生实例:
- 修改master分支下文件的内容
![9d6f87a8cf714ac2853f4c7a8d6ce4da]()
![9d6f87a8cf714ac2853f4c7a8d6ce4da (1)]()
- 切换到hot-fix分支下,并修改文件内容
![90895e68ee574d4ab6a4fd5e099eba76]()
![90895e68ee574d4ab6a4fd5e099eba76 (1)]()
- 再次切换到master分支下,将hot-fix分支合并到master分支,发现产生了报错
![image]()
- 查看本地库状态,提示两个文件都被修改了,需要手动合并
![image]()
- 打开文件会发现,git已经提示什么地方冲突了
![image]()
手动解决代码冲突
![image]()
保存文件内容,并添加暂存区、提交本地库,此时不能带文件名,否则会报错
![image]()
查看合并完成之后的文件内容
![image]()
此时,查看hot-fix分支下的文件内容,发现没有被修改。Git合并的只是当前分支下的代码
![image]()
master、hot-fix其实都是指向具体版本记录的指针。当前所在的分支,其实是由HEAD决定的,所以创建分支的本质就是多创建一个指针
HEAD如果指向master,那么我们现在就在master分支上
HEAD如果指向hot-fix,那么我们现在就在hot-fix分支上
所以切换分支的本质就是移动HEAD指针
Git团队协作机制
团队内协作

跨团队协作

GitHub操作
GitHub网址:https://github.com/
创建远程仓库

创建成功后,会生成远程仓库的HTTPS和SSH链接

创建远程仓库别名
由于远程仓库的HTTPS和SSH链接地址太长,所以需要在本地创建远程仓库的别名,创建完成后会有拉取和推送的两个别名
git remote -v #查看当前所有远程地址别名
git remote add {别名名称} {远程仓库地址} #创建远程仓库别名

推送本地分支到远程仓库
推送的最小单位是分支
git push {别名} {分支}

提示认证成功

推送本地库的master分支到远程库,100%

在github远程库中可以查看到推送成功的代码文件

对代码文件进行编辑修改后提交

本地拉取远程库被修改后的代码文件
git pull 别名 分支
提示拉取成功,1行文件被修改,一行增加

查看本地库代码,发现是与远程库代码内容一样

团队内其他成员可以克隆这个远程仓库,前提该成员是需要知道远程仓库的HTTPS或者SSH地址
克隆代码是不需要登录远程仓库的账号
git clone {远程仓库的HTTPS或者SSH地址链接}
新建一个git-jfx的文件夹,在该文件夹下做克隆操作

克隆完成后,在文件夹git-jfx下会生成git-demo本地库,且有origin的远程库别名
clone会做以下操作:
- 拉取代码
- 初始化本地库
- 创建别名
![]()
在git-jfx文件夹下对代码做修改
![]()
![]()
推送到远程仓库(如果是其他人推送,则需要登录远程仓库;并且需要该成员加入这个远程仓库)
![]()
将其他人加入这个远程仓库,使其具有推送代码的权限
![]()
刷新远程仓库,发现代码已更新
![]()
如果不是团队内成员(即远程仓库没有邀请加入的人),该团队外的成员需要在自己的远程仓库去fork别人的代码,然后git clone到本地库进行修改,或者在github上修改提交后,点击pull requests,在对方的pull requests中可以查看,确定代码无误后,点击merge pull request进行合并,点击confirm merge确认合并,合并完成后即可看到代码。
自建代码托管平台GitLab
GitLab简介
GitLab是由GitLabInc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizov开发,它使用Ruby语言写成。后来,一些部分用Go语言重写。截止2018年5月,该公司有290名团队成员,以及2000多名开源贡献者。GitLab被IBM,Sony,JulichResearchCenter,NASA,Alibaba,Invincea,O’ReillyMedia,Leibniz-Rechenzentrum(LRZ),CERN,SpaceX等组织使用。
GitLab官网地址:https://about.gitlab.com/
GitLab安装
准备一个虚拟机环境
gitlab官网如果不能轻易被访问,可以去清华大学镜像站找到gitlab-ce社区版的yum仓库配置文件
RHEL/CentOS系统:新建 /etc/yum.repos.d/gitlab-ce.repo,内容为:
[gitlab-ce] name=Gitlab CE Repository baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck=0 enabled=1
再执行
yum makecache
yum -y install gitlab-ce
安装完成之后,再继续安装一些其他必须的软件
yum -y install openssh-server cronie postfix
初始化GitLab服务
gitlab-ctl reconfigure
此过程需要执行几分钟,期间会疯狂打印日志,请耐心等待,直至出现以下信息表示初始化完成

启动GitLab服务
gitlab-ctl start

通过浏览器输入gitlab服务器地址可以进行访问。如果没有账号,可以进行注册。

gitlab的root初始密码在/etc/gitlab/initial_root_password中。该密码会在第一次登录后的24小时之后自动被清理,所以需要及时修改root账号的密码。

修改密码步骤如下,修改完成后重新登录即可

创建远程仓库





















浙公网安备 33010602011771号