Skip to content

代码版本控制

目前主流的有svn和git,git是分布式的,SVN是集中式的,开发人员可以建立自己的分支,并在自己的分支上进行操作,减少了冲突;git可以在没有网络的情况下使用,从远程库clone一个到本地库,没有网络的情况下,可以将修改提交到本地库,等有网的时候再传上去。

Git与Svn的区别

  • git和SVN的版本控制,是通过.git和.svn文件,.git只是在本地的版本库的目录下存在,而.svn存在于每一个文件夹,当我们不需要版本控制的时候,要删除.svn很费时。
  • 版本号问题,svn有明确的版本号,git对于每一个版本,都通过SHA1算法生成一个唯一标示的码,方便追溯到之前的版本。

SVN简介

SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。互联网上很多版本控制服务已从 CVS 迁移到 Subversion。说得简单一点 SVN 就是用于多个人共同开发同一个项目,共用资源的目的。

  1. 集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。

  2. 所有的版本信息都放在服务器上。如果脱离了服务器,开发者基本上可以说是无法工作的。

  3. 工作流程,每天早上从服务器更新最新的代码,如果遇到冲突需要解决冲突,在开发的过程中,要定时向服务器提交自己本地的代码,防止别人开发时拿到的不是最新的代码造成代码冲突。

  4. 下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。 这就是经典的 svn 工作流程,从流程上看,有不少缺点,但也有优点。

下载地址:

服务端 下载地址 (本教程使用Docker-compose方式)

SVN服务端

选择SVN版本

  • garethflowers不提供WebSvn且http还要自己配置,

  • elleflorio 内置了httpd,支持svn:与http: 两种模式进行代码拉取与推送,并且镜像本身内置了IF.SVNAdmin的可视化管理平台,创建资源库、管理用户及授权访问等比较方便。

推荐选择elleflorio。

docker-compose方式安装

yml
  #cat  /docker/docker-compose.yml
  svn:
    image: 'elleflorio/svn-server:latest'
    container_name: svn-server
    restart: always
    ports:
      - '3080:80'
      - '3690:3690'
    volumes:
      - '/docker/svn/svn_config:/etc/subversion/'
      - '/docker/svn/conf/svn_repo:/home/svn'

创建目录

bash
mkdir -p /docker/svn/conf/svn_repo #挂载存放版本文件夹
mkdir -p /docker/svn/svn_config    #挂载存放svn配置文件夹

创建文件

bash
cd /docker/svn/svn_config

新建文件:passwd、subversion-access-control

授权

bash
chmod 777 /docker/svn/svn_config/passwd
chmod 777 /docker/svn/svn_config/subversion-access-control

启动

bash
docker-compose up -d svn

访问控制台

http://IP:3080/svnadmin/

这里的3080和上面的端口映射有关系 账号:admin 密码:admin

进行配置

1.jpg

下面文件是svn 镜像启动容器中的,保证上面额挂载对应的路径,使得下面的文件对应,且有读写权限。

bash
/etc/subversion/subversion-access-control

/etc/subversion/passwd

/home/svn

/usr/bin/svn

/usr/bin/svnadmin
  1. 添加访问路径 1.png1.png

2.给用户或组添加访问项目权限 1.png

访问

http://IP:3080/svn/sxpcwlkj

sxpcwlkj 是仓库名

SVN客户端

每个开发人员都需要安装 svn 客户端。安装完成后鼠标右键就会多出几个菜单。

1.png

下载地址:

客户端 下载地址

推荐:可以直接在360软件管家搜索下载,也可以安装中文语言包

  • 点击 checkout(检出,get),第一次需要代码仓库的地址和服务分配的账号密码验证。验证通过后即可使用 update 与 commit 分别完成代码的拉取和提交。注意:在提交前先获取最新代码。

文件忽略

  • 在 maven 项目开发中,.idea、target、*.iml 是不需要提交的,一旦提交会导致项目出错。一般通过设置让 svn 不提交该文件或文件夹。

2.png

文件冲突

  • 在实际开发中,每个程序员负责自己的开发模块,一般不会同时修改一个类文件。如果两个开发人员修改了同一行代码;

svn 服务器无法合并时会生成 3 个文件

  1. 最新没有冲突版本;
  2. 你的版本;
  3. 对方版本;

