Skip to content

版本控制工具

1. 版本控制

一、介绍

1.1 版本控制

1.2 版本控制基础功能

  1. 保存和管理文件
  2. 提供客户端工具进行访问
  3. 提供不同版本文件的比对功能

二、 集中式版本控制(svn)

image-20240212103136907

存在问题:

  • 文件冲突问题(多个用户同时对同一个文件进行修改并上传)
  • 服务器宕机,文件会丢失

2.1 svn

svn因为每次存的都是差异 需要的硬盘空间会相对的小一点 可是回滚的速度会很慢

优点: 代码存放在单一的服务器上 便于项目的管理 缺点: 服务器宕机: 员工写的代码得不到保障 服务器损坏: 整个项目的历史记录都会丢失

三、分布式版本控制(git)

image-20240212105644185

特点:

  • 在本地搭建一个与中央服务器相同的仓库

3.1 git

git每次存的都是项目的完整快照 需要的硬盘空间会相对大一点

​ (Git团队对代码做了极致的压缩 最终需要的实际空间比svn多不了太多 可是Git的回滚速度极快)

优点: 完全的分布式

四、 区别

分布式版本控制与集中式版本控制的区别:

  1. 存储方式:集中式版本控制系统(如SVN)将所有的版本信息存储在中央服务器上。而分布式版本控制系统(如Git)则将完整的版本库(包括所有的历史记录和分支)复制到每一个开发者的本地机器上。
  2. 协作模式:在集中式系统中,开发者检出(checkout)代码后进行修改,然后将更改提交(commit)回中心服务器。而在分布式系统中,每个开发者都在本地拥有一个完整的版本库,可以独立进行提交操作,并通过分支(branch)和合并(merge)来整合不同开发者的工作。
  3. 数据交换:集中式系统的数据交换主要发生在客户端与服务器之间,而分布式系统则是点对点的,开发者之间可以直接交换改动和分支。
  4. 容错性:由于分布式系统每个节点都有完整的历史记录,即使某个节点损坏,也可以通过其他节点恢复数据,这提供了更高的容错性。而集中式系统的容错性则依赖于中心服务器的稳定性和备份机制。
  5. 离线工作:分布式版本控制系统允许开发者完全离线工作,因为他们本地有完整的版本库。而集中式系统则需要连接到中心服务器才能提交或更新代码。
  6. 性能:分布式系统通常在大型项目中具有更好的性能,因为它们支持更高效的分支和合并操作,以及更快的历史查询。

总的来说,集中式版本控制系统适合对中心化管理和控制要求较高的团队,而分布式版本控制系统则适合需要高度协作和频繁分支合并的开源项目或团队。选择哪种类型取决于团队的具体需求、工作流程以及对版本控制的偏好。

2. git

注意:语雀笔记地址

一、介绍

Git是一个开源的分布式版本控制系统,主要用于敏捷高效地处理任何规模大小的项目。

Git的核心功能包括:版本控制代码托管协同开发等。此外,它还支持多人协同开发,可以方便地管理和跟踪代码的变化和历史记录。

Git通常与GitHub等在线代码托管平台一起使用,这些平台不仅提供了代码存储的功能,还提供了代码查看、合并、分发等一系列开发流程中的必要功能。

二、Git客户端GitHubDesktop

2.1 下载

下载 git

Git官网

下载 GitHubDesktopSetup

https://git-scm.com/downloads/guis/

2.2 安装

三、GitHubDesktop使用

3.1 仓库操作

3.1.1 创建本地仓库
image-20240212130524690
3.1.2 切换本地仓库

image-20240212130901900

3.1.3 移除/添加/删除本地仓库

image-20240212131504599

image-20240212131729944

3.2 文件操作

3.2.1 创建文件

在本地仓库的根目录下创建文件后,可以在软件中动态识别到新增的文件

注意:

在本地仓库文件夹下创建的文件并没有存放在本地仓库中,需要提交操作,才能被存储到本地仓库

本地仓库的文件存放在 .git 文件夹中

3.2.2 提交文件

image-20240212133702188image-20240212133620979

3.2.3 更新文件
image-20240212134259812

当本地文件发生修改后,客户端与仓库中的文件对比发现文件发生了修改,需要再次提交文件

再次提交相当于创建了一个新文件,形成了一个新的版本(老版本依旧存在)

image-20240212134823626

3.2.4 查看历史修改&版本号

image-20240212135227640

