Git分布式版本控制系统介绍
Git分布式版本控制系统介绍
1.1Git诞生历史
Linustorvalds
在1991年时发布了Linux
操作系统,从那以后Linux
系统变不断发展壮大,因为Linux
系统开源的特性,所以一直接受着来自全球Linux
技术爱好者的贡献,志愿者们通过邮件向Linus
发送着自己编写的源代码文件,然后由Linus
本人通过手工的方式将代码合并,但这样不仅没有效率,而且真的是太痛苦了。一直到2002年,Linux
系统经过十余年的不断发展,代码库已经庞大到无法再让Linus
通过手工的方式管理了,但是Linus真的很不喜欢CVS
或者Subversion
版本控制系统,于是商业公司BitMover
决定将其公司的BitKeeper
分布式版本控制系统授权给Linux
开发社区来免费使用,当时的BitKeeper
可以比较文件内容的不同,还能够将出错的文档还原到历史某个状态,Linus
终于放下了心里的石头。
CVS
和Subversion
属于传统的版本控制系统,而分布式版本控制系统最大的特点是不需要每次提交都把文件推送到版本控制服务器,而是采用分布式版本库的机制,使得每个开发人员都够从服务器中克隆一份完整的版本库到自己计算机本地,不必再完全依赖于版本控制服务器,使得源代码的发布和合并更加方便,并且因为数据都在自己本地,不仅效率提高了,而且即便我们离开了网络依然可以执行提交文件、查看历史版本记录、创建分支等等操作,真的是开发者的福音啊。就这样平静的度过了三年时间,但是Linux
社区聚集着太多的黑客人物,2005年时,那位曾经开发Samba
服务程序的Andrew
因为试图破解BitKeeper
软件协议而激怒了BitMover
公司,当即决定不再向Linux
社区提供免费的软件授权了,此时的Linus
其实也早已有自己编写分布式版本控制系统的打算了,于是便用C语言花了2周创建了Git
分布式版本控制系统,并上传了Linux
系统的源代码。
Git
不仅是一款开源的分布式版本控制系统,而且有其独特的功能特性,例如大多数的分布式版本控制系统只会记录每次文件的变化,说白了就是只会关心文件的内容变化差异,而Git则是关注于文件数据整体的变化,直接会将文件提交时的数据保存成快照,而非仅记录差异内容,并且使用SHA-1加密算法保证数据的完整性。
Git为了提高效率,对于没有被修改的文件,则不会重复存储,而是创建一个链接指向之前存储过的文件。
在正式使用前,我们还需要弄清楚Git的三种重要模式,分别是已提交、已修改、已暂存
已提交(committed):表示数据文件已经顺利提交到Git数据库中。
已修改(modified):表示数据文件已经被修改,但未被保存到Git数据库中。
已暂存(staged):表示数据文件已经被修改,并会在下次提交时提交到Git数据库中。
提交前的数据文件可能会被随意修改或丢失,但只要把文件快照顺利提交到Git数据库中,那就可以完全放心了,流程为:
在工作目录中修改数据文件–>将文件的快照放入暂存区域—>将暂存区域的文件快照提交到Git仓库中。
1.2 版本控制系统介绍
1.2.1 什么是版本控制系统(version control system)
版本控制系统就是将每一次文件(代码)的变化,集中在一个系统中加以版本记录,以便后续查阅特定文件(代码)版本的历史记录。
例如:产品要求开发A
功能,只有项目有需要修改为B
功能,开发万之后又要修改为C
功能,最后又要回到A功能;如果没有版本控制系统,操作起来非常麻烦。
常见(传统)版本控制管理方式:
现在的版本控制系统又是如何管理的?能对比版本之间的区别,同事还可以实现快速回退功能。
1.2.2 版本控制系统解决的问题
- 追溯文件(程序)历史变更;
- 多人团队协作开发项目;
- 代码集中统一管理。
1.2.3 版本控制系统工具
常见的版本控制系统分为两种:
- 集中版本控制系统:
svn
代表; - 分布式版本控制系统:
git
代表。
1.2.3.1 什么是集中式版本控制系统(svn
)
集中式版本控制系统只有一个中央数据仓库,如果中央数据仓库出现故障,所有的使用者都无法正常使用svn
,因为每次进行版本控制工作都需要与远程服务器建立通信,否则无法工作。
1.2.3.2 分布式版本控制系统(git
)
相对于集中式版本控制系统,分布式版本控制系统会将远程代码仓库完整镜像下来,进行本地离线版本控制,每一次的提交都不依赖远程服务器,如有无法与中央仓库进行联络,待有网络时再与中央仓库进行版本同步即可。
1.3Git环境准备
#查看系统版本
[root@gitlab ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
#查看内核版本
[root@gitlab ~]# uname -r
5.13.8-1.el7.elrepo.x86_64
#关闭SElinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g'/etc/sysconfig/selinux
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
#查看IP地址
[root@gitlab ~]# ifconfig | grep 'inet' | awk -F '[ /]+' 'NR==1 {print $3}'
10.0.0.14
#时间同步
yum -y install ntpdate
ntpdate ntp1.aliyun.com
1.4Git的安装部署
1.4.1Git仓库介绍
Git是分布式的版本控制系统,我们只要有了一个原始Git版本仓库,就可以让其他主机克隆走这个原始版本仓库,从而使得一个Git版本仓库可以被同时分布到不同的主机之上,并且每台主机的版本库都是一样的,没有主次之分,极大的保证了数据安全性,并使得用户能够自主选择向那个Git服务器推送文件了,其实部署一个git服务器是非常简单的。
1.4.2Git的安装
#安装git
yum -y install git
#Git版本
git --version
git version 1.8.3.1
1.4.3Git的用户信息配置
在使用Git之前必须配置用户信息
git config --global user.name "gm-medicare-xcz" #配置git使用用户
git config --global user.email "xuchangzhi@GM-Medicare.com" #配置git使用邮箱
git config --global color.ui true
git config --list
user.name=gm-medicare-xcz
user.email=xuchangzhi@GM-Medicare.com
color.ui=true
#git用户信息文件查看
cat ~/.gitconfig
[user]
name = gm-medicare-xcz
email = xuchangzhi@GM-Medicare.com
[color]
ui = true
1.4.4Git仓库搭建
#创建仓库目录
mkdir gm-demo
cd gm-demo/
#初始化仓库
git init
Initialized empty Git repository in /root/gm-demo/.git/
1.5Git常用命令
add #添加文件内容至索引
bisect #通过二分查找定位引入 bug 的变更
branch #列出、创建或删除分支
checkout #检出一个分支或路径到工作区
clone #克隆一个版本库到一个新目录
commit #记录变更到版本库
diff #显示提交之间、提交和工作区之间等的差异
fetch #从另外一个版本库下载对象和引用
grep #输出和模式匹配的行
init #创建一个空的 Git 版本库或重新初始化一个已存在的版本库
log #显示提交日志
merge #合并两个或更多开发历史
mv #移动或重命名一个文件、目录或符号链接
pull #获取并合并另外的版本库或一个本地分支
push #更新远程引用和相关的对象
rebase #本地提交转移至更新后的上游分支中
reset #重置当前HEAD到指定状态
rm #从工作区和索引中删除文件
show #显示各种类型的对象
status #显示工作区状态
tag #创建、列出、删除或校验一个GPG签名的 tag 对象
1.6Git基本操作
1.6.1Git提交数据
我们可以简单的把工作目录理解成是一个被Git服务程序管理的目录,Git会时刻的追踪目录内文件的改动,另外在安装好了Git服务程序后,默认就会创建好了一个叫做master的分支,我们直接可以提交数据到了。
Git如何将本地文件提交至仓库?
#在本地创建三个文件
[root@gitlab ~/gm-demo]# touch file{1..3}
[root@gitlab ~/gm-demo]# ll
总用量 0
-rw-r--r-- 1 root root 0 8月 7 00:11 file1
-rw-r--r-- 1 root root 0 8月 7 00:11 file2
-rw-r--r-- 1 root root 0 8月 7 00:11 file3
#查看文件状态
[root@gitlab ~/gm-demo]# git status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# file1
# file2
# file3
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
#将文件提交到暂存区
[root@gitlab ~/gm-demo]# git add .
#查看文件状态
[root@gitlab ~/gm-demo]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached <file>..." 撤出暂存区)
#
# 新文件: file1
# 新文件: file2
# 新文件: file3
#
#将文件提交至Git数据库内
[root@gitlab ~/gm-demo]# git commit -m "file1-file3"
[master(根提交) e7f7156] file1-file3
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1
create mode 100644 file2
create mode 100644 file3
!
1.6.2Git移除数据
有些时候会向把已经添加到暂存区的文件移除,但仍然希望文件在工作目录中不丢失,换句话说,就是把文件从追踪清单中删除。
#创建一个文件
[root@gitlab ~/gm-demo]# touch gm-database
#将文件添加至暂存区
[root@gitlab ~/gm-demo]# git add gm-database
[root@gitlab ~/gm-demo]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: gm-database
#将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)
[root@gitlab ~/gm-demo]# git rm --cached gm-database
rm 'gm-database'
[root@gitlab ~/gm-demo]# git status
# 位于分支 master
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# gm-database
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
#1、再将database文件提交到git暂存区
[root@gitlab ~/gm-demo]# git add gm-database
#2、但如果在删除之前数据文件已经被放入到暂存区域的话,git会担心你误删未提交的文件而报错信息,此时可追加强制删除“-f”参数。
[root@gitlab ~/gm-demo]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: gm-database
#
[root@gitlab ~/gm-demo]# git rm -f gm-database
rm 'gm-database'
#查看Git状态
[root@gitlab ~/gm-demo]# git status
# 位于分支 master
无文件要提交,干净的工作区
#查看工作区也没gm-database文件
[root@gitlab ~/gm-demo]# ls
file1 file2 file3
1.6.3Git移动数据
#查看本地仓库文件
[root@gitlab ~/gm-demo]# ls
file1 file2 file3
#git如果要修改文件名称,则使用git mv命令
[root@gitlab ~/gm-demo]# git mv file1 file4
#查看Git状态发现下次提交会有一个改名操作
[root@gitlab ~/gm-demo]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 重命名: file1 -> file4
#
#提交到git版本仓库
[root@gitlab ~/gm-demo]# git commit -m "changed file1->file4"
[master 61b1f7c] changed file1->file4
1 file changed, 0 insertions(+), 0 deletions(-)
rename file1 => file4 (100%)
[root@gitlab ~/gm-demo]# git status
# 位于分支 master
无文件要提交,干净的工作区
#再次查看本地仓库文件
[root@gitlab ~/gm-demo]# ls
file2 file3 file4
1.6.4Git历史记录
#查看提交历史记录
[root@gitlab ~/gm-demo]# git log
commit 61b1f7c27142c5c1a8f213e1c5411bfa0c4cb09c
Author: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
Date: Mon Aug 9 15:36:47 2021 +0800
changed file1->file4
commit e7f715649b8689c5479cc7cda14acff4217351c0
Author: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
Date: Sat Aug 7 00:13:04 2021 +0800
file1-file3
#查看最近几条记录
[root@gitlab ~/gm-demo]# git log -1
commit 61b1f7c27142c5c1a8f213e1c5411bfa0c4cb09c
Author: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
Date: Mon Aug 9 15:36:47 2021 +0800
changed file1->file4
#-p显示每次提交的内容差异,例如仅查看最近一次差异
[root@gitlab ~/gm-demo]# git log -p -1
commit 61b1f7c27142c5c1a8f213e1c5411bfa0c4cb09c
Author: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
Date: Mon Aug 9 15:36:47 2021 +0800
changed file1->file4
diff --git a/file1 b/file1
deleted file mode 100644
index e69de29..0000000
diff --git a/file4 b/file4
new file mode 100644
index 0000000..e69de29
#--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息
[root@gitlab ~/gm-demo]# git log --stat -2
commit 61b1f7c27142c5c1a8f213e1c5411bfa0c4cb09c
Author: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
Date: Mon Aug 9 15:36:47 2021 +0800
changed file1->file4
file1 | 0
file4 | 0
2 files changed, 0 insertions(+), 0 deletions(-)
commit e7f715649b8689c5479cc7cda14acff4217351c0
Author: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
Date: Sat Aug 7 00:13:04 2021 +0800
file1-file3
file1 | 0
file2 | 0
file3 | 0
3 files changed, 0 insertions(+), 0 deletions(-)
#--pretty根据不同的格式展示提交的历史信息
git log --pretty=oneline
cb944f4b89df502256b94106ab3deafcd84c17e4 changede name
225081ad4b59b8bbd66b7a73c35688471876d227 file1~file3
#以更详细的模式输出提交的历史记录
[root@gitlab ~/gm-demo]# git log --pretty=fuller -2
commit 61b1f7c27142c5c1a8f213e1c5411bfa0c4cb09c
Author: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
AuthorDate: Mon Aug 9 15:36:47 2021 +0800
Commit: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
CommitDate: Mon Aug 9 15:36:47 2021 +0800
changed file1->file4
commit e7f715649b8689c5479cc7cda14acff4217351c0
Author: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
AuthorDate: Sat Aug 7 00:13:04 2021 +0800
Commit: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
CommitDate: Sat Aug 7 00:13:04 2021 +0800
file1-file3
#还可以使用format参数来指定具体的输出格式,这样非常便于后期编程的提取分析哦,常用的格式有:
%s 提交说明。
%cd 提交日期。
%an 作者的名字。
%cn 提交者的姓名。
%ce 提交者的电子邮件。
%H 提交对象的完整SHA-1哈希字串。
%h 提交对象的简短SHA-1哈希字串。
%T 树对象的完整SHA-1哈希字串。
%t 树对象的简短SHA-1哈希字串。
%P 父对象的完整SHA-1哈希字串。
%p 父对象的简短SHA-1哈希字串。
%ad 作者的修订时间。
#查看当前所有提交记录的简短SHA-1哈希字串与提交着的姓名
[root@gitlab ~/gm-demo]# git log --pretty=format:"%h %cn"
61b1f7c gm-medicare-xcz
e7f7156 gm-medicare-xcz
1.6.5Git还原数据
#在file2文件内追加内容“Git is a version control system”
echo "git is a version control system" >> file2
#添加至暂存区
[root@gitlab ~/gm-demo]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: file2
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@gitlab ~/gm-demo]# git add file2
#提交至本地仓库
[root@gitlab ~/gm-demo]# git commit -m "introduction software"
[master 6146fe4] introduction software
1 file changed, 2 insertions(+)
#此时觉得写得不妥,想还原某一次提交的文件快照,查看提交的历史信息
[root@gitlab ~/gm-demo]# git log --pretty=oneline
6146fe4d3a894bd090d3deaf1a104cd535a7e6ea introduction software
61b1f7c27142c5c1a8f213e1c5411bfa0c4cb09c changed file1->file4
e7f715649b8689c5479cc7cda14acff4217351c0 file1-file3
Git
程序中有一个叫做HEAD
版本指针,当用户申请还原数据时,其实就是将HEAD
指针指向到某个特定的提交版本,但是因为Git
是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1
计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD
版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^
,上上一个版本则会叫做HEAD^^
,当然一般会用HEAD~5
来表示往上数第五个提交版本。
#还原历史提交版本上一次
[root@gitlab ~/gm-demo]# cat file2
git is a version control system
git is a version control system
[root@gitlab ~/gm-demo]# git reset --hard HEAD^
HEAD 现在位于 61b1f7c changed file1->file4
#查看文件内容(已经还原)
[root@gitlab ~/gm-demo]# cat file2
刚刚的操作实际上就是改变了一下HEAD
版本指针的位置,就是你将HEAD
指针放在那里,那么你的当前工作版本就会定位在那里,要想把内容再还原到最新提交的版本,先看查看下提交版本号
[root@CentOS7 ~/gm-demo]# git log --pretty=oneline
cb944f4b89df502256b94106ab3deafcd84c17e4 changede name
225081ad4b59b8bbd66b7a73c35688471876d227 file1~file3
怎么搞得?竟然没有了Introduction software
这个提交版本记录?
原因很简单,因为我们当前的工作版本是历史的一个提交点,这个历史提交点还没有发生过Introduction software
更新记录,所以当然就看不到了,要是想还原到未来
的历史更新点,可以用git reflog
命令来查看所有的历史记录:
#查看未来历史更新点
[root@gitlab ~/gm-demo]# git reflog
61b1f7c HEAD@{0}: reset: moving to HEAD^
6146fe4 HEAD@{1}: commit: introduction software
61b1f7c HEAD@{2}: commit: changed file1->file4
e7f7156 HEAD@{3}: commit (initial): file1-file3
#找到历史还原点的SHA-1值后,就可以还原(值不写全,系统会自动匹配)
[root@gitlab ~/gm-demo]# git reset --hard 6146fe4
HEAD 现在位于 6146fe4 introduction software
[root@gitlab ~/gm-demo]# cat file2
git is a version control system
git is a version control system
#如是只是想把某个文件内容还原,就不必这么麻烦,直接用git checkout命令就可以的,先写一段话
[root@gitlab ~/gm-demo]# echo "Some mistkes words" >> file3
[root@gitlab ~/gm-demo]# cat file3
Some mistkes words
#我们突然发现不应该写一句话的,可以手工删除(当内容比较多的时候会很麻烦),还可以将文件内容从暂存区中恢复
[root@gitlab ~/gm-demo]# git checkout -- file3
[root@gitlab ~/gm-demo]# cat file3
[root@gitlab ~/gm-demo]#
#这其中是有一套规则,如果暂存区中有该文件,则直接从暂存区恢复,如果暂存区没有该文件,则将还原成最近一次文件提交时的快照。
1.6.6Git对比数据差异
Git如何对比本地工作目录文件内容、暂存区域、本地仓库内容的差异呢?
[root@gitlab ~/gm-demo]# echo "gm-medicare" > file2
#对比本地工作目录与暂存区域文件的不同
[root@gitlab ~/gm-demo]# git diff file2
diff --git a/file2 b/file2
index ed4b770..91c66f9 100644
--- a/file2 #a表示变动前的版本
+++ b/file2 #b表示变动后的版本
@@ -1,2 +1 @@
-git is a version control system #-表示内容去除
-git is a version control system #-表示内容去除
+gm-medicare #+表示内容增加
#将文件提交到暂停区
[root@gitlab ~/gm-demo]# git add file2
#对比暂存区域和本地仓库文件的不同
[root@gitlab ~/gm-demo]# git diff --cached file2
diff --git a/file2 b/file2
index ed4b770..91c66f9 100644
--- a/file2
+++ b/file2
@@ -1,2 +1 @@
-git is a version control system
-git is a version control system
+gm-medicare
[root@gitlab ~/gm-demo]# git commit -m "change file2"
[master 4eb0227] change file2
1 file changed, 1 insertion(+), 2 deletions(-)
1.7Git管理分支结构
分支即是平行空间,假设你在为某个理赔系统研发理赔功能,代码已经完成了80%,但如果将这不完整的代码直接提交到git仓库中,又有可能影响到其他人的工作,此时我们便可以在该软件的项目之上创建一个名叫“支付功能”的分支,这种分支只会属于你自己,而其他人看不到,等代码编写完成后再与原来的项目主分支合并下即可,这样即能保证代码不丢失,又不影响其他人的工作。
一般在实际的项目开发中,我们要尽量保证master分支是非常稳定的,仅用于发布新版本,平时不要随便直接修改里面的数据文件,而工作的时候则可以新建不同的工作分支,等到工作完成后在合并到master分支上面,所以团队的合作分支看起来会像上面图那样。
1.7.1Git创建分支
#创建分支
[root@gitlab ~/gm-demo]# git branch gm-medicare
#切换分支
[root@gitlab ~/gm-demo]# git checkout gm-medicare
切换到分支 'gm-medicare'
#查看当前分支情况,当前分支前有*号
[root@gitlab ~/gm-demo]# git branch
* gm-medicare
master
#我们对文件追加一行字符串
[root@gitlab ~/gm-demo]# echo "This is test1" >> file2
#提交到暂存区
[root@gitlab ~/gm-demo]# git add file2
#提交到git版本仓库
[root@gitlab ~/gm-demo]# git commit -m "new branch too"
[gm-medicare 9284197] new branch too
1 file changed, 1 insertion(+)
#在分支查看文件内容
[root@gitlab ~/gm-demo]# cat file2
gm-medicare
This is test1
#我们在提交文件后再切回master分支
[root@gitlab ~/gm-demo]# git checkout master
切换到分支 'master'
#查看文件内容,发现并没有新追加的字符串
[root@gitlab ~/gm-demo]# cat file2
git is a version control system
git is a version control system
1.7.2Git合并分支
现在,我们想把gm-medicare
的工作成果合并到master
分支上了,则可以使用git merge
命令来将指定的的分支与当前分支合并
git合并分之示意图
#查看当时所处分支
[root@gitlab ~/gm-demo]# git branch
gm-medicare
* master
#合并gm-medicare分支代码
[root@gitlab ~/gm-demo]# git merge gm-medicare
更新 6146fe4..3ab5ae1
Fast-forward
file2 | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
#查看Master分支文件内容
[root@gitlab ~/gm-demo]# cat file2
gm-medicare
This is test1
1.7.3Git分支冲突
但是Git并不能每次都为我们自动的合并分支,当遇到了内容冲突比较复杂的情况,则必须手工将差异内容处理点,比如这样的情况:
git分支冲突示意图
#创建一个测试分支
[root@CentOS7 ~/gm-demo]# git branch gm-test
#切换至gm-test测试分支
[root@CentOS7 ~/gm-demo]# git checkout gm-test
Switched to branch 'gm-test'
#查看当前分支文件
[root@CentOS7 ~/gm-demo]# ls
file file2 file3 file4
[root@CentOS7 ~/gm-demo]# cat file2
git is a version control system
This is test1
his is test1
#编辑分支gm-test的file2文件第三行内容
[root@CentOS7 ~/gm-demo]# vim file2
[root@CentOS7 ~/gm-demo]# cat file2
git is a version control system
This is test1
This is test2
#提交前合并Master分支
[root@CentOS7 ~/gm-demo]# git merge master
Already up-to-date.
#提交至暂存区
[root@CentOS7 ~/gm-demo]# git add .
#提交至本地仓库
[root@CentOS7 ~/gm-demo]# git commit -m "test1"
[gm-test c251174] test1
1 file changed, 1 insertion(+), 1 deletion(-)
#切换回Master分支
[root@CentOS7 ~/gm-demo]# git checkout master
Switched to branch 'master'
[root@CentOS7 ~/gm-demo]# cat file2
git is a version control system
This is test1
his is test1
[root@CentOS7 ~/gm-demo]# git branch
gm-medicare
gm-test
* master
#在Master分支修改同gm-test分支相同的file2文件同一位置的内容
[root@CentOS7 ~/gm-demo]# vim file2
#提交至暂存区
[root@CentOS7 ~/gm-demo]# git add .
#提交至本地仓库
[root@CentOS7 ~/gm-demo]# git commit -m "test2"
[master e4bfd3b] test2
1 file changed, 1 insertion(+), 1 deletion(-)
#将gm-test分支的文件合并到Master分支
[root@CentOS7 ~/gm-demo]# git merge gm-test
Auto-merging file2
CONFLICT (content): Merge conflict in file2
Automatic merge failed; fix conflicts and then commit the result.
#此时,我们在master与linux分支上都分别对中readme文件进行了修改并提交了,那这种情况下Git就没法再为我们自动的快速合并了,它只能告诉我们readme文件的内容有冲突,需要手工处理冲突的内容后才能继续合并
[root@CentOS7 ~/gm-demo]# git checkout gm-test
file2: needs merge
error: you need to resolve your current index first
#Git用< <<<<<<,=======,>>>>>>>分割开了各个分支冲突的内容,我们需要手工的删除这些符号,并将内容修改保存
[root@CentOS7 ~/gm-demo]# cat file2
git is a version control system
This is test1
<<<<<<< HEAD
This is test1
=======
This is test2
>>>>>>> gm-test
[root@CentOS7 ~/gm-demo]# git branch
gm-medicare
gm-test
* master
[root@CentOS7 ~/gm-demo]# vim file2
[root@CentOS7 ~/gm-demo]# cat file2
git is a version control system
This is test1
This is test2
#再次添加至暂存区
[root@CentOS7 ~/gm-demo]# git add .
#提交至git版本仓库
[root@CentOS7 ~/gm-demo]# git commit -m "test3"
[master 14e1f0a] test3
#切换至gm-test分支
[root@CentOS7 ~/gm-demo]# git checkout gm-test
Switched to branch 'gm-test'
#查看文件内容
[root@CentOS7 ~/gm-demo]# cat file2
git is a version control system
This is test1
This is test2
#最后删除Linux分支结束
[root@CentOS7 ~/gm-demo]# git branch -d gm-test
Deleted branch gm-test (was c251174).
#检查是否删除完毕
[root@CentOS7 ~/gm-demo]# git branch
gm-medicare
* master
1.8Git管理标签
当版本仓库内的数据有个大的改善或者功能更新,我们经常会打一个类似于软件版本号的标签,这样通过标签就可以将版本库中的某个历史版本给记录下来,方便我们随时将特定历史时期的数据取出来用,另外打标签其实只是像某个历史版本做了一个指针,所以一般都是瞬间完成的。
#当前提交内容打一个标签(方便快速回滚)
[root@CentOS7 ~/gm-demo]# git tag v1.0
#查看当前所有的标签
[root@CentOS7 ~/gm-demo]# git tag
v1.0
#查看当前1.0版本的详细信息
[root@CentOS7 ~/gm-demo]# git show v1.0
commit 14e1f0aae9de4778da1e7a8cb1c5f8104235749e
Merge: e4bfd3b c251174
Author: gm-medicare-xcz <xuchangzhi@GM-Medicare.com>
Date: Tue Apr 13 00:55:58 2021 +0800
test3
#创建带有说明的标签,-a指定标签名字,-m指定说明文字
[root@CentOS7 ~/gm-demo]# git tag v1.2 -m "version 1.2 release is last"
#我们为同一个提交版本设置了两次标签,删除之前的v1.0
[root@CentOS7 ~/gm-demo]# git tag -d v1.0
Deleted tag 'v1.0' (was 14e1f0a)
#再次查看,v1.0已经被删除
[root@CentOS7 ~/gm-demo]# git tag
v1.2