Git分支及其协同开发

Git分支

Git鼓励在工作流程中频繁的使用分支与合并,哪怕一天之内进行很多次
1:Git的必杀技特性:分支模型
2:Git分支处理非常的轻量级,可以瞬间完成新建分支
3:分支切换比较快捷方便
4:分支是Git强大独特的地方
想要很好的理解Git分支,需要先理解Git是如何保存数据的

Git是如何保存数据的

上一篇文章中说到,Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。
1:git add暂存的操作步骤
1:通过SHA-1哈希算法为每个文件计算校验和,校验和和文件名是一一对应的
2:使用blob对象将当前版本的文件快照保存到Git仓库中
3:将检验和信息加入到暂存区域等待提交操作
检验和:长度为40的SHA-1值字符串

首先通过git add把文件加入到暂存区域
在这里插入图片描述
然后通过git ls-files查看暂存区域中有哪些文件,然后再通过git ls-files -s – a.txt或者使用git ls-files -s查看文件对应的blob对象
在这里插入图片描述
通过git cat-file -p 对应的检验和值 可以查看文件中的内容
在这里插入图片描述
文件快照:是指添加文件那一时刻的文件内容

2:git commit的操作步骤
1:按照提交的文件目录,计算每个目录的检验和
2:仓库中将上面的目录结构、对应的检验和保存为树对象
3:创建一个提交对象,包含了树对象指针、提交信息
4:为后面需要的时候重现本次保存的快照

测试时建立了一个文件夹然后在里面新建了两个文件,然后提交它们
在这里插入图片描述
通过git log查看提交日志:
可以看到commit后面有一串字符串,就是提交对象
在这里插入图片描述
通过git cat-file -p命令可以看到对应的树对象和提交的信息
在这里插入图片描述
然后再次查看,可以看到下面有blog对象和树对象
在这里插入图片描述
保存在Git数据库中的内容都是使用校验和哈希值来做索引的,不是用文件名
此时git仓库中的对象,简单使用下面图示说明:
在这里插入图片描述
1:两个blog对象,保存了文件快照
2:一个树对象,记录了目录结构和和blog对象索引
3:一个提交对象,包含指向前面树对象指针和提交信息

做出修改后再次提交:
修改后再次提交,产生的提交对象中会包含一个指向上次提交对象的指针:parent
在这里插入图片描述
第一次提交parent为空,后面每次更新提交都有一个parent指向上次的提交对象

Git分支的本质

Git分支本质上是:指向提交对象的可变指针,默认分支名字是master;master分支会在每次的提交操作中自动向前移动
在这里插入图片描述
master分支并不是一个特殊的分支,它和其他分支没有区别,git init命令默认创建的是master分支,名字可以修改

Git分支的操作

1:创建分支
Git创建一个新分支,只是创建了一个可以移动的新指针
git branch 分支名称: 只创建一个新分支,并不切换分支
在这里插入图片描述
git checkout -b 分支名称:创建并且切换分支
在这里插入图片描述
根据上图可以清楚的看出两种创建分支的区别
在这里插入图片描述
看到上面的图,或许会有疑问,master和dev都指向同一个提交对象,那么它不还是同一个吗?下面将会解释
怎么知道当前是在哪一个分支上面呢?
通过名为HEAD的特殊指针,指向当前所在的本地分支
在这里插入图片描述
通过 git log --oneline --decorate查看各个分支当前所指的对象,及查看当前所在的分支
在这里插入图片描述
可以看到当前所在的分支是master,三个分支都指向同一个提交对象b36b052
2:分支切换
通过git checkout 分支名称命令切换分支:
在这里插入图片描述
在这里插入图片描述
当提交一次时,dev分支会随着提交操作自动向前移动
在这里插入图片描述
在这里插入图片描述
然后切换到master分支再次提交一次,master会向前移动,提交历史会产生分叉
在这里插入图片描述
在这里插入图片描述
查看分叉历史:
可以通过git log --oneline --decorate --graph --all命令查看
在这里插入图片描述
Git分支总结
1:Git分支只包含所指对象校验和的文件,创建和销毁非常高效
2:创建一个新分支就相当于往一个文件中写入41字节(40字节的校验和与一个换行符)
3:根据父对象寻找共同的祖先进行合并同样的高效
4:鼓励开发人员频繁的创建和使用分支

