分布式版本控制系统
一、
Git
概述
Git
是一种分布式版本控制系统,用于跟踪和管理代码的变更。它是由 Linus Torvalds 创建的,最初被设计用于
Linux
内核的开发。
Git
允许开发 人员跟踪和管理代码的版本,并且可以在不同的开发人员之间进行协作。 Github 用的就是
Git
系统来管理它们的网站,
Github
是一个社区,
Git
是一个服务系统,Github
只支持
Git
分布式系统,所以故名成为
Github
。
Git
的主要功能包括:
1.
版本控制:
Git
可以跟踪代码的变更,并且可以回滚到任何一个版本。
2.
分支管理:
Git
支持多个分支,可以让不同的开发人员在不同的分支上 进行开发,然后再合并到主分支上。
3.
分布式:
Git
是分布式的,意味着每个开发者都可以在自己的本地分支 上进行操作,不需要依赖于中央服务器。
4.
团队协作:
Git
支持多人协作,可以让不同的开发人员在同一个项目上 进行协作。
5.
使用
Git
进行版本控制可以提高开发效率,减少代码冲突,并且可以更 好地管理代码变更。
二、
Git
的功能特性
Git
是关注于文件数据整体的变化,直接会将文件提交时的数据保存成快 照,而非仅记录差异内容,并且使用SHA-1
加密算法保证数据的完整性。主 要功能如下:
1.
克隆数据库版本
:
从服务器上克隆版本数据库
(
包括代码和版本信息
)
到本 机上;
2.
提交代码
:
在本机上自己创建的分支上提交代码
;
3.
合并分支
:
在本机上合并分支
;
4.
拉取合并分支
:
新建一个分支,把服务器上最新版的代码
Fetch
下来, 然后跟自己的主分支合并;
5.
代码冲突解决
:
一般开发者之间解决冲突的方法,开发者之间可以使用 pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
三、
Github
社区
GitHub
是一个面向开源及私有软件项目的托管平台,因为只支持
Git
作为 唯一的版本库格式进行托管,故名 GitHub
。
GitHub
可以提供给用户空间 创建 Git
仓储,保存用户的一些数据文档或者代码等
GitHub
作为开源代码库以及版本控制系统,目前拥有
140
多万开发者用 户。随着越多的应用程序转移到了云上,GitHub
已经成为了管理软件开发 以及发现已有代码的首选方法。
GitHub
可以托管各种
Git
库,并提供一个
Web
界面,但与其它像 SourceForge 或
Google Code
这样的服务不同,
GitHub
的独特卖点在于 从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:
首先点 击项目站点的“fork”
的按钮,然后将代码检出并将修改加入到刚才分出的代 码库中,最后通过内建的“pull request”
机制向项目负责人申请代码合并。
四、
Gitlab
GitLab
是一个基于
Git
的项目管理软件用于仓库管理系统的开源项目。使 用 Git
作为代码管理工具,并在此基础上搭建起来
Web
服务。 GitLab 主要针对软件开发过程中产生的代码和文档进行管理,支持
group 和 project
两个维度进行代码和文档的管理。其中,
group
是群组,可以有 多个 project
;
project
是工程项目,一个
project
中可能包含多个 branch,意为每个项目中有多个分支,分支间相互独立,不同分支可以进 行归并。GitLab
一站式
DevOps
平台,加速和优化软件开发全生命周期。
五、集中式与分布式的区别
1
、集中式概述
集中式版本控制系统(例如
SVN
)将代码库存储在一台中央服务器上,团队 成员通过客户端从中央服务器获取代码并将更改提交到服务器。这意味着代 码库是集中的,所有开发者都在同一个代码库上工作,并且必须与服务器进 行通信才能查看历史记录和获取代码。因此,如果服务器发生故障或网络中 断,会导致数据丢失,并且开发者将无法使用代码库。
2
、分布式概述
分布式版本控制系统(例如
Git
)则将完整的代码库复制到每个开发者的本 地计算机上,每个开发者都有自己的完整副本,可以在没有网络连接的情况 下继续工作。开发者可以在本地进行代码的修改和提交,然后将更改推送到 其他开发者的本地副本中。因此,代码库是分散的,每个开发者都有自己的 代码库和历史记录,可以独立工作并在不同的分支上开发代码。 像集中式都有一个主版本号,所有的版本迭代都以这个版本号为主,而分布 式因为每个客户端都是服务器,git
没有固定的版本号,但是有一个由哈希 算法算出的 id
,用来回滚用的,同时也有一个
master
仓库,这个仓库是一 切分支仓库的主仓库,我们可以推送提交到 master
并合并到主仓库上,主 仓库的版本号会迭代一次,我们客户端上的 git
版本号无论迭代多少次,都 跟 master
无关,只有合并时
master
才会迭代一次。
3
、整体区别
版本控制系统的集中式和分布式主要在以下三个方面存在区别:
1.
代码库的角色与功能:在集中式版本控制系统中,只有中央服务器上的 代码库扮演中央仓库的角色,可以提供历史版本对比和代码回退等操 作。而在分布式版本控制系统中,每个代码库都可以扮演中央仓库的角 色,都提供中央仓库的功能。
2.
协同开发与代码同步:在集中式版本控制系统中,如果中央仓库发生故 障,那么协同开发就无法进行,各个用户也无法更新最新代码。而在分 布式版本控制系统中,即使本地断网,也可以提交(待联网后 push),可以对比历史版本差异(本地有历史库)。
3.
节点的角色与功能:分布式版本控制的每个节点都是完整仓库(都可以 扮演中央仓库),而集中式版本控制的每个节点只是保存了仓库的某个 版本(无法扮演中央仓库)。 综上所述,版本控制系统的集中式和分布式各有其特点。选择何种方式主要 取决于团队的特定需求和工作流程。六、集中式和分布式的优缺点
1
、分布式
(
1
)优点
1.
灵活性:由于每个节点都有完整的代码库,因此可以更轻松地进行并行 工作,不同的开发人员可以在不同的分支上独立工作,提高工作效率。
2.
可扩展性:由于每个节点都有完整的代码库,因此可以更容易地扩展系 统以适应更大的开发团队或项目需求。
3.
独立性:每个节点都可以独立工作,不需要依赖于中央服务器或其他节 点,提高了系统的可用性和稳定性。
(
2
)缺点
1.
安全性:由于每个节点都有完整的代码库,如果某个节点被攻击或出现 故障,可能会造成源代码泄露,影响到整个系统的安全性。
2.
数据一致性:由于每个节点都有自己的代码库和历史记录,因此在合并 不同节点的更改时可能会出现数据一致性问题。
3.
管理难度:由于分布式系统的复杂性,管理起来相对困难,需要更多的 技术知识和经验。
2
、集中式
(
1
)优点
1.
简单易用:集中式版本控制系统通常具有简单明了的设计,易于理解和 实施。由于所有的决策和处理都由中心节点完成,客户端设备只需执行 简单的操作即可得到所需的服务。
2.
数据安全性:由于所有数据都存储在中央服务器上,因此可以更好地保 护数据的完整性和安全性。
3.
管理方便:集中式版本控制系统通常具有集中的管理和控制能力,可以 更/
容易地进行系统维护和管理。
(
2
)缺点
1.
单点故障:由于整个系统依赖于中心节点,一旦中心节点出现故障或不 可用,整个系统将无法正常运行。这导致系统的可靠性受到了限制,并 增加了系统的风险。
2.
性能瓶颈:在集中式版本控制系统中,所有的数据处理和决策都需要通 过中心节点进行。当系统负载增大时,中心节点可能成为性能瓶颈,限 制了整个系统的处理能力。
3.
可扩展性有限:由于所有的处理都由中心节点完成,集中式版本控制系 统的可扩展性受到限制。当系统需要扩展以满足更大规模的需求时,需 要升级和改变中心节点,导致系统的扩展性有限。
七、
Git
的安装及配置
1
、
Git
安装
[root@YH1 ~]
# yum -y install git
[root@YH1 ~]
# git #
直接输入
git
可通过提示查看到
git
的选项和 参数
2
、配置
git
环境
参数:
config
:配置
git
环境
global
:长命令表示配置整个
git
环境
[root@YH1 ~]
# git config --global user.name "admin" # 配置用户名
[root@YH1 ~]
# git config --global user.email "[email protected]" # 配置邮箱
八、
Git
的基本流程
1.
在工作目录
(
工作区
)
中修改某些文件
2.
对已修改文件作快照,并保存到暂存区域
git add .
3.
将保存在暂存区的文件快照提交到版本库
git commit -m ""
4.
查看提交历史
git log
1
、创建本地空仓库
init
:初始化当前目录为仓库,初始化后会自动将当前仓库设置为
master 创建本地仓库的条件是需要一个空目录,然后在空目录中初始化你的项目
(
1
)创建一个名为
test
的空项目
[root@YH1 ~]
# mkdir /test #
创建一个空目录
[root@YH1 ~]
# cd /test/
[root@YH1 test]
# git init #
将当前空目录做为
master
仓库
[root@YH1 test]
# ls -a #
查看
git
隐藏的相关的配置文件
. .. .git
[root@YH1 test]
# cd .git/
[root@YH1 .git]
# ls
2
、新建文件添加到本地仓库
add
:将文件添加到缓存区
commit
:提交到本地仓库
(
1
)新建文件并添加到缓存
[root@YH1 test]
# touch test.c
[root@YH1 test]
# ls -a
. .. .git test.c
[root@YH1 test]
# git add test.c
(
2
)提交文件到仓库
使用
-m
命令来简写描述我们的信息,如果不使用
-m
,会调用终端的注释编 辑器来输入描述信息,而不建议使用注释编辑器,因为注释编辑器比较难 用,不舒服。
[root@YH1 test]
# git commit -m "add new file "test.c""
git commit
会为我们生成
40
位的哈希值,用于作为
id
,并把刚刚用
git add 添加到提交缓存区里的文件提交到本地仓库中,便于我们回滚,至此,这个 文件就已经添加到本地仓库中了,同时本地仓库也迭代了一个版本。
3
、查看历史提交信息
[root@YH1 test]
# git log
九、工作目录、暂存区和版本库
1.
工作目录:指当前正在进行修改的文件夹或目录。在这个目录中,开发 者可以添加、修改、删除文件,然后将这些修改提交到Git
中。
2.
暂存区:一个中间区域,它位于工作目录和版本库之间。在这里,开发 者可以将修改后的文件添加到暂存区,以便在提交时将这些修改打包成 一个提交 (
也称为
“
提交
”
或
“
提交记录
”)
。
[root@YH1 test]
# git log
commit 9e89cace2f47e12178fc54f964d01b176b25c968 (HEAD
-
> master)
# 40
位的哈希算法算出的
id
# head->master
表示提交到
master
主仓库,如果是
head->
其他分支,表示提 交到其他分支仓库
Date: Wed Nov
15 21
:00:07
2023
+
0800
#
提交时间
add new file test.c
#
提交时写的注释
3.
版本库:存储所有提交历史记录的地方。每个提交都包含一个快照
(
即 项目的状态)
,以及一个指向上一个提交的引用。开发者可以从版本库中 检出历史记录中的任何一个版本,并在工作目录中查看它的状态。 在进行Git
操作时,开发者通常会先将修改添加到暂存区,然后使用
“git commit”命令将这些修改提交到版本库中。提交后,暂存区中的修改会被清 空,工作目录中的文件会与版本库中的文件保持一致。这个过程可以帮助开 发者更好地管理代码的变化,使得代码的版本控制更加清晰和可控。
gitlab及分支管理
一、分支概念
每次提交,
Git
都把它们串成一条时间线,这条时间线就是一个分支。截止 到目前,只有一条时间线,在Git
里,这个分支叫主分支,即
master
分支。 HEAD 严格来说不是指向提交,而是指向
master
,而
master
才是指向提交 的,所以,HEAD
指向的就是当前分支。 开始的时候,master
分支是一条线,
Git
用
master
指向最新的提交,再用 HEAD指向
master
,就能确定当前分支,以及当前分支的提交点。每次提 交,master
分支都会向前移动一步,这样,随着你不断提交,
master
分支 的线也越来越长。
二、创建分支过程
1.
首先,确保你当前在主分支(通常是
master
或
main
分支)上工作。你
可以使用以下命令切换到主分支:
[root@YH1 ~]
# cd /test #
先切换到之前创建
master
主分支
[root@YH1 ~]
# git checkout master #
确保当前操作位置是在主分支上
2.
接下来,使用以下命令创建一个新的分支:
[root@YH1 ~]
# git branch feature-branch
这将创建一个名为
"feature-branch"
的新分支。
3.
现在,你需要切换到新创建的分支上。使用以下命令切换分支:
[root@YH1 ~]
# git checkout feature-branch
[root@YH1 test]
# git branch #
查看当前分支
* feature-branch
#
当前所在哪个分支,哪个分支前面有
*
号
master
也可以使用如下命令直接创建并切换到
"feature-branch"
分支,
-b
选项相当 于执行两条命令,git checkout
和
git branch
。
[root@YH1 ~]
# git checkout -b feature-branch
[root@YH1 test]
# git branch #
跟上面的操作效果一样
* feature-branch
master
这两个操作都将切换到新创建的
"feature-branch"
分支。
4.
在新分支上进行编写,提交更改。你可以使用以下命令添加更改并将更 改提交到本地仓库:
[root@YH1 test]
# vim test.c #
添加新内容
hello
test
[root@YH1 ~]
# git add . #
提交到缓存区,这里也可以写 master分支的目录名,比如
test
[root@YH1 ~]
# git commit -m "
提交消息
" #
提交消息写清注释 信息即可
5.
当代码任务完成后,需要将更改合并回主分支。首先,切换回主分支:
[root@YH1 ~]
# git checkout master
[root@YH1 test]
# git branch
feature-branch
* master
[root@YH1 test]
# cat test.c
#
刚才写入的内容没有了,是因为之前是在其他分支上操作的,并非在
master 上
#
所以切换回
master
后,显示的内容只会是
master
分支上的内容
6.
然后,使用以下命令将你的分支合并到主分支:
[root@YH1 ~]
# git merge feature-branch
[root@YH1 test]
# cat test.c #
合并完成,其他分支的内容被合并 到了master
上
这将把你的
"feature-branch"
分支的更改合并到主分支上。如果存在冲突, 需要手动解决冲突。G
会在冲突的文件中标记出冲突的部分,你需要打开 这些文件并手动编辑以解决冲突。解决冲突后,你需要再次提交更改。
7.
最后,如果你想删除不再需要的分支,可以使用以下命令删除分支:
[root@YH1 ~]
# git branch -d feature-branch
这将删除名为
"feature-branch"
的分支。如果你想强制删除分支(即使该分 支尚未合并),可以使用以下命令:
[root@YH1 ~]
# git branch -D feature-branch
三、解决分支冲突
[root@YH1 test]
# git checkout -b y123 #
创建并切换到新 分支
切换到一个新分支
'y123'
[root@YH1 test]
# vim test.c #
写入点内容
hello
test
yyyy
[root@YH1 test]
# git add test.c #
将新分支写入的内容提交到 缓存
[root@YH1 test]
# git commit -m "yy" #
提交新分支并注释 为“yy”
[y123 32e5a5a] yy
1
file changed,
1
insertion(
+
)
[root@YH1 test]
# git checkout master #
切换到主分支
切换到分支
'master'
[root@YH1 test]
# cat test.c #
此时还未合并,所以只显示当前 master分支的内容
hello
test
[root@YH1 test]
# vim test.c #
向
master
分支内写入些内容
hello
test
hhhh
[root@YH1 test]
# git add test.c #
提交
master
分支
[root@YH1 test]
# git commit -m "hh" #
正式提交,注释信息 为“hh”
[master 4a51362] hh
1
file changed,
1
insertion(
+
)
[root@YH1 test]
# git merge y123 #
合并新分支
自动合并
test.c
冲突(内容):合并冲突于
test.c
#
提示冲突了
自动合并失败,修正冲突然后提交修正的结果。
[root@YH1 test]
# git status # git
状态信息也提示两个分支冲突 了
位于分支
master
您有尚未合并的路径。
(解决冲突并运行
"git commit"
)
(使用
"git merge --abort"
终止合并)
未合并的路径:
(使用
"git add <
文件
>..."
标记解决方案)
双方修改:
test.c
修改尚未加入提交(使用
"git add"
和
/
或
"git commit -a"
)
[root@YH1 test]
# cat test.c # git
使用记号帮我们标记除 了冲突位置和新分支的内容
hello
test
<<<<<<< HEAD
hhhh
=======
yyyy
>>>>>>> y123
1.git
仓库的建立
1.
找到一个空目录
mkdir /test
2.
进入到这个目录
cd /test
3.
执行
git
指令
git init
4.
发现一个隐藏目录
.git
5.test
目录就是工作区域,
.git
就是仓库
[root@YH1 test]
# vim test.c #
手动修改冲突文件
hello
test
hhhh
yyyy
[root@YH1 test]
# git add test.c #
提交修改后的分支
[root@YH1 test]
# git commit -m "zuizhong" #
正式提交, 注释信息为“zuizhong”
[master f13e70e] zuizhong
[root@YH1 test]
# git log --graph --pretty=oneline -- abbrev-commit # 查看日志分析分支合并情况
* f13e70e (HEAD
-
> master) zuizhong
#
当前分支所处位 置为zuizhong
|\
| * 32e5a5a (y123) yy
# y123
分支冲突时所处的分支位置为
yy
* | 4a51362 hh
# master
分支冲突时所处的分支位置为
hh
|/
* 173a360 test
* 9e89cac add new file test.c
[root@YH1 test]
# git branch -d y123 #
删除
y123
分支
已删除分支
y123
(曾为
32e5a5a
)。
[root@YH1 test]
# cat test.c #
查看
master
分支上的最终版
本
hello
test
hhhh
yyyy
1.git
仓库的建立
1.
找到一个空目录
mkdir /test
2.
进入到这个目录
cd /test
3.
执行
git
指令
git init
4.
发现一个隐藏目录
.git
5.test
目录就是工作区域,
.git
就是仓库
[root@YH1 test]
# vim test.c #
手动修改冲突文件
hello
test
hhhh
yyyy
[root@YH1 test]
# git add test.c #
提交修改后的分支
[root@YH1 test]
# git commit -m "zuizhong" #
正式提交,
注释信息为
“zuizhong”
[master f13e70e] zuizhong
[root@YH1 test]
# git log --graph --pretty=oneline --
abbrev-commit #
查看日志分析分支合并情况
* f13e70e (HEAD
-
> master) zuizhong
#
当前分支所处位
置为
zuizhong
|\
| * 32e5a5a (y123) yy
# y123
分支冲突时所处的分支位置为
yy
* | 4a51362 hh
# master
分支冲突时所处的分支位置为
hh
|/
* 173a360 test
* 9e89cac add new file t