放弃自己的更新:使用svn revert(回滚),然后提交。在这种方式下不需要使用svn resolved(解决)。

放弃自己的更新:使用别人的更新。使用最新获取的版本覆盖目标文件,执行resolved filename并提交(选择文件—右键—解决,使用svn --resolved)。

手动解决: 此时需要仔细检查代码冲突部分,改正后将多生成的三个文件删除后才能提交,也可以使用右键svn菜单中的 Resolve 功能进行解决冲突。

手动:

在冲突的文件上(选中文件–右键菜单—TortoiseSVN—Edit conflicts(解决冲突))

如果要使用服务器版本,在Theirs窗口选中差异内容,右键,选择Use this text block(使用这段文本块)。

同理如果要使用本地版本,在协商后,在Mine窗口右键,选择Use this text block(使用这段文本块)。

3.png

Git简介

Git 是目前世界上最先进的分布式版本控制系统(没有之一),Git记录版本历史只关心文件数据的整体是否发生变化。Git 不保存文件内容前后变化的差异数据.实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一连接。

🔰 在项目开发中,团队协作管理代码和文件是每天必须要做的事情。

大家一定会碰到如下几个场景和问题?

  1. 协同修改,多人并行开发修改服务器的文件
  2. 数据备份
  3. 版本管理,权限控制
  4. 如果文件和工程误删了还能找回来吗?
  5. 分支管理 1.0 2.0
  6. 遇到了文件冲突如何解决?
  7. 如何把一些我临时保存的文件不要提交?

Git工作机制

4.png

1、工作区:存放代码的地方

2、暂存区:临时存储,将工作区的代码让git知道,通过git add将代码放到暂存区

3、本地库:将暂存区的代码提交到本地库,就会生成对应的历史版本,这个代码就无法删除

4、远程库:将本地库的代码推送到远程库

Git安装

官网 Git官网地址

下载 Git下载地址

配置环境变量path,现在的版本会自动添加系统环境变量

使用git --version查看 git 是否安装成功

5.png

TortoiseGit下载与安装

下载 下载网址

6.png

安装的方法,一直下一步就行,具体做法省略。 在桌面空白处鼠标右键

7.png

说明TortoiseGit已经安装成功

Git常用命令

命令名称作用
git config --global user.name 用户名设置用户名
git config --global user.email 邮箱设置用户邮箱
git init初始化本地库
git status查看本地库状态
git add 文件名添加到暂存区
git commit -m " 日志信息" 文件名提交到本地库
git reflog查看历史记录
git reset --hard 版本号版本穿梭

设置用户签名

签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到, 以此确认本次提交是谁做的。 Git 首次安装必须设置一下用户签名, 否则无法提交代码。

TIP

※注意: 这里设置用户签名和将来登录 GitHub (或其他代码托管中心)的账号没有任何关系。

初始化本地库

bash
# 获取目录的管理权
git init

本地和远程仓库关联

bash
git remote add origin  <新仓库地>

替换远程仓地址

bash
git remote set-url origin  <新仓库地>

查看远程仓库列表

bash
git  remote -v

查看远程库详细信息

bash
git remote show <远程仓库>

检出远程仓库项目

bash
# 默认主分支
git clone  <仓库地>  <自定义检出项目>
# 指定分支
git clone -b <分支>  <仓库地>

从远程仓库更新

bash
# 分支名要和当前本地分支一致
git pull origin <分支>
# 简洁版
git pull

查看本地库状态

bash
# 获取目录的管理权
git status
  1. On branch master (在master分支)

  2. No commits yet (还没有提交)

  3. nothing to commit (create/copy files and use "git add" to track) (当前没有要提交的)

8.png

  1. nothing added to commit but untracked files present (use "git add" to track) (红色代表这个文件虽然有了,但是至少存在工作区,git从来没有追踪过这个文件)

添加暂存区