git 版本号采用40个16进制的数字组成的版本号(提交码)

image-20240212135447175

3.2.4 文件删除

在文件夹中删除本地文件

但本地仓库中该文件依然存在

删除本地仓库中的文件

image-20240212135925900

在客户端再次进行提交,更新项目版本即可

3.3 分支原理

分支:当前版本库的一个副本

在开发过程中对分支进行操作,开发完成后对分支进行合并,将不同功能的开发提交区分开,减少冲突

image-20240212142857236

3.4 分支操作

image-20240212143357591

3.4.1 创建分支

image-20240212143641163

image-20240212151648613

4.4.2 切换分支,提交文件

image-20240212144150678

选择不同的分支,打开的文件夹的内容也不同

打开不同的分支,相当于打开不同的仓库,会显示不同库内的文件

4.4.3 合并分支

image-20240212145052147image-20240212145103954

4.4.4 处理冲突

当两个不同的分支向主分支提交相同的文件时,会出现冲突

image-20240212150110941

image-20240212150133577image-20240212150155633image-20240212150303803

注意:

产生冲突的原因一般为两个分支同时下载了同一个文件,都对其修改后上传。

3.5 标签

分支合并是自动完成的,无法对其添加描述信息

增加一个标记描述当前操作的信息,也称标签

3.5.1 创建标签

3.5.2 删除标签

image-20240212152841418image-20240212152926572

3.6 远程仓库 GitHub

3.6.1 在客户端登录GitHub账号

image-20240212155508244

3.6.2 克隆远程仓库

image-20240212173108411

3.6.3 修改克隆仓库并提交

对克隆到本地的远程仓库进行修改后,后提交到本地仓库中

但此时远程仓库并未发生改变

3.6.4 推送到远程仓库

image-20240212173427394

3.7 远程仓库 Gitee

注册登录gitee

3.7.1 创建仓库

image-20240212175831265

3.7.2 克隆远程仓库

复制仓库 URL

image-20240212180025429

3.7.3 提交并推送到远程仓库

与GitHub操作相同

3.8 README,IGNORE

8.8.1 README

对仓库里面存储资源的描述

3.8.2 IGNORE

提交到本地仓库时忽略指定的文件

image-20240212193845653

点击忽略掉指定文件后,下次提交时将不再显示该文件

并会生成一个 .gitignore 文件,内部记录所有需要忽略的文件

3.8.3 .gitignore的一般配置
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

3.9 文件图标和比对功能

image-20240212195301413image-20240212195718260

3.10 放弃更改

放弃更改后,文件会恢复到更改之前的内容

image-20240212200238669

四、集成git

4.1 IDEA集成GitHub

4.1.1 配置在GitHub上共享项目

image-20240212201108690

image-20240212201225333

image-20240212201442929

4.1.2 初始化项目(可以加上.gitignore)

image-20240212201551399image-20240212201650619image-20240212202035163

在GitHub中可以查看 提交的文件

当修改项目中的文件后,文件名颜色会发生改变

image-20240212202344002image-20240212202524306

在GitHub中修改文件并更新到本地

image-20240212202836843

image-20240212202955842image-20240212203011531image-20240212203039957

克隆远程仓库

image-20240212203331315

4.2 IDEA集成Gitee

4.2.1 安装Gitee插件

image-20240212205502508

4.2.2 在gitee上共享文件
image-20240212205818416
4.2.3 登录gitee账号

image-20240212210114803

4.3 VScode集成git

初始化项目 git init

注意:

git一次提交最多100M

如果超过100M 就会提交失败

撤销上次提交 压缩文件再次提交

image-20240214174750173

五、版本号

5.1 介绍

f607b452bd95b74154b091961c09e8ede7cce77d

采用SHA-1加密算法,长度40位

用途:定位仓库中的文件

40位:2(文件夹)+38(文件名)

前2位是当前版本文件在 .git -> object 下的文件夹名

后38位是版本文件名

5.2 文件操作

5.2.1 查看版本文件内容

image-20240213112624362

在仓库根目录下右键 git Bash Here

提交信息:$ git cat-file -p 版本号

文件状态:$ git cat-file -p tree下的版本号

文件内容:$ git cat-file -p 文件状态中的版本号

image-20240213113120489

5.2.2 文件增加

在根目录下增加一个a.txt的文件,然后提交到本地仓库

image-20240213114021223

5.2.3 文件修改

修改a.txt文件的内容

image-20240213115024448

