版本控制工具

零、版本控制工具基本概念

1、版本控制工具(vcs)

版本控制工具(version control system,vcs),是一种用于记录代码文件变化历史、方便我们查阅特定版本修改情况的系统。
一般分为集中式、分布式两种。

2、对比两类版本控制工具——分布式(比如git)与集中式(比如svn)

1)集中式与分布式VCS的区别与联系(以svn、git为例)

集中式:源代码和版本记录(合称版本库),放在中央服务器上,有权限的开发者可以从中央服务器把源代码拉取到本地,开发完成后再把自己的修改提交到中央服务器。
开发期间,开发者还可以通过vcs查看每个提交历史。
不同分支,还可以进行合并(便于区分开发、生产)。
如下图,集中式vcs只有两类“角色”,远程库(Remote)/也可以叫中央服务器、本地库(Repository),建构简单易懂。
在这里插入图片描述

分布式:如下图,分布式主要有三个“角色”:远程库(Remote)、本地库(Repository)、工作区(workspace)。
分布式,其实就是把每台电脑都弄成一个“集中式”vcs,工作区相当于svn的本地、本地呢相当于svn的远程,你平时拉取、提交都是工作区和本地库在“交流”,所以也不需要网,只有要push代码时、才需要联系远程库、才需要网。
每个开发电脑,都有一套集中式vcs,也可以作为其他电脑的远程库,这相当于比集中式高了一个维度。
又因为每个电脑都要管理版本库,所以分布式下的每台电脑都必须安装git(分布式vcs这里以git为例),与集中式不同,集中式只有远程库才必须装svn(集中式vcs这里以svn为例),其他开发电脑只要能访问svn就行。
在这里插入图片描述

2)集中式与分布式VCS的优缺点(以svn、git为例)

集中式vcs的优点:
a、简单实用,容易上手、容易理解;
b、vcs的功能它都有,新建、合并分支,记录版本库修改记录,回退版本、开发者权限分配等都支持。

集中式vcs的缺点:
a、对网络需求高,没网之后每个开发者的修改都无法提交,也无法拉取新代码;
b、代码越来越多,对中央服务器的性能要求比较高;
c、版本库都在中央服务器,一旦中央服务器宕机、故障,所有开发都得暂停;再严重点,源代码有丢失的可能性。

分布式vcs的优点:
a、对网络需求不大,提交修改、新建/合并分支都是在本地;
b、vcs的功能它也都有,新建、合并分支,记录版本库修改记录,回退版本、开发者权限分配等都支持。

分布式vcs的缺点:
a、比较繁琐和难以理解。
b、

3)集中式与分布式VCS的使用范围(以svn和git为例)

Git适用于参与开源项目的开发者,他们由于水平高,更在乎的是效率而不是易用性。SVN则不同,它适合普通的公司开发团队,使用起来更加容易。

一、SVN

1、SVN简介

svn是一款开源的版本控制工具,将代码(或其他文件)存放在中心版本库以后,svn可以记录每一次对文件和目录的修改,也可以把数据恢复到早期版本,还可以查看数据修改的历史,方便多用户共同开发项目。

svn日常使用的模式是这样的:
首先在服务端安装、搭建svn服务器,下载地址如下: http://subversion.apache.org/packages.html,svn一般在公司项目刚开始的时候就搭建完成了,新项目直接在上面创建新的目录即可;

对于普通用户(即项目组的普通开发),我们使用更多的是TortoiseSVN(俗称“小乌龟”),它是svn的客户端,我们可以用它下拉代码,提交自己写的代码,合并代码,查看代码提交历史等。

2、TortoiseSVN

1)安装TortoiseSVN,安装成功以后,鼠标右键菜单变为这样
在这里插入图片描述

2)找领导给你开个svn账号,以下是我们公司的邮件,估计其他公司也类似。
在这里插入图片描述
3)和同事要一个代码的svn地址,在合适的位置check out;
第一次check out,需要代码地址和svn账号、密码;后面check out或者commit,只需要地址就行了

3、合并两个版本的代码

