«

»

Dec 24 2015

我也讲讲Git

我也讲讲Git

Git简介

Git,发音为:/ɡɪt/。Git是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。

使用Git,不再依赖唯一的、集中式的版本库,而是每个开发者本地都拥有一份完整的版本库。 Git并不排斥集中式的使用模式,但更倾向于将集中式版本库称为共享版本库。

Git VS SVN

集中式版本控制系统,SVN:

svn.png

开发团队的成员,凡是涉及到版本库的操作(检入、检出、查看日志等)都需要在联网的状态下进行,网络带宽对用户体验影响相当大。网络不好的时候,那就要了血命了。

而Git等分布式版本控制系统的出现,将版本库完全的本地化,减少对网络的依赖,不会再因为短时间的网络问题搞得焦头烂额了。

git.png

如何完成“把大象装冰箱”

用冰箱和大象制作一个”装有大象的冰箱”

没有版本控制时的代码管理(FTP)

最简单的版本控制就是保留不同版本的数份copy,并且适当编号。能用,但是很没效率。保存的数份copy代码大部分完全一样,也因为这种方法要高度依靠开发者的自我纪律,而常导致错误。

no_c_ice_age.png

关键就三步:

  • 把冰箱门打开(获取代码:download)
  • 把大象放进去(编辑代码)
  • 把冰箱门关上(上传代码:upload)

缺点:

  1. 开发团队只有一个人时没什么大问题,一旦团队达到2个人以上,就会出现各种代码覆盖问题。
  2. 历史版本完全人工维护,开发中的代码完全要由开发者分出精力维护。经常会因为疏忽而丢失代码。

CVS版本控制时期的代码管理

cvs_ice_age.png

用户还是做三步:

  • 把冰箱门打开(获取代码)
  • 把大象放进去(编辑代码)
  • 把冰箱门关上(上传代码)

但是CVS服务器会额外做以下动作:

  • 备份当前版本的代码
  • 合并新提交的代码

优点:

  1. 意义上的版本库版本控制,解决了手工维护各个版本代码的问题

缺点:

  1. 非原子性提交,每次提交都要提交整个冰箱(所有本地代码)
  2. 依赖网络中心

SVN版本控制时期的代码管理

svn_ice_age.png

用户还是做三步:

  • 把冰箱门打开(获取代码:checkout,update)
  • 把大象放进去(编辑代码)
  • 把大象放进去的数据和大象丢给冰箱服务器(上传代码:commit)

SVN服务器会额外做以下动作:

  • 备份当前版本的代码
  • 把大象数据合并代码

优点:

  1. 原子性提交每次只传输大象和其放置的信息,不用每次传冰箱整个冰箱

缺点:

  1. 获取代码或切换分支时仍然要拉取整个冰箱,冰箱并不归自己,需要请求冰箱服务器,依赖网络中心

Git版本控制时期的代码管理

Git_flow.png

核心还是三步

  • 组装一个自己的冰箱,打开冰箱门(获取代码:clone,pull,fetch)
  • 把大象在自己的冰箱里组装好(编辑代码,并 commit )
  • 把组装的大象数据丢给冰箱服务器(上传代码:push)

优点:

  1. 冰箱(代码)完全本地化,包括commit、rebase等操作完全在本地,简直是有一台服务器就在自己的本地运行一般(分布式,本地版本库)。冰箱在任何时刻的状态都可以在本地切换,不需要依赖网络和中心版本库就可以进行版本管理
  2. 拥有SVN具有的所有优点

缺点:

  1. 占用本地硬盘

用Git实现把大象装冰箱

基本使用

冰河世纪(clone,commit,pull,fetch,merge,push)

git_ice_age_1_all.png

我们从冰箱服务器获取冰箱(clone)

准备一只松鼠

把松鼠放在冰箱里

完成,我们得到了一个装有松鼠的冰箱

提交commit(与SVN不同,git的commit是提交到本地版本库之中,不需要网络,也不会影响远端的中心版本库)

再把大象放进冰箱,与松鼠共存。

同时其他开发者把剑齿虎传到冰箱服务器

我们把他的数据从中心版本库服务器拉(Pull)到本地分支

我们现在冰箱里装着 松鼠 大象 剑齿虎

把我们的分支数据推(Push)给中心版本库服务器

其他开发者把水獭传到冰箱服务器

我们把他的数据从中心服务器取(Fetch)到本地 (这可能会创建新的分支)

之后用merge的方式与自己的master分支合并

我们现在冰箱里装着 松鼠 大象 剑齿虎 水獭

准备一个小孩

把小孩放在冰箱里

把我们的分支数据推(Push)给中心版本库服务器服务器

我们得到了《冰河世纪》

冰河世纪2(rebase)

git_ice_age_2_all.png

先把老鼠放进了冰箱,又把另一只老鼠装进了冰箱,又把另一只大象放进了冰箱,之后把小孩从冰箱里拿了出来。

4个动作,感觉前三个都差不多,于是进行rebase,将多个commit合并为一个commit,把两只老鼠一只大象放进冰箱,把小孩拿出来,2个动作。

好了我们得到了《冰河世纪2》

冰河世纪3(Swtich/Checkout,merge)

git_ice_age_3_all.png

另一组开发团队,在最初就分开开发(Swtich/Checkout)。往冰箱里放恐龙,恐龙恐龙恐龙恐龙恐龙恐龙恐龙恐龙,霸王龙翼龙角龙掠食龙黄鼠狼

好了现在跟《冰河世纪2》合并(merge)

我们得到了《冰河世纪3》

Git使用总结

  • 使用clone(或者create)创建本地仓库
  • 使用commit将修改提交到本地仓库
  • 使用rebase将多个commit合并为一个commit,便于记录和后期维护
  • 使用Push提交本地仓库的更改至远端仓库
  • 使用Pull或Fetch+Merge将远端仓库的更改同步到本地仓库
  • 使用tag打标签,生成发布版本

Git 使用规范流程

团队开发中,遵循一个合理、清晰的Git使用流程,是非常重要的。 否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。 my_Git_Protocol.png

参考资料

git – 简明指南 : http://rogerdudler.github.io/git-guide/index.zh.html

Git远程操作详解 : http://www.ruanyifeng.com/blog/2014/06/git_remote.html

Git分支管理策略 : http://www.ruanyifeng.com/blog/2012/07/git.html

Git 使用规范流程 : http://www.ruanyifeng.com/blog/2015/08/git-use-process.html

ProGit : http://git-scm.com/book/zh/v2

1 comment

  1. 慕若曦

    好有耐心的图文并茂 (= ̄ω ̄=)博主棒棒哒

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据