image-20240213124054690

5.2.4 文件删除

在项目中删除 a.txt 并提交到本地仓库

此时文件状态将不指向a.txt文件

image-20240213124010736

5.3 分支操作

5.3.1 HEAD

HEAD文件内容:ref: refs/heads/分支名

refs/heads/main文件内容:9c015c0ec3ef08c5d267de49a46f7cb7ae4d2f51(最新版本号)

记录了当前分支下最新提交的版本号

使用不同的分支 HEAD 文件会执行不同的文件

main分支 HEAD:ref: refs/heads/main mian文件记录最新提交的版本号

user分支 HEAD:ref: refs/heads/user user文件记录最新提交的版本号

不同分支下的HEAD文件记录不同分支的版本信息

5.3.2 分支切换

不同的分支内记录不同分支对本地仓库的操作及其版本号

切换不同的分支时,会根据不同分支内HEAD文件记录的该分支最新版本号的内容显示分支内容

image-20240213130808266

六、命令

6.1 介绍

image-20240213131338554

image-20240213134754552
  • 不同区域git的功能不同,文件的状态不同
  • 通过git指令转换文件状态
  • 客户端工具一些指令无法实现

6.2 仓库操作

6.2.1 初始化本地仓库(init)

在项目目录下,初始化仓库

$ git init

生成一个 .git 的文件夹

使用 git init 初始化的仓库默认的分支为 master,不会将初始化操作提交

使用GitHubDesktop初始化的仓库默认分支为 main,会主动提交初始化操作

6.2.2 克隆远程仓库(clone)

在GitHub上已经创建了新的仓库,需要克隆到本地仓库

$ git clone URL [自定义仓库名称]
6.2.3 配置仓库

配置当前仓库

$ git config 配置名称 值
eg:
$ git config user.name yibu-xiaoxin
$ git config user.email 2910020032@qq.com

配置文件在 当前项目下的.git 下的config

配置全局仓库

$ git config --global user.name yibu-xiaoxin
$ git config --global user.email 2910020032@qq.com

全局配置文件在C:\Users\DELL\.gitconfig

GitHubDesktop配置

image-20240213162358379

6.2.4 发布仓库(publish)

创建了本地仓库,但远程仓库无内容,需要发布到远程仓库中

可以在客户端GitHubDesktop中进行发布

在集成开发环境中连接到远程空仓库的URL后将本地仓库内容发布到远程仓库

6.3 文件操作

6.3.1 查看当前仓库状态
$ git status

image-20240213163208638

6.3.2 添加到缓存区(add)

将工作区发生变化的内容(增加,删除,更改)添加到暂存区

$ git add 文件名 (*.txt:匹配所有的.txt文件)

将缓存区的内容移动到工作区

$ git rm --cached 文件名
6.3.3 提交到本地仓库(commit)

将暂存区的内容提交到本地仓库中

$ git commit -m 备注信息
6.3.4 查看历史提交信息(log)
$ git log [--oneline]

image-20240213165015134

6.3.5 恢复误删除工作区文件

删除后未提交

$ git restore 文件名

删除后已提交

js
$ git log --online	 // 查看历史提交记录 找到未被删除的版本库
$ git reset --hard 版本号	// 将当前仓库重置到历史版本 会删除该版本号之后的提交记录

$ git revert 当前版本号	// 不会删除提交信息
image-20240213171519530

6.4 分支操作

6.4.1 创建分支

要先进行提交后,才能创建分支

$ git branch user

分支就是引用当前分支的版本号

新创建的分支会自动复制最新主分支下的文件

6.4.2 查看分支
$ git branch [-v]

image-20240213171956131

6.4.3 切换分支
$ git checkout 分支名
6.4.4 创建分支并切换
$ git checkout -b 分支名
6.4.5 删除分支
$ git branch -d 分支名
6.4.6 合并分支
js
// 切换到主分支 master/main
$ git checkout master
// 将user分支合并到master分支
$ git merge user
6.4.7 处理合并冲突

两个不同的分支存在相同的文件会产生冲突

image-20240213173444286

解决冲突

image-20240213173836682

手动修改文件内容

image-20240213173924205

提交更改后的文件

$ git add c.tct
$ git commit -m 处理冲突

合并成功

6.5 标签操作

6.5.1 增加标签

为当前的提交的本版增加一个标记也叫标签,以后可以通过标签进行访问