其他版本的控制系统:
1:创建分支将项目文件复制一遍,保存到特定的目录
2:项目越大,耗费的时间就越长
3:使用分支
在这里插入图片描述
4:使用分支修复紧急的问题
在这里插入图片描述
假如现在正在dev上进行开发,然后主管过来说之前上线的版本出了一个问题,很急切的需要修复,那么,我们可以创建一个新的分支去修改问题:
在这里插入图片描述
在这里插入图片描述
创建新分支hotfix,在上面进行开发修复问题,测试确保修复了bug,然后我们就需要把hotfix的代码合并到master上去,因为正常使用来说,master是保持一个稳定的版本,很少去直接修改它
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
合并之后,最新的修改已经在master上面了,可以进行发布了;hotfix和master没有分歧或者说是修改了同一个文件,可以快进合并(fast-forward),只需要将master指针向前移动即可
然后可以删除无用的分支hotfix,通过命令git branch -d 分支名称删除
在这里插入图片描述
在这里插入图片描述
5:合并分支
非直接先祖的合并
现在需要合并C2、C3该怎么操作?
在这里插入图片描述
一个合并提交操作:
master分支所在的提交不是dev分支所在提交的直接先祖
Git用两个分支的末端快照(C2和C3)以及共同祖先(C1),进行合并
将三方合并结果做成新的快照并自动创建的新提交(C4)
不需要dev分支时,可以删除
在这里插入图片描述
6:合并时反生冲突
在两个分支中对同一个文件同一个地方进行了修改,合并时会发生冲突
Git会做合并,但是不会创建一个新的合并提交,需要自己去解决冲突
在这里插入图片描述
在这里插入图片描述
打开文件可以看到冲突的地方
在这里插入图片描述
解决冲突:
1:打开包含冲突的文件然后手动解决冲突
2:可以保留一方的修改,也可以合并两方的修改
3:删除<<<<<、======、>>>>>
4:使用git add标记为冲突已解决
在这里插入图片描述

远程仓库与本地仓库分支开发

1:从远程仓库拉取代码
通过git clone命令可以从远程仓库把代码拉取到本地,在本地中,有远程分支和本地的master分支,远程分支是和远程仓库中的分支一一对应的
在这里插入图片描述
2:远程仓库和本地提交修改
本地修改后的代码可以合并到远程仓库
在这里插入图片描述
3:拉取远程差异
当有人提交代码合并到远程仓库时,可以使用git fetch命令把这部分提交的内容拉取到本地的远程分支上(origin是远程仓库的名字,拉取代码的时候可以通过下面的命令修改:git clone -o 仓库名称)
在这里插入图片描述

一个项目多个远程仓库

一个项目也许会有多个远程仓库,可以拉取多个远程仓库到本地
1:添加新的远程仓库
通过git remote add [shortName] [url] 命令可以添加一个新的远程仓库
在这里插入图片描述
2:从新的仓库拉取差异
同样的,可以使用git fetch命令拉取
在这里插入图片描述

远程仓库操作命令

1:git push origin serverfix:x 推送本地serverfix分支到远程x分支
2:git checkout --track origin/x 跟踪远程分支x
3:git checkout -b serverfix origin/x 拉取基于远程的本地工作分支
4:git fetch origin 抓取本地没有的数据,不修改工作内容,拉取到本地的远程分支上,需要自己合并内容
5:git pull origin 等同于git fetch接着git merge,单独使用后面两个命令更加清楚
6:git push origin --delete x 删除远程分支,服务器会保留数据一段时间等待垃圾回收运行

协同开发

