前言:从事iOS开发一年多以来,一直使用svn管理源代码。对svn的特点和弊端已经深有体会。前些天双十二前后,项目工期紧张到爆,起早贪黑的加班,可谓披星戴月,这还不止,回到家中还要疯狂的敲代码。那么问题来了,公司svn服务器是内网服务器,在家里无法访问,提交/更新代码就成了问题。跟技术总监(笔者公司为初创型小公司,直接和技术总监对话)沟通后,技术总监同意了把svn服务器改为外网服务器。但是,这并不是好的解决办法,毕竟svn服务器挂到外网上,从安全性上总是说不过去。于是乎,git成了我心中取代svn的上上策。昨天上班开会就跟CTO提出使用git管理代码的建议,他也愉快的答应了。
但是,多数人对git并没有像对svn这般了解,所以,针对于git和svn的特点和区别,我希望能够通过这篇文章拨开大家心中的疑惑。
简介
git是一款开源的分布式版本管理工具,git的诞生也是相当传奇的,由Linux之父-Linus Benedict Torvalds开发而来,当初Linus Benedict Torvalds仅仅是为了辅助Linux内核的开发才一并开发了这个至今为止世界上最快的、最简单的版本管理工具。关于这个传奇的故事,笔者就不在此赘述。
目前,git虽然很流行,但也仅仅是在国外。在国内,多数公司还在使用svn进行版本控制,不过不用担心,据笔者所知,已经有很多大公司(像BAT这样的互联网公司)开始由svn转向git。并且,越来越多的开源项目已经转移到git,很多开源网站上的代码就是git来管理的,所以git取代svn是大势所趋的。
git的特点
前面已经说过,git是一款开源的分布式版本管理工具。相对于分布式,还有一种集中式,集中式版本管理工具的杰出代表就是svn。
如下两张图,可以概括分布式和集中式管理工具的架构,图(1)为分布式版本管理工具架构,图(2)为集中式管理工具架构。
图(1)
图(2)
这里笔者想象出来一个比较容易理解的例子,可以概括出分布式和集中式的区别:像BAT这样的大公司,员工层级架构比较复杂,每个技术部门都设有技术负责人(CTO),而每个部门内部又根据分工设有技术经理、主管、组长等等,一般情况下,员工只需要向自己的直属上级汇报工作即可,这样工作起来,效率比较高。而像笔者这样的初创型小公司,部门内部角色就没有那么复杂了,技术部门每个员工都可以向CTO直接反应问题,CTO要处理来自N个技术人员反应的问题,效率比较低。BAT这样的大公司的员工各层级架构就像是分布式一样,而后者就像是集中式一样。
从图(2)可以看出,集中式管理系统的代码统一的由一台服务器集中管理。其他系统如果想得到代码,必须从这一台服务器上拷贝。同样,其他系统想要提交代码,也只能向这台服务器提交。这台服务器起到了一个集中管理所有代码的作用,当然如果svn服务器出现故障,那么后果不开设想。
从图(1)可以看出,分布式管理系统的代码可以由自己本地服务器来管理。因为每个系统本地都有一个本地代码仓库(相当于远程代码仓库在本地的备份),本地系统可以先把代码提交到本地代码仓库,然后再由本地代码仓库提交到共享版本库(在这里,共享版本库相当于集中式管理系统的远程代码仓库)这样在本地系统和共享版本库之间添加了一层本地代码仓库,开发人员直接和本地代码仓库打交道,减轻了对共享版本库的压力,并且也降低了开发人员因为误操作而导致对远程代码仓库的污染。
正是因为二者的这个差别,通过分布式,我们可以在没有网络的情况下,先把代码提交到本地代码仓库,速度之快不言而喻,待到有网络时再提交到共享版本库。而如果通过集中式,我们不能够在没有网络的情况下把代码提交到远程代码仓库,即便是有网络,频繁的传输对svn的压力比较大,并且每次传输都要受限于网络速度。
git工作原理
git的工作原理还是比较简单的,当我们创建了本地代码仓库后,会在本地代码仓库的根目录中生成一个.git的隐藏文件。.git为一个文件目录,又叫做版本库。在本地代码仓库文件夹中,除.git目录之外的所有与.git同级的目录及其子目录都叫做工作区。
工作区(Working Directory):仓库文件夹里除.git目录以外的内容
版本库(Repository):.git目录,用于存储记录版本信息
暂缓区(stage)
分支(master):git自动创建的第一个分支
HEAD指针:用于指向当前分支
git add和git commit的原理
git add :把文件修改或者新添加的文件添加到暂存区
git commit :把暂存区的所有内容提交到当前分支
下面一幅神图就可以解释git add 和 git commit的原理:
我们修改或者新添加的文件起初是处于工作区,通过git add命令可以把工作区的文件移动到版本库中的暂缓区(stage)。
处在暂缓区(stage)的代码可以通过git commit -m “提交的注释” 提交到版本库中的分支(master)。
处在分支(master)中的代码可以通过git push命令push到共享版本库。
注意:只有分支中的文件才可以push到共享版本库。
git常用命令
1.初始化一个代码仓库
git init
2.如果使用git必须给git配置一个用户名和邮箱
给当前的git仓库配置一个用户名和邮箱
git config user.name “ws”
git config user.email “ws@163.com”
配置一个全局的用户名和邮箱
git config --global user.name “ws”
git config --global user.email “ws@163.com”
3.初始化项目
touch main.m : 创建了main.m
git add main.m : 将新添加的文件或者修改的文件添加到暂存区
git commit -m “初始化项目”
git add . : 将所有没有被添加到暂存区或者代码仓库的文件添加到暂存区
注意:无论是新添加的文件或者修改的文件,都需要先通过add命令添加到暂存区中,之后再通过commit命令添加到本地仓库中
4.查看文件的状态 git status
红色 : 新创建的文件或者被修改的文件,没有被添加到暂存区
绿色 : 表示文件在暂存区,但是没有被添加到本地仓库中
5.给命令起别名
git config alias.st “status”
git config alias.ci “commit -m”
git config --global alias.st “status”
6.git删除文件
git rm 文件名
7.查看版本号
git log
git reflog
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit”
git lg
8.git的版本号是由sha1算法生成40位的哈希值
9.版本回退
git reset --hard HEAD : 回退到当前的版本
git reset --hard HEAD^ : 回退到上一个版本
git reset --hard HEAD^^ : 回退到上上个版本
git reset --hard HEAD~100 : 回退到前100版本
git reset --hard 版本号(前5位)
初始化共享版本库
真实的git服务器的搭建是非常繁琐且复杂的,并且git服务器只能搭建在Linux系统上。笔者对git服务器的搭建不做介绍,日后有时间再加以补充。在此仅对共享版本库的搭建进行详细介绍。
文件夹作为共享版本库
1.创建共享版本库文件夹,然后终端进入该文件夹下执行以下命令创建一个空的共享版本库
git init --bare
2.项目经理将共享版本库的内容先下载下来,命令后面的地址即为共享版本库所在服务器的地址+路径
git clone 地址
3.添加需要忽略的文件
touch .gitignore
去github上搜索.gitignore->Objective-C,把Objective-C中的内容粘贴到创建的.gitignore文件中(或者直接把github中的Objective-C文件下载到该目录下)。然后执行以下命令
git add .gitignore
git commit -m “添加了需要忽略的文件”
4.项目经理初始化项目
git commit -m “初始化项目”—>提交到本地代码仓库
5.将项目push远程仓库中
git push origin
6.当源代码管理是使用git,并且在Xcode进行多人开发的操作
注意:当使用git,项目中用到了静态库就不需要通过命令行进行添加
git版本备份
1.1.0版本开发完成,之后对1.0版本进行备份
git tag -a weibo1.0 -m “这个是1.0版本” : 给某一个版本打上标签(weibo1.0是标签名称)
git tag : 查看所有的标签
2.需要将1.0版本的标签,push到服务器
git push origin weibo1.0
3.继续开发2.0版本
4.发现1.0版本有bug,从标签里面clone 1.0版本,从标签创建一个fixbug分支,在分支中修复bug
git clone 共享版本库
git checkout weibo1.0(标签的名称)
git checkout -b weibo1.1fixbug(分支名称)
5.修复后的版本上传AppStore/将1.0fixbug进行备份/将1.0fixbug版本和2.0版本进行合并\
git tag -a weibo1.1 -m “这个是修复了1.0版本bug的1.1版本”
git tag
git push origin weibo1.1
将子分支中代码合并到主分支,pull—>weibo1.1fixbug—>push master—>其它同事更新
6.删除分支
git branch -r(r是远程仓库的意思,这个命令可以查看远程仓库中的分支)
git branch -r -d 分支名称
以上主要介绍了git的原理和如何用命令创建一个代码仓库,关于如何使用第三方git服务器托管代码,请见下一篇文章。