源代码管理工具
为什么会出现源代码管理工具?
为了解决在软件开发过程中,由源代码引发的各种蛋疼、繁琐的问题
源代码会引发哪些问题?
无法后悔:做错了一个操作后,没有后悔药可以吃
版本备份:费空间、费时间
版本混乱:因版本备份过多造成混乱,难于找回正确的想要的版本
代码冲突:多人操作同一个文件(团队开发中的常见问题)
权限控制:无法对源代码进行精确的权限控制
追究责任:出现了严重的BUG,无法得知是谁干的,容易耍赖
… …
源代码管理工具就是为了解决上述问题而生的!此乃软件开发的一大福音!
CVS
开启版本控制之门
1990年诞生,“远古时代”的主流源代码管理工具
SVN
全称是Subversion,集中式版本控制之王者
是CVS的接班人,速度比CVS快,功能比CVS多且强大
在国内软件企业中使用最为普遍(70%~90%)
概念:
1> Repository 代码仓库,保存代码的仓库
2> Server 服务器,保存所有版本的代码仓库
3> Client 客户端,只保存当前用户的代码仓库
4> 用户名&密码 访问代码仓库需要使用自己的"用户名和密码",从而可以区分出不同的人对代码做的修改
操作:
1> checkout 将服务器上最新的代码仓库下载到本地,"只需要做一次"
2> update 从服务器上将其他人所做的修改下载到本地,"每天上班必须要做的事情"
3> commit 将工作提交到服务器,"每天下班之前至少做一次"
GIT
一款伟大的分布式源代码管理工具
目前被越来越多的开源项目使用
不过在国内企业尚未大范围普及
--------------------------------------------------------------------------------------------------------
基本操作
服务器端按照配置
客户端软件使用
与Xcode的集成
1.Chectout是下载服务器上得所有文件,
2.commit 是将本地修改之后的文件提交到服务器(只提交修改之后的)
3.update是将服务器上代码更新到本地(只会更新修改的文件)
SVN使用过程
提交代码时候报 out of date的错误,就是你从服务器上拿下来的代码,你修改后提交,但是这个你拿下来的代码在服务器上,已经被别人修改过了。
这时候你要commit上传,你必须要执行 update的操作,将服务器修改过的代码拿到本地。 这时候拿到本地以后就会把服务器上和你自己修改过的合并在一起。这时候就可以commit 上传到服务器了。
策略就是: 拷贝 修改 合并 (SVC、CVS采用)
还有比如微软的VSS: 锁定 修改 解锁的方案,弊端:不能并行开发。
--------------------------------------------------------------------------------------------------------------------------------------
SVN使用环境
要想利用SVN管理源代码,必须得有2套环境
服务器
用于存储客户端上传的源代码
可以在Windows上安装Visual SVN Server
大部分情况下,公司的开发人员不必亲自搭建SVN服务器
客户端
上传本地的源代码到服务器,或者更新服务器的代码到本地,保持同步
可以在Mac上使用命令行、Versions、Cornerstone
开发人员就属于客户端这个角色
Visual SVN Server下载地址
http://www.visualsvn.com/server/download/
SVN 端口号。http 为80 HTTPs为443
HTTP : 超文本传输协议 HTTPS : HTTP + SSL
-------------------------------------------------------------------------------------------------------------------------------------
命令行
查看 svn --help 系统提示常用命令 清除命令 clear
具体某个指令怎么用 svn help checkout
常用UNIX命令
cd 进入目录
pwd 查看路径
cd ../ 返回上级目录
1> SVN基本命令
命令行格式:
svn <subcommand> [options] [args]
说明
svn 子命令 [选项] [参数]
提示:
# [中括号]中包含的内容是可选的
# (子命令缩写)
2> 查看帮助信息
$ svn help
查看svn所有命令的帮助
$ svn help 子命令
附录:UNIX常用命令
================================================================================
1. cd 改变工作目录
2. pwd 输出当前工作目录的绝对路径
在UNIX中要执行什么命令,一定要知道自己当前所在的工作目录
3. ls 查看文件
$ ls 显示文件
$ ls -a 显示所有文件
$ ls -l 列表显示文件
$ ls -la 列表显示所有文件
$ ls -G 带颜色显示
4. touch 用于更改文件访问和修改时间的标准UNIX程序,也被用于创建新文件
$ touch myfile.txt
注意:touch不修改myfile.txt内容,只更改它的访问、修改时间,如果myfile.txt不存在,它会被创建
$ open myfile.txt 打开文件,可以直接进行编辑了。
5. cat 连续查看文件内容
6. more 分页查看文件内容
提示:
1> 命令和参数之间需要添加空格
2> 如果要使用当前目录中的文件名,输入到一半时,按TAB键能够补全
---------------------------------------------------------------- ---------------------------------------------------------------- ----------------------------------------------------------------
重新设置账号密码的时候 应该这样: svn checkout http://192.168.15.155/svn/weibo/ --username = ls --password=ls
在后面加上 username password 就可以了
SVN的本质是通过一个文件夹来管理源代码,默认情况下,用于管理源代码的文件夹是隐藏的,这个隐藏的文件夹的名称为:.svn
04. SVN演练准备
================================================================================
1> 显示隐藏文件夹
# 显示隐藏文件
$ defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder
# 不显示隐藏文件
$ defaults write com.apple.finder AppleShowAllFiles No && killall Finder
================================================================================
1.注意:新建文件或者文件夹之后如果直接提交(直接commit)
会报如下错误:is not under version control
该错误的含义是:提示我们提交的文件没有纳入到版本控制。
2.注意: 在提交代码的时候必须写上注释(一定要明确),否则会报错误cound find log 什么的
commit 要加注释 :SVN commit main.c -m "第一次提交"
如何查看哪些文件没有“入会” 加入本地管理文件夹。 指令是:SVN status 没有加入的,前面会出现?
3. 注意: svn add 只会添加到本地管理,不会添加到服务器
---------------------------------------------------------------------- ---------------------------------------------------------------------- --------------------------------------------------------
SVN客户端命令
svn checkout :下载服务器的代码到本地 (简写svn co)
svn commit :将改动的文件提交到服务器(简写svn ci)
svn update :更新服务器的代码到本地 (简写svn up)
svn add :向本地的版本控制库中添加新文件
svn delete、svn remove :从本地的版本控制库中删除文件(简写svn del、svn rm)
svn move :移动文件或者目录或文件更名
svn mkdir :创建纳入版本控制下的新目录
svn revert :撤销之前的一切修改
svn merge :将两个版本之间的差异合并到当前文件
svn info :查看文件的详细信息
svn diff :查看不同版本的区别
svn log :查看日志信息
svn list :列出版本库下的文件和目录列表
svn status :查看文件状态(简写svn st)
svn help :获取帮助信息(比如svn help ci)
svn lock :加锁
svn unlock :解锁
svn st 显示的文件状态
第1列状态说明:描述文件被添加、删除或其他修改
--------------------------------------------------------------------------------
' ' 没有修改
'A' 被添加到本地代码仓库
'C' 冲突
'D' 被删除
'I' 被忽略
'M' 被修改
'R' 被替换
'X' 外部定义创建的版本目录
'?' 文件没有被添加到本地版本库内
'!' 文件丢失或者不完整(不是通过svn命令删除的文件)
'~' 受控文件被其他文件阻隔
---------------------------------------------------------------------------------------------
反悔了,撤销 revert
1.注意:如果修改文件之后,并且文件没有提交(commit)想反悔,可以使用svn revert 这个指令,让文件回到上一次提交之前的状态(上一次下载的时候),注意是没有提交,要是提交了就不行了。
例如:先进入文件的目录后:svn revert main.m 可以悔到上次。
2.如果提交了 可以用update 解决,因为update除了可以更新服务器上得最新代码以外,还可以更新到指定的版本。(每次提交后SVN的版本号就会制动加1),版本号是唯一的,所以可以通过版本号更新到指定的版本。
例如: 进入目录后 svn update -r 3 回到第三个版本
3.查看某个文件的日志 进入相应的目录后 SVN log main.c 就可以看所有关于main.c的提交版本了。
---------------------------------------------------------------------------------------------
版本控制中最常见的2个问题
1.超时
使用SVN 有一个原则,先更新再提交。
只有本地的版本号大于等于服务器的版本号的时候才能提交,否则会报一个out of data的错误。
这时候应该先 在该路径下,先update,然后再提交,(如果不修改同一行就不会冲突的),直接合并成一行了,然后再提交。
2.冲突
当多个人,修改了 同一个文件的同一行代码就会报冲突的错误,Conflict discovered
我: main.c 11 行 abc
其他人: main.c 11行 45454
其他人已经提交了代码,我再提交代码就会有冲突
解决冲突 三种:
mine-conflict、代表用我们的代码替换服务器上得代码,本地的代码保留我自己写得
:在冲突后面输入命令:1.mc 先更新成功,2.然后在commit 提交 svn ci main.c -"增加了东西"
theirs-conflict、代表用服务器代码替换我们的代码。本地的代码只保留服务器的,会自动删除我的
命令: tc 然后更新
postpone、自己手动解决,本地文件中会同时保留服务器代码和本地代码
命令: p
会在本地创建三个备份:
main.c.mine 备份自己最新的版本
main.c.r17 本地修改之前的版本(r17是上个版本)
main.c.r18 服务器最新版本
《《《《《《《《 中间是我们自己修改的代码 =======
======== 中间是服务器最新的代码 》》》》》》》
注意:手动解决完冲突后需要告诉svn我们已经解决冲突了,这样才能保证数据的安全和SVN的可靠性
先进入路径后输入:命令:svn resolved main.c,三个备份被删除
接下来 提交代码 svn ci main.c -m"手动解决冲突"