第1部分 版本管理工具介绍——SVN 篇
一、版本控制简介:
1.什么是版本控制?
软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理。
最主要的功能:
追踪文件的变更。
让版本库中任意文件恢复到任意版本。
可查看代码在什么时间被什么人修改过。
版本控制包括:检入检出控制、分支和合并、历史记录。
2.为什么要用版本控制工具
版本控制工具的作用:帮助我们记录和跟踪项目中各文件内容的修改变化。
版本控制工具的分为3类:
1)、直接访问式版本控制系统
2)、集中式版本控制工具,比如CVS、SVN
3)、分布式版本控制工具,比如git
集中式版本控制工具和分布式版本控制工具的区别在于:开发人员之间相互同步修改内容的方式不同。
二:各种版本比较
CVS(使用量较少,从RCS发展而来)、SVN、GIT
并发修改:全部支持
并发提交:CVS每个文件均出现一个版本号。支持:SVN和GIT
历史轨迹:SVN和GIT支持更名,即使改名也可以定位到对应版本,CVS不支持
分布式:GIT支持(不需要专门服务器),SVN和CVS不支持(需要专门的服务器)
三、SVN 服务器端的安装和配置 Windows的SVN教程
客户端下载地址:TortoiseSVN:http://tortoisesvn.net/downloads.html
服务端下载地:VisualSVN:http://www.visualsvn.com/server/download
服务端和客户端配置图
客户端配置:
选择安装目录
仓库位置及磁盘路径(仓库下载后所放的位置)。
该文件用于跟服务端仓库联系的文件夹,可以进行svn的操作,增删改查代码。其中的.svn千万不要删,若删除则变成一个普通文件夹。
四、SVN的基本操作
1、基本操作
1).在有.svn的文件夹中创建一个Test.java文件,右键,commit进行提交。可以直接在文件夹中删除文件,然后svn—commi,选中删除。。
2).修改文件但未提交时,客户端和服务端的文件内容不同,需commit进行提交。
2、SVN常见问题
1).TortoiseSVN—Settings—Saved Data—clear all 清除权限。
2).及时更新代码,提交时加上文字说明。
3).TortoiseSVN—Show log 查看文件历史记录。
4).若想恢复到某次修改,右击该记录—Revert to this revision 恢复到该版本—Revert,。
5).误操作,删除某文件。在.svn文件的文件夹右击鼠标,选择Show log,下载对应文件。
6).若A和B用户在操作同一文件时,A提前提交,B再提交会出现提交失败问题。此时需要更新最新版本文件(SVN的自动合并)。若A和B改的是同一行代码,则会冲突无法自动合并。
7).a.A和B文件若冲突地方较多,且双方均有可用代码。b.若代码被修改但未发现
解决方法:
a.先将自己修改的内容备份,再把最新版本更新下来,使用TortoiseSVN—Diff进行比较,并协商。
b.Showlog,逐个版本进行寻找,找到修改的作者,进行协商。
第2部分 SVN从入门到放弃 Linux的SVN教程
安装命令: subversion包含服务端和客户端
Ubuntu: apt-get install subversion
CentOS: yum install subversion
其余linux版本,不保证代码全部可执行
服务端和客户端命令
服务端:
svnserver:控制svn系统服务的启动
svnadmin:版本库的创建/导出/导入/删除等
svnlook:查看版本库的信息等
客户端:
svn:版本库的检出/更新/提交/重定向等
创建版本库: svnadmin create/path/repos
如:mkdir svnroot;svnadmin create/svnroot/test 或者cd svnroot svnadmin create test2
svnadmin create --fs-type fsfs/dbd test:数据保存类型
删除版本库:rm -rvf/path/repos rm -rvf/svnroot/test1
版本库配置: 配置文件位于:/path/repos/conf/
authz:配置用户组以及用户组权限
passwd:配置用户名和密码
svnserve.conf:配置默认权限、权限配置文件及密码配置文件
版本库的访问:
运行svn:svnserve -d -r /svnroot/test/
访问svn服务
1)在桌面创建文件夹svntest
检出版本库
2)cd svntest— svn checkout/co svn://ip地址(域名) --username test --password xxx 也可以co svn://ip地址(域名) 输入用户名和密码
https://tortoisesvn.net/ 自行下载客户端软件
桌面鼠标右击有checkout检出
svn自启动:
vim /etc/rc.local
svnserve -d -r /svnroot/test/ 在exit0前加操作命令
SVN常见术语及文件状态
术语:版本库、检出、工作副本、更新、提交、删除、修改
文件状态:无版本控制、增加、修改、常规、冲突、删除、锁定
checkout和export的区别与使用
checkout:检出,检出的工作副本目录中含.svn文件夹,在版本控制下
export:导出,导出的项目文件中没有.svn文件夹,无版本控制
如:
svn checkout -r 版本号
svn export -r 版本号
常见SVN客户端命令:
svn add: 添加到版本控制
svn add 文件名
svn add 目录名 增加目录及目录下文件
svn add 目录名 --non-recursive 只增加目录
svn add * 加载所有文件和目录 svn add * --force 强制执行增加
svn commit/ci:提交修改到服务器
svn commit -m "文字说明" 文件名
svn commit -m "文字说明" * 提交所有改动
svn update/up:更新工作副本
svn update/up 更新到最新版本
svn update/up -r 版本号 文件名 查看历史版本
svn delete/del:从版本库中删除文件或目录
svn delete/del/remove/rm 文件名 -m "文字说明"(可省略)
svn diff 文件名: 比较版本差异
svn mkdir 文件名:创建目录并增加到版本控制
svn cat 文件名:不检出工作副本,直接查看文件
工作副本还原revert
svn revert 文件名
svn revert *
svn revert --recursive * 递归恢复(包括子文件夹文件)
冲突
什么是冲突
常出现于工作副本长时间未更新
修改内容与需更新内容在同一处
发生树冲突的都不是二进制文本文件
如何避免冲突
如何解决冲突
发生冲突时,先推迟处理;
当处理冲突后,需要 svn resolved 命令,告诉服务端冲突已解决。
查看冲突文件时:
此时我们只需要在一排<<<<<<<<<<
........
一排========== 之间寻找就可以了
........
>>>>>>>>>>
小于号(<)到等号(=)之间的内容是自己的;
等号(=)到大于号(>)之间的内容是对方的。
如果一时还无法决定,我们可以输入p进行推迟提交; 如果已经决定了,那么就可以输入e来编辑这个文件。
锁定lock与解锁unlock
svn lock 锁定文件,防止其他人对文件进行提交
svn unlock 解锁文件
svn list :列出当前目录先所有文件
svn status:列出工作副本中文件(夹)的状态
svn log:查看提交日志(来自svn cide -m参数)
svn info:工作副本及文件(夹)的详细信息
多版本库的解决方案:
TCP/IP协议端口号范围:0-65535号
0-1023号为公认端口
1024-49151号为注册端口
49152-65535号为私有端口,用户可随意分配
解决方法:
监听端口:svnserve -d -r /path --listen-port 端口号
killall svnserve 停止所有服务
1).手动指定不同的版本号
2).将版本库放入同一目录下,使多个版本库用同一个端口号 svnserve -d -r /svnroot/
检出工作副本:svn co svn://ip地址/test
总结:多个端口号可以创建在任意位置,但端口号容易混淆;使用同一个端口号必须创建在同一目录下,无需分配端口号。
svn copy
工作副本到工作副本的复制:svn copy/cp 文件名 目标文件名
指定文件版本:svn copy/cp -r 版本号 文件名 目标文件名
多个文件复制:只能复制到处当前位置以外的位置
svn cp 文件名1 文件名2 ... path
本地工作副本到线上副本的复制(不能跨库):svn cp 文件名 svn://ip/path/目标文件名 -m "说明"
线上到本地工作副本复制(可以跨库):svn cp svn://ip/path/文件名 目标文件名
主干版本和分支版本
创建分支版本
将当前版本库cp到主干版本:svn cp svn://ip/test/ svn://ip/test/trunk -m ""
创建分支版本:svn cp svn://ip/test/trunk svn://ip/test/branch -m ""
在工作中,当版本库创建好后,创建trunk和branch和备份版本
HOOKS钩子应用:
什么是钩子:当执行某些特定操作时触发执行预定设定好的任务
进入版本库的hooks目录中,会看到以.teml结尾的文件,去掉.teml结尾,该文件则会执行。
例如:cp -a post-commit.tmpl post-commit
赋予可执行文件:chmod +x post-commit
版本库的精简和丢弃:
killall svnserve—svnadmin dump /svnroot/imooc(版本库文件系统的路径)/ -r 6:16 > -/tt.repo 丢弃版本6之前版本
创建新的版本库newtest—将版本库数据加载进来 svnadmin loa /svnroot/newtest/ < ~/tt.repo
将test版本库中的配置文件复制到新的版本库中:
cp -av /svnroot/test/conf/* /svnroot/newtest/conf/
删除旧版本库:rm -rvf /svnroot/test
运行版本库:svnserve -d -r /svnroot/
版本库的迁移与重定向
迁移:
方法1:从旧的版本库备份数据,然后创建一个新的版本库,把备份的数据加载到新的版本库中
方法2:整个版本库压缩成一个压缩包,再移动到新的服务器上解压后再运行
1).停止svn的服务
2).把/svnroot/repo压缩车repo.zip
3).复制repo.zip到新服务器并解压
4).在新服务器上运行repo版本
重定向:当版本库迁移之后,它的UIL就会失效。那么我们就要把服务端的UIL重新定义到新的UIL上。
演示:
1).停止svn服务
2).迁移版本库,并运行
3).svn switch/sw --relocate svn://ip/原url svn://ip/新url
4).执行svn update
常见坑与总结
1-忘记配置svnserve.conf
2-运行版本库的路径问题 运行或检出必须有一个
3-svnadmin dump(>)/load(<) 管道符号
至此,SVN常用操作教程完成。
关于GIT教程,等有空闲时会及时补上。
第3部分 版本管理工具介绍——GIT 篇
GIT介绍
版本控制工具发展历程:
1:cvs 1985,集中式, 始祖 (网络环境)
2:svn 2000,集中式 , 集大成者 (网络环境)
3:git 2005,分布式,geek主流 (无网环境)
4:GitHub 2008,托管网站,geek社区 (程序猿托管网络)
集中式:服务器 分布式:效率高
GIT下载和安装:
GitHub官网-->Find out more-->https://desktop.github.com/-->下载Git(Hub)-->默认安装。
Linux安装GIT:
软件包管理器安装:yum install git
yes表示同意安装
git --help ,git帮助文档
GitHub注册:
https://github.com/pricing
注册github账号: 通过github客户端进入github官网 进行注册,邮箱验证。
svn版本需要联网操作!而git不用联网就能进行操作。
新建一个Git项目:
- New repository。 2、新建项目的页面中:项目名称repository name(不可用中文),描述Description(可用中文),他人是否可见(public/private),是否加载一个README(勾选了那么我们创建的项目写的一些注解,可以在GitHub上边首页看到注解)。
将项目克隆到本地
1:mkdir test 先创建文件
2:cd test
3 : git clone URL (在GitHub中复制项目的链接)
4:ls 查看
Linux环境下第一次提交项目:
vi 文件名 新增一个文件
git status 查看工作区的状态
git add 文件名 建立跟踪
git commit 提交变更
git push 推送到GitHub上。
填写账号和密码,完成推送。
Windows下检出项目和提交项目:
github主页,点击clone to desktop->open in desktop
本地git客户端编辑,同步Sync 右击、忽略所有bak文件。
代码冲突:
同一时间,同一块代码,不止一个人修改,产生了代码冲突。
Linux下解决思路:
- A先提交文件F,正常提交,无冲突问题.
2. B提交文件F时,报冲突.
3. B需要执行: git pull 操作,会自动将服务器端有冲突的最新文件,合并到本地
4. 进行修改,修改后重新提交。
git pull 把github上的代码拉到本地
git diff 比较两个冲突文件的不同
Windows下解决思路:
提交产生冲突提示,点击OK,会自动合并冲突内容,编辑修改,再点击Sync。
版本回到过去:
git log //查看git 提交日志,获取之前提交ID
git reset --hard commitID
回到未来:
git reflog //查看回到过去之前的版本号
git reset --hard commitID
建立里程碑,版本号 操作步骤:
- 在github网站上.进入项目首页.
2. 横栏按钮(commits, branches, release等),找到release按钮.
3. 找到按钮:draft a new release,点击进入下一页面.
4. 填入版本号,以及说明信息.
分支开发与分支合并
创建分支,修改内容,提交,发布
合并分支到master
切换到master,进入新分支
将新分支拖拽到master 左侧,merge
另一种分支方式,更适合开源软件
修改提交发布新分支
右键点击项目名称,view in github,
点击按钮merge push request,commit
经验共享:
1、多用客户端和工具,少用命令行,除非是在Linux服务器上直接开发。——学习工具是为了提升我们的工作效率,不是为了研究工具本身
2、每次提交前,diff自己的代码,以免提交错误的代码
3、下班回家前,整理好自己的工作区
4、并行的项目,使用分支开发
5、遇到 冲突,搞明白冲突的原因,千万不要随意丢弃别人的代码