我们知道,数字IC的开发是一群研发工程师围绕着RTL代码干活的过程,代码的迭代动辄成千上万个版本。对于没接触过项目的新手,不知道想过这个问题没有:如何保证大家修改过的代码实时同步更新到每一个人手里呢?
版本控制系统就是一种用于多人协同开发的技术,可以管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,还可以恢复以前的版本。
目前常用的版本控制系统有两种,集中化的版本控制和分布式版本控制。
1 svn属于集中式的版本控制系统
版本库集中存放在中央repository,这个repository像一个文件服务器,它会记住每一次用户提交的文件改动,所以用过可以查看文件的变动历史,也可以将文件恢复到之前的版本。新手开始干活了,用的都是个人电脑,所以要先从中央repository获取最新的版本,然后开始干活,干完活了,再把自己的文件修改上传给中央repository,生成新的版本。集中式版本控制系统必须联网才能工作,局域网中速度还行,但是在互联网环境下,网速通常比较慢。
repository(源代码库):源代码统一存放的地方,用户提取、提交、更新代码的地方
checkout(提取):刚开始工作时,你需要从repository checkout一份
commit(提交):工作对代码进行了修改,你需要将修改的文件Commit到repository
update (更新):别人也会提交新代码到repository, Update一下你就可以和repository上的源代码同步了
开发流程大致是这样:刚接入项目,svn co xxx,checkout源代码库,就可以开始和同事协同开发了;第二天,同事昨天做了一些文件修改,为了保持同步,svn up xxx,update获取最新的代码;工作了几天,你发现了一些bug,对相关文件做修改并调试成功了,这时候svn ci xxx,将修改的文件提交至repository中,同事就可以看到你的修改了。如果你想在版本库添加新的文件用于更新迭代,svn add xxx,将新文件加到repository中。当你和同事同时对一个文件进行了修改,SVN会自动合并两种修改,但是如果修改的是同一行,就会报conflict冲突提示,这时候就需要你们double check文件了。
常用命令:
svn add 添加文件、目录或符号链
svn co 从版本库取出一个工作拷贝
svn ci 将修改从工作拷贝发送到版本库
svn del 从工作拷贝或版本库删除一个项目
svn diff 比较两条路径的区别
svn help 帮助
svn info 打印路径的信息
svn log 显示提交日志信息
svn merge 应用两组源文件的差别到工作拷贝路径
svn resolved 删除工作拷贝文件活目录的“冲突”状态
svn revert 取消所有的本地编辑
svn up 更新本地的工作拷贝
2 git则是分布式的版本控制系统
没有中央repository,在每一个使用者电脑上就有一个完整的数据repository,因此没有网络依然可以使用Git,离线在本地提交,在连网时推送到相应的服务器或者其他用户本地,除此之外Git还具有强大的分支管理功能
working directory(工作区):在本地电脑里的工作目录
staging area(暂存区):index文件中,缓冲提交操作
repository(版本库):管理所有版本文件的仓库
工作流程如下:克隆Git资源作为工作目录;在本地的资源上修改或添加文件;如果他人提交了修改,你可以更新资源;调试通过后提交修改的文件;发现还是有错误,可以撤回提交再次修改后提交。git add从工作区提交到暂存区,git commit从暂存区提交到本地仓库,git push从本地仓库提交到远程仓库。
常用命令:
git clone 拷贝一份远程仓库,即下载一个项目
git add 添加文件到暂存区
git commit 将暂存区内容添加到仓库中
git checkout 切换分支或恢复工作树文件
git pull 下载远程代码并合并
git push 上传远程代码并合并
git status 查看仓库当前状态,显示有变更的文件
git diff 比较文件的不同
git reset 回退版本
git rm删除工作区文件
git mv 移动或重命名工作区文件
git init 初始化仓库
git log 查看历史提交记录
git fetch 从远程获取代码库
两者特性对比:
小结:
Git和SVN都是目前主流的版本控制系统。Git可能更难压缩和存储二进制文件,但它可以离线使用。分支和合并支持也被认为是Git的优势所在。SVN具有全局的版本号,而Git则没有。在磁盘空间存储方面,SVN和Git存储库之间几乎相等。但不管怎样,用哪个还得是取决于你的公司呀