1:长期分支工作模式
渐进稳定分支的流水线模式
各个分支的作用:
master:保留完全稳定的代码
develop:用来做后续开发或者测试稳定性,一旦达到稳定状态可以合并到master
topic:完成某个特性的分支
在这里插入图片描述
随着提交的不断进行,即指针一直向右移动,稳定分支master会落后一大截,前沿分支的指针比较靠前
在这里插入图片描述
这种方式的优点:
1:用这种方式可以维护不同层次的稳定性
2:每个分支具有不同级别的稳定性
3:当它们稳定后,再合并到具有更高稳定性的分支中
4:再庞大或者复杂的项目中,这种模式很有帮助

2:特性分支工作模式
特性分支是一种短期分支,用来实现单一特性或者相关工作
在这里插入图片描述
然后如果分支进行了合并,简单画图如下:
在这里插入图片描述
特性分支对任何规模的项目都适用

Git flow工作流

其中有两个比较重要的点:
1: master
存放正式发布的版本,可以作为项目历史版本记录分支,不直接提交代码,仅用于保持一个线上运行代码的code base
2: develop
分支为主开发分支,一般不直接提交代码
在这里插入图片描述
紧急修复线上的bug,可以从matser拉取一个hotfix分支进行修复,修复完成后合并到master分支和develop分支;其他一般基础开发的部分是从develop上进行拉取分支,一般来说,develop不直接提交代码,完成开发的测试工作一般是在release分支进行,因为develop分支上可能会有多个开发人员进行代码的合并,可能会影响到测试的结果
Git flow工作流程是围绕项目发布定义的严格分支模型,比特性分支模型复杂,为大规模项目提供了一个框架

分支介绍:
1:release
基于最新的develop分支创建,当开发的新功能足够发布一个新的版本(或者接近新版本发布的截止日期),从develop分支创建一个release分支作为新版本的起点,用于测试,所有的测试Bug都在这个分支进行修改。测试完成后合并到master分支并打上版本号,同时也合并到develop分支,更新最新的开发分支,(一旦有了release分支之后,不要从develop分支上合并新的改动到release分支),同一时间只有一个,生命周期很短,只是为了发布

2:hotfix
分支是基于master分支创建的,主要目的是对线上版本的Bug进行修复,完成后直接合并到master分支和develop分支,如果当前还有新功能release分支,也同步到release分支上,同一时间只有一个,生命周期很短

3:feature
这个分支是新功能分支,feature分支都是基于develop分支创建的,开发完成后会合并到develop分支上,可以同时存在多个
在这里插入图片描述

GitLub安装搭建

下面通过演示国内CentOS7的镜像安装包的方式来搭建GitLub
1:安装依赖软件

sudo yum install -y curl policycoreutils-python openssh-server openssh- client postfix
#设置ssh服务开机启动
sudo systemctl enable sshd
sudo systemctl start sshd
#设置postifx邮件服务开机自启动
sudo systemctl enable postfix
sudo systemctl start postfix

2:下载gitlab安装包
在清华大学开源软件镜像站,https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce下面也能找到更加 新的版本,以及gitlab-ee版本

#安装wget
yum -y install wget

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm

rpm -i gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm

3:修改gitlab配置
指定gitlab服务器ip和自定义端口,设置为自己机器的ip地址和端口号,后面在浏览器登录gitlab会用到这个地址

vim /etc/gitlab/gitlab.rb
external_url "http://ip:port"

4:重置并启动GitLab

#查看gitlab所有安装包的文件存储位置
rpm -qal |grep gitlab
#进入gitlab文件位置,我的例子中在/opt/gitlab目录
bin/gitlab-ctl reconfigure
bin/gitlab-ctl restart

5: 用户名密码设置