0)使用场景说明:比如说要把测试代码合并到生产上;假设项目的测试代码在v2.0这个分支上(就是在svn下的v2.0文件夹),生产代码在v5.0上;
1)在测试开发完成后,把代码提交到v2.0上;
2)然后在本地v5.0上(第一次本地没有v5.0就checkout,合并前先update)用TortoiseSVN “Merge” 分支v2.0上的代码,如下图
在这里插入图片描述
从“Show log”上选择你刚才提交的、要合并到生产的代码(看版本号和提交备注)
在这里插入图片描述
3)merge完成后,在v5.0上commit代码(把刚合的代码提交上去);
最后就可以申请生产上线了

4、(选)可以在idea中配置svn(或者git)

在这里插入图片描述

选择版本控制工具
在这里插入图片描述

5、在SVN添加新项目

1)在之前从svn上checkout过代码的文件夹,右键 TortoiseSVN -> Repo-browser
在这里插入图片描述
得到svn服务器目录后,就可以在里面创建文件夹
在这里插入图片描述
2)给svn新建文件夹放入初始代码的方式有两种:

法一,直接在svn文件夹中放入代码,
比如我们从svn其他项目中把代码复制到新的文件夹中作为项目的初始代码。

法二,先在本地checkout我们新建的文件夹,
然后把代码放入本地文件夹,
然后右键>>tortoiseSVN>>Add,会在文件或目录上面显示了“+”号,
最后右键>> “SVN Commit”,把本地放入代码作为项目的初始代码。

二、SVN生产问题记录

1、树冲突TreeConflict

合代码之前要先更新,一般树冲突是由于没更新代码引起的。
在这里插入图片描述
解决方式是,把发生树冲突项目的本地文件夹先删除掉,再重新拉取一次。

2、svn合并版本过多,可能引起报有冲突

实测,当合并版本过多时,有时会报有冲突、进而合并失败;改为小版本合并(一次合2~3个版本,尤其是有跳版本的、前后分开合并),冲突就没有了,以后遇到了可以试试小版本合并。

三、Linux操作svn

1、使用.sh脚本自动部署项目(svn相关说明)

1)假设有一个springmvc项目,以前每次部署需要打包、上传包、重启tomcat;
现在要改成自动部署,就是代码提交svn后,在测试环境(Linux)运行脚本;脚本自动从svn拉最新代码、用maven打包、重启tomcat…

2)提供一个脚本,大家可以参考一下,注意不要照搬

#!/bin/bash
set -m
#程序运行目录
server_dir=/usr/local/server

#源文件存储目录
source_dir=/webserver/bdp/source

#程序运行时服务
server_name=tomcat8480

#要运行的api
app_name=bdp-admin-web