$ git tag 标签名 版本号	// 为当前版本号的提交设置一个别名
6.5.2 查看标签
$ git tag
6.5.3 使用标签查看历史版本
$ git log 标签名

image-20240213180547099

image-20240213180638622

6.5.4 删除标签
$ git tag -d 标签名
6.5.5 使用标签创建分支
git checkout -b 标签名

使用标签名对应的版本库创建分支,分支名为标签名

6.6 远程仓库操作

6.6.1 本地仓库关联远程仓库
$ git remote add orgin SSH(git@gitee.com:yibu-xiaoxin/remote-gitee-test.git)
6.6.2 本地仓库移除远程仓库
$ git remote remove origin
6.6.3 推送(push)

当本地仓库内发生变化的内容推送到远程仓库

js
$ git add 文件名
$ git commit -m 备注
$ git push origin	
// origin(远程地址名称) 在config中配置

修改 config 文件 将 url 的 HTTPS 路径修改为 SSH

image-20240213182535576

推送失败,显示权限不够

生成公钥

$ ssh-keygen -t rsa -C SSH地址

文件默认存储在:C/Users/DELL/.ssh/id_rsa.pub

打开 id_rsa.pub 复制文件内容

在gitee中设置SSH公钥

再次推送

$ git push origin

可以使用 https 和 SSH 任意一种方式进行提交

SSH 需要进行公钥设置

6.6.6 拉取(pull)

修改远程仓库的内容,同步到本地仓库

$ git pull origin

七、搭建自己的代码托管平台

7.1 GitLab介绍

GitLab是由GitLabInc开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。

7.2 GitLab软件下载

官网地址:https://about.gitlab.com/

GitLab需要运行在Linux系统中

选择下载适用CentOS 7系统的版本

下载地址:https://packages.gitlab.com/gitlab/gitlab-ce

具体操作见 git.doc

7.3 集成IDEA

7.3.1 安装GitLab插件

img

7.3.2 配置GitLab

img

img

7.3.3 创建新项目

img

7.3.4 创建本地仓库

img

img

7.3.5 创建新代码

img

7.3.6 提交文件

img

img

img

7.3.7 推送远程库

img

7.3.8 配置远程库

img

img

7.3.9 推送文件

img

img

7.3.10 合并提交请求

img

img

合并

img

确认文件提交

img

3. svn

一、介绍

1.1 认识SVN

SVN是一个集中式的版本控制系统。SVN用于管理随时间改变的数据,这些数据被保存在一个中央资料档案库(Repository)中。它会记住每一次文件的变动,所以你可以恢复到旧的版本,或者浏览文件的变动历史,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。SVN的目的就是用 于多个人共同开发同一个项目,可共用资源。

1.2 SVN管理思想

在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序,也可以一个仓库对应一个项目。

由仓库管理员统一管理这些源程序,每个用户在使用仓库之前,要把仓库中的项目文件下载到本地。

用户做的任何修改首先都是在本地进行,然后用SVN命令进行提交,这样就可以做到跟踪文件变化,冲突控制等。

二、SVN客户端下载与安装

2.1 下载

TortoiseSVN下载地址: https://tortoisesvn.net/downloads.html

下载安装教程1 安装教程2 学习链接

2.2 安装

在公司里面只需要安装客户端即可,如果是仓库管理人员,还需要安装服务器端。

安装SVN 并汉化,安装SVN客户端,和SVN服务器端(本地)

2.3 注册并登录远程SVN服务器

在实际项目开发中,公司会为我们提供SVN服务器。在学习阶段我们就先使用免费的SVN服务器做练习。

2.3.1 注册

SVNSpot官网http://code.svnspot.com

注册登录后可以免费创建两个代码托管项目。

2.3.2 创建托管项目

在官网创建项目并复制项目地址

三、服务器端使用

3.1 创建用户

打开SVN服务端端软件

image-20240121195116231

创建了用户:zs 密码:1 ls 密码:2 ww 密码:3 admin 密码:admin

3.2 创建分组

image-20240121195323156

3.3 创建仓库

image-20240121195630012image-20240121195701410

仓库下的文件夹:

image-20240121200410307

开发时一般将代码上传至trunk文件夹下。

3.4 查看项目文件

image-20240121200942530

image-20240121222119147

3.5 检出项目

先找到项目仓库右键 复制项目的URL

image-20240121201317745

在要检出的位置右键点击检出

image-20240121201607909

输入账号密码

image-20240121201655474

检出成功

image-20240121201743963