sudo bin/gitlab-rails console production
Loading production environment (Rails 4.1.12)
irb(main):001:0> u=User.where(id:1).first
=> #<User id: 1, email: "[email protected]", encrypted_password: "$2a$10$foLIteHM6rRrV/crdQU1POzH84T.Bz2L6FbzvPIMTgm...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2020-02-23 04:18:10", updated_at: "2020-02-23 04:18:11", name: "Administrator", admin: true, projects_limit: 10000, skype: "", linkedin: "", twitter: "", authentication_token: "A6khrCzAC5yqBvJQ-hVg", theme_id: 2, bio: nil, failed_attempts: 0, locked_at: nil, username: "root", can_create_group: true, can_create_team: false, state: "active", color_scheme_id: 1, notification_level: 1, password_expires_at: "2020-02-23 04:18:09", created_by_id: nil, last_credential_check_at: nil, avatar: nil, confirmation_token: "XcbcpbBEdxVgYCTJS-kL", confirmed_at: "2020-02-23 04:18:11", confirmation_sent_at: "2020-02-23 04:18:10", unconfirmed_email: nil, hide_no_ssh_key: false, website_url: "", notification_email: "[email protected]", hide_no_password: false, password_automatically_set: false, location: nil, encrypted_otp_secret: nil, encrypted_otp_secret_iv: nil, encrypted_otp_secret_salt: nil, otp_required_for_login: false, otp_backup_codes: nil, public_email: "", dashboard: 0, project_view: 0, consumed_timestep: nil>
irb(main):002:0> u.password='12345678'
=> "12345678"
irb(main):003:0> u.password_confirmation='12345678'
=> "12345678"
irb(main):004:0> u.save!
=> true
irb(main):005:0> exit

6:登录检测
根据前面配置的ip和端口号到浏览器进行访问,通过前面配置的用户名和密码进行登录
在这里插入图片描述
在这里插入图片描述
通过浏览器访问出现上面的内容即搭建成功,在此之前可能会出现无法访问的情况,需要关闭防火墙和开放上面设置的端口,具体操作如下:

CentOS7防火墙设置

CentOS 7默认使用firewalld服务操作防火墙,默认处于开启状态。通过firewall-cmd命令可以操作防火墙

1:查看防火墙状态
systemctl status firewalld
在这里插入图片描述
2:查看防火墙规则
firewall-cmd --list-all
在这里插入图片描述
如果添加了8080/tcp的规则,就是这样:
在这里插入图片描述
默认时没有开发任何端口和协议,但开放了ssh服务,所以网络连接设置成功后,就可以在终端程序中直接通过ssh登录系统

3:开放端口
firewall-cmd --zone=public --add-port=1000/tcp --permanent
参数说明:
• --zone:指定规则应用的区域,通过firewall-cmd --get-active-zones可以查看网卡所属的区域,一般情况下指定public即可。
• --add-port:指定需要开放的端口和协议。
• --permanent:表示永久生效,没有此参数重启后会失效。
添加端口后,需要重新加载配置才能生效。

4:移除端口
移除端口使用–remove-port参数,移除端口后也要重新加载配置才能生效
firewall-cmd --zone= public --remove-port=8080/tcp --permanent

5:重新加载防火墙配置
重新加载防火墙配置可以使用–reload参数
firewall-cmd --reload
或者重启防火墙服务
systemctl restart firewalld

6:关闭防火墙
如果需要关闭防火墙,直接停止firewalld服务即可
systemctl stop firewalld
防火墙关闭后不会有任何提示,可以使用systemctl status firewalld命令查看服务状态
在这里插入图片描述
防火墙关闭后firewall-cmd命令就无法使用了
在这里插入图片描述
但停止firewalld服务只能临时关闭,重启后会再次开启,如果需要永久关闭,还需要将firewalld服务禁止掉
systemctl disable firewalld

使用GitLub

下面通过idea演示使用GitLub
在设置中点击GitHub然后添加账号和密码
在这里插入图片描述
然后在VCS中点击下面的内容选择Git
在这里插入图片描述
输入Git仓库中项目的地址clone项目到本地
在这里插入图片描述
成功之后在右下角可以看到下面的内容:
在这里插入图片描述
在这里插入图片描述
点击New Branch可以新建分支,选中分支,点击左侧checkout可以切换分支
在这里插入图片描述
修改文件后右键文件可以提交:
在这里插入图片描述
也可以选择导航栏上的按钮进行提交
在这里插入图片描述

结束语

总体的Git分支相关的内容到这就结束了,具体的根据不同的ide有不同的操作方式,可以自己操作下加深使用的印象

猜你喜欢

转载自blog.csdn.net/qq_34365173/article/details/106752892