rm -rf /root/.m2/repository/com/haoyisheng/*
rm -rf /root/.m2/repository/com/haoys/*
echo "--从svn更新api--"
cd $source_dir && svn up
echo "--打包--"
cd $source_dir && mvn clean package -Dmaven.test.skip=true
echo "--停止项目进程--"
#pid=`netstat -nltp | grep 8380 | awk {'print $7'} | awk -F "/" {'print $1'}`
pid=`ps -ef |grep java |grep $server_name  |grep -v 'grep'|awk '{print $2}'`

sleep 0.5
if [ -n "$pid" ];then
        echo "kill "$app_name" instance of pid: $pid"
        `kill -9 $pid`
fi

rm -rf $server_dir/$server_name/webapps/*
rm -rf $server_dir/$server_name/work/Catalina/localhost/*

cd $server_dir/$server_name/webapps/  && cp -r $source_dir/$app_name/target/$app_name.war ./

sleep 0.5
nohup  $server_dir/$server_name/bin/startup.sh > $server_dir/$server_name/logs/$app_name.log 2>&1 &

tail -f $server_dir/$server_name/logs/catalina.out

3)这里我重点记录一下svn相关的部分

第一点:脚本中需要用svn拉代码,这首先需要你系统装好了svn,其次需要提供代码的svn地址。
安装配置svn就不说了,说一下怎么配置项目拉取代码的svn地址。
先在合适的位置,给项目建一个文件夹,然后在文件夹执行以下svn命令:

# path就是项目的svn地址
svn checkout path

# 例如
svn checkout svn://192.168.0.241/MyRepository

# 也可以简写
svn co svn://192.168.0.241/MyRepository

命令是从指定svn地址拉取代码到当前位置,第一次手动执行命令拉取代码,之后只要在该文件夹下执行up命令行了,也就是上面脚本中配置的。

第二点:有时候项目的svn地址会变,这时候怎么改呢?
我的建议是不要改,直接把之前项目的文件夹删了,咱再给这个项目新建一个文件夹,然后再重新执行一次上面的手动拉取操作,只不过path换成新的snv地址,不就行了?相当于变相的换了svn地址,比较方便操作。

四、Git

1、Git简介

git由雷纳斯.托瓦斯开发,就是那个开发linux的男人。

每个要使用git的电脑,都要先安装git,这与svn不同。
svn只有远程中央服务器需要安装svn,其他开发电脑只要能访问这个svn就行,因为只有中央服务器要管理版本库,其他开发电脑只要能查看即可,所以开发电脑可以只安装一个使用方便的svn查看工具TortoiseSVN(注意TortoiseSVN可不是SVN);
而git,是远程库和每个开发电脑都要安装git,因为它是分布式的vcs。分布式其实就是说每个电脑即是开发电脑、也可以是其他电脑的“远程库”,每个电脑本地都要管理自己的版本库(Repository),所以都要有版本控制工具。
在这里插入图片描述

git更详细一点的工作流程图:
在这里插入图片描述

2、Git、GitHub、GitLab

首先,git是一个vcs,但是作者雷纳斯并没有为它设计图形界面,对于git的操作都是通过命令来执行。

GitHub,它扮演的角色,就是分布式vcs中的远程库(Remote)。
其特点呢,一是开源,二是有图形界面、有网页;
github是全球最大的开源项目托管平台,非常非常多的人用它作为git远程库存放自己的项目。github海量的开源项目中,不乏非常大牌、非常优秀的开源项目。
你可以去访问它的网站,从中找感兴趣的项目,拉取代码,学习、开发。
github顾名思义,只支持Git作为平台的版本控制工具。
在这里插入图片描述

GitLab,它扮演的角色,也是分布式vcs中的远程库(Remote);而且也是把git作为平台的唯一版本控制工具。
它与github的区别在于:
托管在github的项目一般都是开源的,谁都能看,要想私有,得交钱。
而托管在gitlab的项目,一般都是私有的。
所以有人也把gitlab叫作“git私库”。

工作中,各个公司的项目,当然不想也不能让别人都看到,所以公司的git远程库都用的gitlab。

使用GitLab前,首先需要在公司服务器安装gitlab,这个过程一般不用开发操作,由运维负责;而且一般早就有了,你只需要和运维申请一个账户(有的不用账户就能拉取/提交代码)。
就安装部署、应用方式而言,gitlab和rabbitmq、jenkins很相似,都是安装在linux服务器上;都有客户web页,可以在上面做配置、浏览等操作。

3、使用git从gitlab拉取代码

1)安装git

首先需要本地安装git,我电脑是windows系统,所以需要从git官网https://git-scm.com/下载git for windows
在这里插入图片描述
然后就是无脑点击下一步安装就行了,我都是使用的默认选项。

(下载太慢的话可以先从手机魔法上网,下载下来后再传到电脑,我这边只有手机可以魔法上网,你电脑也能翻墙的话当我没说)。

2)clone代码

法一:使用git命令拉取
在准备存放代码的文件夹下,右键 --> 打开git bash
在这里插入图片描述
输入命令

# branchName指分支名
# http://gitlabPath.git指gitlab代码地址
git clone -b branchName http://gitlabPath.git

在这里插入图片描述
法二:使用TortoiseGit客户端拉取
右键,TortoiseGit --> clone;然后设置url、dir、branch这三项,点ok即可
在这里插入图片描述

3)查看分支

法一:使用git命令
进入代码目录,右键打开git bash,然后输入

git branch

即可查看当前代码分支

4)提交代码

使用tortoiseGit,commit;提交到本地。
成功后,
使用tortoiseGit,push;推送到git私库。

5)补充

我们公司的gitlab是通过网络权限控制能否访问的;即内网,可以拉取代码、提交代码,内网的用户拉取、提交代码不需要输用户密码。
外网不行,用外网的话会报Couldn’t connect to server 或者 403
在这里插入图片描述
克隆、推送需不需要输账户密码应该是管理员可以配置的,在gitlab网页有配置的地方。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值