在项目文件夹中多出三个文件

image-20240121201820545

3.6 上传文件

将要上传的文件放在trunk目录下 右键文件选择增加

image-20240121202123647

提交

image-20240121202246801image-20240121202440370

需要再次认证 账户名密码 选中保存认证,下次可以不再认证。

image-20240121202638136

3.7 查看提交的文件与历史修改

在浏览器端查看

image-20240121202916495

查看修改历史

image-20240121212413033

image-20240121212609696

image-20240121212537618

在服务器端查看

image-20240121202951162

3.8 其它用户下载上传文件

​ 使用用户ls 密码2 下载项目并上传文件

  • 检出项目:

    image-20240121203706221
  • 增加文件:

    将要上传的文件放入 trunk目录下 右键项目点击增加

    image-20240121203907970
  • 提交文件:

    image-20240121204019888image-20240121204204088
  • 查看提交的文件:

    在浏览器端查看

    image-20240121204315689

3.9 重置用户密码

image-20240121204654073

3.10 设置用户权限

image-20240121205000308image-20240121205246498

四、客户端使用

4.1 上传项目(导入import)

当在本地已经建立好了项目,需要把项目上传到SVN时,选择“Import”导入操作。

在相应项目文件夹上,鼠标右键选择“导入”操作。

image-20240121213221804

弹出上传界面,输入版本库地址和项目说明,点击上传即可。

image-20240121213328384

4.2 检出(Check0ut)

假如项目已经在服务器的仓库里,那么需要检出项目。需要管理员提供账号、密码和仓库地址。

新建一个空文件夹作为项目目录,文件夹右键点击“检出”。

**注意:**Checkout/检出,只在第一次链接时操作一次,以后如果进行更新操作请使用Update(更新指令)

image-20240121213439333

输入版本库地址,点击确认。

image-20240121201607909

4.3 增加/修改文件

​ 在对应文件夹中创建文件夹或文件,或对已经存在的文件或目录进行修改操作。

4.4 提交(Commit)

  • 场景1:在项目中新增了一个文件(此时文件下方小图标为蓝色问号,表示不属于版本库的未知文件)需要先增加提交

    image-20240121202123647image-20240121202246801

    image-20240121202440370
  • 场景2:修改已经存在的文件或目录,修改完后可以直接提交

    对已有的文件进行修改后,文件上会出现一个红色感叹号。

  • **场景3:**删除文件。

    在需要删除的文件上右键鼠标,选择“delete”,文件被删除,然后commit提交即可。

    image-20240121214125126

4.5 更新(Update)

多人协作开发项目时,如果想获得别人提交的数据,就需要“更新”操作。 鼠标右键选择“update/更新”即可更新最新版本。

恢复到修改之前或重新下载,在第一次检出后,可以直接使用更新即可(只下载已修改或新增的文件/夹,即当前在服务器下存储的项目文件)

eg:不小心将下载的 ls.txt文件删除,恢复服务器中此时的项目文件。

image-20240121211138490

image-20240121211235403

更新到指定版本

image-20240121214438759

image-20240121214519922

4.6 解决冲突

同一版本的文件,如果两个人都下载了这个版本的文件并都做了修改,一人提交后,另一人再提交就会出现冲突(跨版本提交)。

image-20240121214916179

​ 同一个文件张三修改上传后,李四再去下载修改上传,此时不会出现冲突(两人下载的版本不同)。

​ 解决方案:

  • **方案一:**张三先提交,李四先备份自己修改的内容,再重新下载李四提交的文件,对李四修改后的文件进行修改后,再提交就。即直接放弃自己的提交,使用svn revert(svn还原)撤回本地更改代码,更新为服务器上最新版本文件,然后再将修改的代码添加上去,再提交。

    image-20240121215147819image-20240121215216680
  • 方案二:“张三和李四一起进行代码整合,再由一人将整合后的代码提交。

  • **方案三:**提交失败后不还原,直接选择更新操作,对于每个冲突的文件都会生成3个文件:

    image-20240121215529055

    整理合并文件内容(example.html), 执行resolve,这时生成的3个文件会消失(此时文件为服务器最新版本和用户修改内容后合并的文件)用户可以正常提交。

切换账号

​ 鼠标右击选择TortoiseSVN--->Settings

image-20240121221728927

找到Saved Data选项

image-20240121221859181

弹出账号信息,勾选想要清除的账号点击ok即可清除

image-20240121221919676