@coder-pig
2017-11-03T10:40:57.000000Z
字数 3176
阅读 1808
Tutorial-Android
为什么要在项目中引入版本管理?
现在有小红,小绿和小蓝三个人一起开发一个APP,在经过简单的
任务分工后决定,小红负责A模块,小绿负责B模块,而小蓝则负责
C模块。分工后要面对的第一件事就是:如何一起开发这个项目?
我们通过一个个方案暴露的问题,慢慢引入Git~
方案1:小红先做A模块,小绿再在小红的基础上做B模块,
最后再由小蓝完成C模块。
这样做可以,但是效率会很低,大部分时间花在等待上,开发的周期
会非常的长,和一个人完成整个项目没什么区别,大学做小组形式的
课程设计的通用套路。
方案2:并行地进行开发,就是自己写自己的,都写完之后
再来合并代码。
同样也可以,但是最后再整合,谁来整合好?此时的代码量也是相当
庞大的了,记得大学弄的一个XX门诊管理系统的小组课程设计,
项目很小,逻辑也简单,但是整合却花了将近一周的时间,还各种
莫名其妙的BUG(最后不了了之)...大学小组课程设计的另一种套路。
我们得想办法来减少代码合并的难度,比如每天合并一次,这样做
还有另一个好处就是知道每一个人当天的工作进度,于是乎衍生出
了方案3。
方案3(SVN):将工程托管到某个服务器上,每天开始工作的
时,先把服务器的代码同步到本地,然后再进行开发,等工作
结束后,把代码提交到服务器,此时可能需要解决冲突(服务器
上的代码和本地的代码有不同的地方)问题,冲突解决完后,
再次提交代码。
上面这种方案其实就是常说的SVN版本控制系统的工作流程,SVN是
一种集中式的版本控制系统,集中式体现在:需要一个中央服务器,
工作时先从中央服务器拉取项目当前最新版本的代码,然后才开始
干活,等工作完后,再把自己的更改推送给远程服务器,但是同样
暴露了一个弊端:需要联网,才能使用SVN,而且会受到网络速度
的限制,内网还行,外网的话可能上传速度会非常慢,而且依赖
中央服务器,假如哪天服务器宕机了,那么谁也无法提交代码了...
当然优点也是有的:易于管理,权限管理机制,可以确保安全性等,
关于SVN的使用不在本节范围内,有兴趣的可自行查阅相关文档。
竟然集中式的SVN版本管理系统有这样的弊端,那么有没有其他
可以规避这个联网问题,还有更优的方案呢?当然是有的,就是
Git分布式管理系统,流程见方案4。
方案4(Git):将项目托管到服务器上(比如Github),将他作为
远程仓库,我们一般会在远程仓库上开辟两个分支:master分支
和 develop分支,然后开发人员根据不同的任务建立功能分支,
然后再分支上完成代码编写,编写完成后,在把分支合并到develop
分支上,假如有冲突,则要先解决冲突后才能合并,合并完成后,
可以把功能分支删掉,以此保证项目中只有master 和 develop
两个长期分支。
相比起SVN,Git最明显的优势就是支持离线提交,每个人都有
整个项目完整的版本库,远程仓库更多的只是作为代码合并更新
的媒介。除此之外更强大的分支管理,比SVN更快的版本切换
速度。相信到此你对版本管理以及Git已经有了初步的了解,知道
大概是干嘛的,接下来的学习就要开始去了解怎么用了!
Windows系统:
到 Git For Windows 或 git-for-windows.github.io下载,傻瓜式下一步。
Linux系统:
到 Download for Linux and Unix下载,
如果是Ubuntu的话,直接Terminal键入:
sudo apt-get install git 安装。
Mac系统:
到 Installing on Mac下载,
如果你安装了 Homebrew的话可以直接命令行键入:
brew install git 进行安装。
Pro Git(官方):
https://git-scm.com/book/zh/v2
Pro Git中文版(oschina):
http://git.oschina.net/progit/index.html
廖雪峰的Git教程:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
猴子都看得懂的Git入门:
http://www.backlogtool.com/git-guide/cn/
Git Community Book 中文版:
http://gitbook.liuhui998.com/index.html
沉浸式学Git:
http://igit.linuxtoy.org/contents.html
Git Cheat Sheet: Useful Commands, Tips and Tricks:
https://sentheon.com/blog/git-cheat-sheet.html
Git权威指南
http://www.worldhello.net/gotgit/
Git由如图四个部分构成,简单概括下这个四个部分在日常协作中是
如何发挥作用的:
工作区与暂存区
我们写代码的地方就是工作区,当代码编写完毕后,我们可以把他提交到
暂存区,提交到暂存区后,我们再对自己的代码进行更改或者文件增删,
只需要一个git checkout xxx即可让暂存区里的内容覆盖当前工作区的
内容,或者说还原。
暂存区与本地仓库
我们可以把暂存区的内容提交到本地仓库,此时会在仓库中生成一个快照,
提交后暂存区的内容就会被清空,此时我们可以调用git reset xxx,指定
某个快照,然后还原到暂存区。
工作区与本地仓库
我们可以直接走git checkout 版本号的命令,直接让工作控件还原成版本号
对应的快照。
本地仓库和远程仓库
我们可以把本地的某个快照git push 到远程仓库,push的时候有时还需要
进行冲突处理;也可以克隆远程仓库到本地,比如我们经常从Github
clone 一些开源项目。
工作区和远程仓库
这两者的写作方式一般是git pull,即同步远程仓库的代码到工作控件而已。
按大类划分,分为两种状态:Tracked(已跟踪)和Untracked(未跟踪),
依据是:该文件是否已加入版本控制?
流程简述:
假如项目已经假如版本控制系统
Git关心的是:文件整体是否发生变化!
SVN关心的是:文件内容的具体差异!
SVN每次提交记录的是:
哪些文件进行了修改,以及修改了哪些行的哪些内容
如图:版本2中记录的是文件A和C的变化,而版本3中记录文件C的变化,
以此类推; 而Git中,并不保存这些前后变化的差异数据,而是保存
整个缓存区中的所有文件,又叫快照,有变化的文件保存,没变化的
文件不保存,而是对上一次的保存的快照做一个链接!因为这种不同
的保存方式,Git切换分支的速度比SVN快很多!
分为四个对象:
blob对象:存放文件数据。
tree对象:目录,内容为blob对象的指针或其他tree对象的指针。
commit对象:快照,包含指向前一次提交对象的指针,commit相关的
信息,通过索引找到文件快照。
tag对象:一种特殊的commit对象,一般对某次重要的commit加TAG,
以示重要(方便查找)。