版本管理工具介绍
现在比较流行的版本管理工具是git,但是实际上git是近几年才发展起来的,可能有一些老的项目,还在用一些老的软件,如svn
版本管理发展简史
SVN(SubVersion)
工作流程
SVN是集中式版本控制系统,版本库是集中放在中央服务器的
工作流程如下:
- 从中央服务器远程仓库下载代码
- 修改后将代码提交到中央服务器远程仓库
优缺点:
- 优点:简单,易操作
- 缺点:所有代码必须放在中央服务器
- 服务器一旦宕机无法提交代码,即容错性较差
- 离线无法提交代码,无法及时记录我们的提交行为
svn流程图:
Git
工作流程
Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS),分为两种类型的仓库
本地仓库和远程仓库
工作流程如下:
- 从远程仓库中克隆或拉取代码到本地仓库(clone/pull)
- 从本地进行代码修改
- 在提交前先将代码提交到暂存区
- 提交到本地仓库。本地仓库中保存修改的各个历史版本
- 修改完成后,需要和团队成员共享代码时,将代码push到远程仓库
总结
git和svn的区别:
- svn是集中式版本控制工具,git是分布式版本控制工具
- svn不支持离线提交,git支持离线提交代码
Git的安装
git的下载
下载地址: https://git-scm.com/download
安装
资料地址:链接:https://pan.baidu.com/s/1A0woQ4juJ42eMJpaj2va2Q?pwd=v3e8
提取码:v3e8
-
按照上图的顺序直接下一步傻瓜式安装
-
其中安装的过程中需要填写一个邮箱和用户名(任意即可)
-
注意:安装完毕需要重启资源管理器,或者重启电脑!!!
-
更改语言
Git工作流程
Git初始化
先初始化一个本地仓
- 新建测试文件夹
- 进入文件夹,然后右键创建版本库
此时会看到:
- 文件上多了一个绿色的图标
- 文件夹内部生成了一个.git隐藏文件夹
Git流程
常用命令流程图
概念
本地仓库:实在开发人员自己电脑上的Git仓库,存放自己的代码(.git隐藏文件夹就是自己的本地仓库)
远程仓库:是在远程服务器上的Git仓库,存放代码(可以是github.com或者gitee.com上的仓库,或者是自己公司的服务器)
工作区:自己写代码(文档的地方)
暂存区:在本地仓库中的一个特殊文件(index)叫做暂存区,临时存储即将要提交的文件
命令
- Clone:克隆,将远程仓库复制到本地仓库
- Push:推送,将本地仓库代码上传到远程仓库
- Pull:拉取,将远程仓库代码下载到本地仓库,并将代码克隆到本地工作区
Git的基本使用
TorToiseGit操作本地仓库
初始化仓库
-
方法一:
新建一个文件夹,进入文件夹内部操作
右键–>在这里创建版本库
注意:不要在桌面上操作,否则桌面就是一个仓库
-
方法二:
右键–>Git GUI here
-
方法三:命令行格式
git init
创建完毕仓库,此时在创建的文件夹下有一个.git文件已经生成,并且仓库文件夹上多了一个绿色图标
添加文件
- 在仓库中新建一个文件
- 选中新建的文件–>右键–>TortoiseGit–>添加
- 此时为文件夹上多了一个+
提交文件至本地仓库
- 选中文件
- 右键–>git提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KYhuCdtz-1684478887842)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
修改文件,与再次提交文件
修改文件之后,文件上会多了一个红色感叹号,表示上次提交后该文件被修改过,再次提交后文件图标变成绿色
文件状态讲解
Git工作目录下的文件存在两种状态:
- untracked 未跟踪(未被纳入版本控制):比如新建的文件(此时文件夹上没有图标或者有一个“问号”
- tracked 已跟踪(被纳入版本控制)
- Staged 已暂存状态 : 添加 但未提交状态(此时文件夹上有一个“加号”)
- Unmodified 未修改状态: 已提交(此时文件夹上有一个“对号”)
- Modified 已修改状态 : 修改了,但是没有提交(此时文件夹上有一个“红色感叹号”)
这些文件的状态会随着执行Git的命令发生变化
修改文件,不提交和上一个版本比较差异
修改文件,此时不要提交
选中文件–>右键–>TortoiseGit–>比较差异
查看提交历史记录
选中文件
右键–>TortoiseGit–>显示日志
此时可以看到所有的历史提交记录
注意:如果你想要更改你的用户名:
右键–>TortoiseGit–>设置
选择GIt–>全局按钮—>修改用户名和邮件地址–>点击应用–>确定
回退至历史版本
右键–>TortoiseGit–>显示日志
选中某个版本–>进行如下操作
文件删除
本地删除与恢复
直接选中文件删除的话,只是删除了本地工作区的文件,并没有删除仓库中的文件,此时可以回退。如:
- 文件删除
- 右键–>TortoiseGit–>还原
此时会发现文件被恢复了
从版本库删除
如果想要将某文件从服务器删除,需要进行如下操作:
- 删除文件,和上面操作一样
- 提交,此时服务器文件已经删除(历史版本还在,还是可以恢复)
从版本库删除,但是不删除本地
可以只删除服务器上的文件,但是本地文件并不删除
注意:删除之后需要提交,才会真正的从服务器删除
忽略提交
此时在根目录下会生成一个.gitignore文件
忽略文件如何阅读,常见格式
#所有以.a结尾的文件夹被忽略(递归)
*.a
#不管其他规则怎样,强制不忽略 lib.a
!lib.a
#只忽略bulid文件夹下的所有内容(递归)这里是文件夹
bulid/
#忽略doc目录下以*.txt结尾的文件(不递归)
doc/*.txt
#忽略doc目录下以*.pdf结尾的文件(递归)
doc/**/*.pdf
Git的基本使用
TortoiseGit操作本地仓库(分支)
分支的概念
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,避免影响开发主线。多线程开发,可以同时开启多个任务的开发,多个任务之间不影响。
为什么要使用分支
单线程开发
如:有一个任务需要完成活动1,同时又需要在完成活动2的同时,撤销活动1,这时会比较棘手
多线程开发
创建分支
分支的查看切换
查看分支
查看分支图,会出现两个分支,当然也可以创建多个分支,可以看到多个分支的图形
切换分支
右键–>检出
分支的合并与删除
合并
当需求开发完毕之后,需要把需求的代码合并到主分支:
- 切换到主版本
- 右键–>合并即可将需求写的代码合并至主分支
此时代码自动合并到master分支
删除分支
冲突的处理
冲突的概念
开发人员在同一时间修改了同一地方的代码,导致合并到主分支上时,主分支不能只能判断第一行使用谁的代码,合并时会报错,这种现象叫做冲突
如何处理冲突
冲突的原因:
开发人员之间彼此没有沟通导致的同一时间节点修改了同一个地方的代码,合并时冲突
在处理冲突时,第一步应该找开发另一个需求的人员沟通,之后才是处理冲突
- 选中冲突的文件(带黄色感叹号的文件都是冲突的文件,如果有多个需要逐一处理)
- 右键–>编辑冲突
- 处理完毕后,标记已解决
标签
标签的概念
如果你的项目达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以给它打上标签(tag)。
如:想要为自己的项目发布一个“1.0版本”,需要给最新一次提交打上(HEAD)“v1.0”的标签
标签可以理解为项目里程碑的一个标记,一旦打上了这个标记,表示当前的代码将不允许提交
标签的创建
标签的创建和分支的创建操作几乎一样
标签的切换与删除
远程仓库
我们自己的代码不能总是放在本地,因为总是放在本地,一旦电脑出现故障,数据将会丢失。所以这里需要一个服务器,可以把代码放到服务器上,然后让别人下载,这样既可以备份代码,也可以进行团队写作开发
局域网仓库
可以搭建一个单间的局域网服务器共享代码
本地相对路径,多个文件夹之间共享代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eDUyoYGD-1684478887843)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
开启局域网共享代码
局域网这中共享是没有安全控制的,都可以访问,如果想要搭建一个可以控制权限的服务器需要借助第三方软件
常用远程仓库托管服务
常见的免费互联网远程仓库托管服务如下:
www.github.com
www.gitee.com
www.gitlab.com
github:是一个基于git实现在线代码托管的仓库,向互联网开放,企业版要收钱
gitee:即码云,是oschina免费给企业用的,不用自己搭建环境
gitlab:类似github,一般用于在企业内搭建git私服,要自己搭环境
github(gitee)、gitlab不同点:
- github如果使用私有仓库是需要付费的(只能三个人协同开发,想要更多需要付费),gitlab可以在上面搭建私人的免费仓库
- gitlab让开发团队对他们的代码仓库拥有更多的控制,相对于github,它有不少的特色
- 允许免费设置仓库权限
- 允许用户选择分享一个project的部分代码
- 允许用户设置projject的获取权限,进一步提升安全性
- 可以设置获取到团队整体的改进进度
- 通过innersourcing让不在权限范围内的人访问不到该资源
码云账号注册
填写邮箱发送验证码,然后可以注册账号
创建远程仓库
新建仓库
各个类型仓库之间的区别
将本地代码推送到远端
此时刷新仓库发现代码已经存在
填写的用户信息会保存在本地,下次提交无需填写用户名和密码
从远程仓库克隆代码
同样可以从库中下载代码
新建一个文件夹repo2,进入然后进行如下操作
此时代码就已经下载下来了
代码的修改与提交,查看历史
此时修改代码就不能仅仅是提交到本地了,提交完毕应该推送到远端服务器。如果别人从远端仓库下载最新的代码其实是可以看到代码修改的记录的
git–> 显示日志
ssh连接概述
实际上git不仅仅支持用户名密码方式的配置,可以有另一种相对安全的配置即ssh方式配置
ssh方式的底层原理
ssh连接池是RAS加密算法,又称非对称加密,是一种现在公认的最安全的加密方式
公钥私钥加密可以看作是古代的“虎符”,在本地电脑一份,远程服务器上一份,只要“虎符”核对通过,表示身份无误,可以执行提交等操作,无需输入用户名密码
ssh密钥的生成
#生成公钥私钥
ssh-keygen -t rsa
一直回车即可
会默认用户目录 .ssh 目录生成一个默认的id_rsa文件,和id_rsa.pub
ssh密钥配置
如果克隆失败,在TortoiseGit设置中执行如下操作:
远程仓库的其他操作
概念
当从gitee上查看别人的项目的时候,可能会看到上图中的按钮
指数:是gitee网站根据当前项目的各项指标计算出来的一个值
star:点赞,这里跟CSDN一样并不容易获得点赞
Watch:如果你watch了某个开源项目,那么这个项目后续所有的改动你将收到通知
Fork:将别人的代码克隆到你自己的仓库中,
- 作用一:如果担心某个优秀的项目别人突然有一天不开源了,你可以fork到自己仓库中
- 作用二:修改别人的代码
项目操作:
- 可以删除修改自己仓库的基本信息
- 可以邀请其他人成为项目的开发人员或者管理人员
可以删除修改自己仓库的基本信息
利用gitee搭建个人主页
- 将静态资源上传至仓库
- 选择服务pages即可部署
- 必须有个index.html文件
- 只能搭建静态网站,动态网站需要租赁服务器搭建提供服务
- gitee要求必须绑定手机号
命令行–Git基本操作
介绍
上述的操作,是客户端TortoiseGit操作的git,实际上底层依旧是使用的命令行帮我们执行,在早期git并没有窗口化工具,开发人员只能使用命令行模式
环境配置
当安装Git后首先要做的事情是设置用户名名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息
#设置用户信息
git config --global user.name "muchen"
git config --global user.email "muchen@muchen.cn"
#查看配置信息
git config --list
git config user.name
#通过上面的命令设置的信息会保存在~/.gitconfig文件中
初始化本地仓库init
#初始化仓库带工作区
git init
#初始化仓库不带工作区
git init --bare
克隆clone
#从远程仓库克隆
git clone 远程仓库地址
查看状态status
#查看状态
git status
#查看状态,使输出信息更加简洁
git status -s
add
#将未跟踪的文件加入暂存区
git add <文件名>
#将暂存区的文件取消暂存(取消 add)
git reset <文件名>
commit
#git commit 将暂存区的文件修改提交到本地仓库
git commit -m "日志信息" <文件名>
删除rm
#从本地工作区 删除文件
git rm <文件名>
#如果本工作区误删,想要回退
git checkout head <文件名>
命令行–git远程仓库操作
查看远程
# 查看远程 列出指定的每一个远程服务器的简写
git remote
# 查看远程,列出简称和地址
git remote -v
#查看远程仓库详细地址
git remote show <仓库简称>
添加/移除远程仓库
# 添加远程仓库
git remote add <shortname> <url>
从远程仓库获取代码
# 从远程仓库克隆
git clone <url>
#从远程仓库拉取(拉取到.git目录,不会合并到工作区,工作区发生变化)
git fetch <shortname> <分支名称>
# 手动合并 把某个版本的某个分支合并到当前工作区
git merge <shortname>/<分支名称>
# 从远程仓库拉取(拉取到.git目录,合并到工作区,工作区不发生变化) = fetch+merge
git pull <shortname> <分支名称>
git pull <shortname> <分支名称> --allow-unrelated-histories # 强制拉取合并
注意:当前本地仓库不是从远程仓库克隆,而是本地仓库的仓库,并且本地仓库中存在的文件,此时再从远程仓库拉取文件的时候会报错(fatal: refusing to merge unrelated histories ),解决此问题可以在git pull命令后加入参数–allow-unrelated-histories(如上命令)
# 将本地仓库推送至远程仓库的某个分支
git pull [remote-name] [branch-name]
命令行–分支
# 默认 分支名称为 master
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 创建分支
git branch <分支名>
# 切换分支
git checkout <分支名>
# 删除分支(如果分支已经修改过,则不允许删除)
git branch -d <分支名>
# 强制删除分支
git branch -D <分支名>
# 提交分支至远程仓库
git push <仓库简称> <分支名称>
# 合并分支 将其他分支合并至当前工作区
git merge <分支名称>
# 删除远程仓库分支
git push origin -d brandchName
命令行–tag
# 列出所有tag
git tag
# 查看tag详细信息
git show [tagName]
# 新建一个tag
git tag [tagName]
# 提交指定tag
$ git push [仓库简称] [tagName]
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag (注意 空格)
$ git push origin :refs/tags/[tag]
er
列出所有本地分支
git branch
列出所有远程分支
git branch -r
列出所有本地分支和远程分支
git branch -a
创建分支
git branch <分支名>
切换分支
git checkout <分支名>
删除分支(如果分支已经修改过,则不允许删除)
git branch -d <分支名>
强制删除分支
git branch -D <分支名>
```shell
# 提交分支至远程仓库
git push <仓库简称> <分支名称>
# 合并分支 将其他分支合并至当前工作区
git merge <分支名称>
# 删除远程仓库分支
git push origin -d brandchName
命令行–tag
# 列出所有tag
git tag
# 查看tag详细信息
git show [tagName]
# 新建一个tag
git tag [tagName]
# 提交指定tag
$ git push [仓库简称] [tagName]
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag (注意 空格)
$ git push origin :refs/tags/[tag]