bash
# 将工作区的文件添加到暂存区
git add 文件名/文件夹
# 添加全部
git add ./*

添加后再次检查状态,将不在是红色了

9.png

撤回暂存区

bash
# 取消暂存文件,即把暂存的变更放回工作区
git reset HEAD

回退版本

bash
#git回退到上个版本
git reset --hard HEAD^ 
#回退到前3次提交之前,以此类推,回退到n次提交之前
git reset --hard HEAD~3

提交本地暂存区

bash
# 将暂存区的文件提交到本地库
git commit -m '提交备注'

再查看状态,(没有文件需要提交)

10.png

  • 新增、修改、删除 用查看状态命令 git status 都可以检查出,
  • 之后提交到暂存区 git add 文件名
  • 本地仓库 git commit -m “日志信息” 文件名

本地版本推送到远程仓库

shell
git push <远程仓库地>  <远程分支>

历史版本

bash
# 查看版本信息
git reflog
# 查看版本详细信息
git log

版本穿梭

bash
# 版本回退
git reset --hard  版本号

# 回退到指定版本
git log
git show  dde8c25694f34acf8971f0782b1a676f39bf0a46

#退到/进到 指定commit的sha码
git reset --hard dde8c25694f34acf8971f0782b1a676f39bf0a46

git reflog查看版本号

11.png

Git分支操作

Git 切换版本, 底层其实是移动的 HEAD 指针,在版本控制过程中, 同时推进多个任务, 为每个任务, 我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来, 开发自己分支的时 候, 不会影响主线分支的运行。对于初学者而言, 分支可以简单理解为副本, 一个分支就是 一个单独的副本。(分支底层其实也是指针的引用)

12.png

分支有点

  • 同时并行推进多个功能开发,提高开发效率。

  • 各个分支在开发过程中, 如果某一个分支开发失败, 不会对其他分支有任何影响。失败 的分支删除重新开始即可。

分支的操作

命令名称作用
git branch 分支名创建分支
git branch -v查看分支
git checkout 分支名切换分支
git merge 分支名把指定的分支合并到当前分支上

查看分支

bash
# 查看
git branch -v

当前只有一个分支

13.png

创建分支

bash
# 创建
git branch 分支名

14.png

切换分支

bash
# 切换
git checkout 分支名

14.png

修改 dev分支的某一个文件

15.png

修改文件

16.png

17.png

操作

18.png

合并分支

bash
# 合并
git merge 分支名

19.png

产生冲突

冲突产生的表现: 后面状态为 MERGING

冲突产生的原因:

合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。 Git 无法替 我们决定使用哪一个。必须人为决定新代码内容。

查看状态(检测到有文件有两处修改)

制造冲突

【第一步】 切换到master分支上,修改001.txt 并提交到本地 【第二步】 切换到dev分支上,修改001.txt 并提交到本地 【第三步】 切换到master分支上,合并dev分支 【第四步】 查看状态出现 MERGING (冲突)

20.png

解决冲突

编辑有冲突的文件,删除特殊符号,决定要使用的内容

特殊符号: <<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> 分支名

21.png

  • 去除特殊符号,保留自己应该需要的版本

22.png

  • 添加到暂存区

  • 执行提交(注意: 此时使用git commit 命令时不能带文件名)

23.png

我们修改的只是master分支的内容,dev分支的内容没有发生改变

Git团队协作机制

团队内协作

24.png

跨团队协作

25.png

Gitee码云操作

码云网址:官网地址

创建项目

26.png

远程仓库操作

命令作用
git remote -v查看当前所有远程地址别名
git remote add 别名 远程地址起别名(第一次)
git push 别名 分支推送本地分支上的内容到远程仓库
git clone 远程地址将远程仓库的内容克隆到本地(第一次)
git pull 远程库地址别名 远程分支名将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并

本地仓库推送远程仓库

还没有本地仓库
  • 创建本地仓库
bash
# 初始化
$ git init
# 添加一个文件 
$ touch README.md
# 添加缓存区
$ git add README.md
# 添加到本地仓库
$ git commit -m "first commit"
  • 已有仓库
bash
# 查看当前所有远程地址别名
$ git remote -v
# 关联远程仓库,推送的最小单位是分支,所以一定要指定分支
$ git push -u 别名 分支

# 例如
$ git remote add origin https://gitee.com/mmsBase/test.git
# 推送到远程仓库
$ git push -u origin "master"

27.png

推送的时候需要登录,登录自己的 码云账号即可

28.png

常用案例

  • 检出项目: git clone <分支名可忽略,默认主分支> <远程仓库地址> <本地项目文件夹>
  • 更新项目:git pull
  • 添加到暂存区:git commit -m '提交备注'
  • 提交到远程仓库:git push <远程仓库地址> <远程分支名>
  • 合并分支:
  1. 将目标分支main进行更新:
sh
# git pull <远程主机名> <远程分支名>:<本地分支名>
# 本地和远程分支名一样时,可以省略远程分支名
git pull origin main:main
  1. 切换到自己的分支
sh
#git checkout <分支名>
git checout spn
  1. 进行合并分支将main合并到当前分支
sh
#git merge <源分支名>
git merge main
  1. 解决冲突
sh
a.手动解决冲突文件
b.保存

git add <文件>

git commit -m "更新"
  • 删除本地文件 后 也需要 将删除的文件 进行 add

邀请加入团队

选择邀请合作者

30.png

填入想要合作的人

31.png

SSH免密登录

我们可以看到远程仓库中还有一个 SSH 的地址,因此我们也可以使用 SSH 进行访问。

具体操作如下:

SSH公钥设置

Windows 用户建议使用 Windows PowerShell 或者 Git Bash,在 命令提示符 下无 cat 和 ls 命令

通过命令 ssh-keygen 生成 SSH Key:ssh-keygen -t ed25519 -C "Gitee SSH Key"

  • -t key 类型
  • -C 注释

输出,如:

bash
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/git/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/git/.ssh/id_ed25519
Your public key has been saved in /home/git/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:ohDd0OK5WG2dx4gST/j35HjvlJlGHvihyY+Msl6IC8I Gitee SSH Key
The key's randomart image is:
+--[ED25519 256]--+
|    .o           |
|   .+oo          |
|  ...O.o +       |
|   .= * = +.     |
|  .o +..S*. +    |
|. ...o o..+* *   |
|.E. o . ..+.O    |
| . . ... o =.    |
|    ..oo. o.o    |
+----[SHA256]-----+
  • 中间通过三次回车键确定

查看生成的 SSH 公钥和私钥:注意以上秘钥生成的路径 /home/git/.ssh

  • 私钥 id_rsa

  • 公钥 id_rsa.pub

读取公钥文件

bash
cat ~/.ssh/id_rsa.pub

32.png

复制公钥内容,点击确定

33.png

IDEA集合Git

配置Git忽略文件

IDEA特定文件

与项目的实际功能无关, 不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。

创建忽略规则文件 xxxx.ignore (前缀名随便起, 建议是 git.ignore)

git.ignore 文件模版内容如下:

js
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
                       .mtj.tmp/
    # Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
#        virtual        machine        crash        logs,        see
http://www.java.com/en/download/help/error_hotspot.xml
    hs_err_pid*
.classpath
    .project
    .settings
target
    .idea
*.iml

.gitconfig

文件中引用忽略配置文件

bash
[user]
	name = xijue
	email = xijue@126.com
[core]
excludesfile = C:/Users/my/git.ignore
	
# 注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”

IDEA定位Git程序

34.png

IDEA初始化本地库

选中要创建的项目文件夹

35.png

会多出一个 .get 文件夹

36.png

IDEA添加到暂存区

37.png

IDEA提交到本地库

38.png

39.png

40.png

41.png

42.png

IDEA切换版本

在 IDEA 的左下角, 点击 Version Control,然后点击 Log 查看版本

右键选择要切换的版本, 然后在菜单里点击 Checkout Revision。

43.png

IDEA创建分支

44.png

45.png

IDEA切换分支

46.png

IDEA合并分支

如果代码没有冲突, 分支直接合并成功, 分支合并成功以后, 代码自动提交, 无需手动 提交本地库

47.png

IDEA解决冲突

48.png

手动合并完代码以后,点击右下角的 Apply 按钮。

代码冲突解决, 自动提交本地库。

49.png

IDEA集成码云

安装插件

101.png

安装成功后,重启 Idea。

Idea 重启以后在Version Control 设置里面看到 Gitee,说明码云插件安装成功。

102.png

在码云插件里面添加码云帐号, 我们就可以用Idea 连接码云了。

  • 点击添加账号会自动打开gitee 网站进行让你登录账号

  • 登录成功后需要你同意客户端的授权

104.png

103.png

104.png

105.png

106.png

107.png

Released under the MIT License.