发新话题
打印

学一点Git--20分钟git快速上手

学一点Git--20分钟git快速上手

  在Git如日中天的今天,不懂git都不好意思跟人说自己是程序猿。你是不是早就跃跃欲试了,只是苦于没有借口(契机)。好吧,机会就在今天。给我20分钟,是的,只要20分钟,让你快速用上git。

  我们废话不多说,直接来干货。

  我们将会介绍以下几点:

  一,什么是git

  二,使用git的一般开发流程

  三,快速安装新建项目。holloworld。

  开始:

  一,什么是git。

  阅读本文的前提是你知道或者用过至少一种源代码管理工具,比如:SVN,CVS或者TFS等等。你必须知道什么是源代码管理。如果这些都不满足。请直接跳过本文。

  了解陌生事物的最好办法,是和已知事物类比。---孔子

  我们以svn为例。我们都知道传统的源代码管理都是以服务器为中心的:

  

  每个开发者都直接连在中间服务器上,本地修改,然后commit到svn服务器上。

  这种做法看似完美,但是有致命的缺陷:

  1.开发者不能本地跟踪代码版本。所有的信息都是在服务器上。你把本地的代码改了很多,但是又不能提交。通常,本地只能缓存一个版本。对于小项目无所谓,但是项目一复杂,人员多就麻烦了。通常你本地的代码都全是红色的。自己都不知道今天修改了什么,有哪些修改是真正应该提交给svn的。

  2.因为第一点,一旦离开服务器,程序猿将无法正常工作。因为本地不能跟踪代码版本。你的(几乎)任何操作都必须连上服务器。比如,showlog,blame,showhistory等等。

  3.中央服务器压力过大。因为每个人都必须把代码提交到服务器,并且做dailybuild。

  4.对于大型项目,svn几乎不可用。例如linux内核项目,开发者何止几万?都直接提交给svn服务器的话还不乱套了。

  5.对于个人的私人项目而言(或者对于小公司的项目),不用版本控制当然不行,但是为了用版本控制而专门架设svn服务器有有点舍不得。

  有没有能解决上述几个问题的东东呢?恩,答案是肯定的。

  Linux内核的作者也遇到了这些问题,于是他决定再一次改变世界,重写一个可以本地使用的svn。

  对,这就是git。分布式代码版本管理系统。(说人话:就是不用服务器的svn)我们来看git的结构:

  

  git没有中央服务器。你装上git软件之后,你就可以指定本地的文件夹进行版本控制了。你可拔掉网线,然后在本地修改,commit,revert(rollback),branch,restore,showlog,blame,history等等,全部你之前在svn里面可以用的操作。简单的说,你就完美了。

  你可能意识到一个问题了。就是天下大乱了。每个人都自顾自的开发,怎么协作呢?恩,通常git比svn会多出两个操作,就是pull和push。我们看一个复杂一点的图:

  

  开发者之间通过pull和push操作,把别人的修改拉过来,或者把自己的修改推给别人。

  恩,你可能还是觉得有问题,我们生产环境中,以谁的代码为最终版本呢?

  这个问题确实比较棘手,因为,从单纯的技术上讲,每个开发者的机器都是对等的。没有主次之分。

  我们还有办法:

  技术上不能解决的问题,我们从制度上解决.----孟子

  从分布式环境中我们模拟出一个中心来:

  

  我们引入Leader这个角色。他的机器是最终版本。每个开发者都必须把最终的修改版push给leader。leader会review然后提交。他就是最终版本。

  恩,我们好像还漏掉一个大问题,说git,怎么漏掉了github呢。github是什么。

  我们知道,如果每个人都本地修改的话,本地可能不安全,(硬盘坏了,笔记本被偷了。。。。)

  我们可能需要一个安全的服务器来存储/备份代码。对于开源的项目,可能是需要一个地方分享你的代码,你不可能24小时开着笔记本,让别人从你这pull代码。

  于是,网上所谓的源代码托管网站就冒出来了。github就是这样的。

  看这个图,我只修改了其中一个地方,就是把leader的机器换成了。github.com提供的在线账户。

  

  所以,git和github没有必然联系。

  这里有几个常用的在线托管地址,有兴趣自己看看:

  1.github.com,大名鼎鼎。免费,只支持开源项目,不支持私有项目。

  2.bitbucket.com,同样大名鼎鼎。免费,支持开源项目和私有项目。免费用户最多5个。项目无限。

  3.git.oschina.net,国内顶尖托管平台,我本人正在用的就是这个。支持开源项目和私有项目。成员无限,项目1000个。使用的是阿里云服务器,速度极快。本人推荐5颗星。

  二,git开发的一般流程。

  上面其实已经涉及了使用git的一般结构。那么生产环境中,git是如何应用的呢。

  本人知道的模型如下:

  

  每个开发者都向自己的项目服务器(leader)提交代码,leader向公司服务器提交。当然这个leader是可有可无的。如果项目小的话,开发者可以直接向公司服务器提交。公司的服务器就是最终版本。一般公司还会有持续集成CI服务器。我们可以在公司的源码服务器上设置git的hook。自动触发CI服务器工作。这是后话,不多说了。

  三,前面的概念弄清楚之后,上手就容易多了。我们helloworld。

  1.这是git的官网:http://git-scm.com/去下载windows客户端。

  如果是linux的话,sudoapt-getinstallgitcore

  2.注意,官网的客户端都是命令行的。命令行是高阶用法。不在这里说了。我们下个gui。

  我用的是TortoiseGit。https://code.google.com/p/tortoisegit/,大家恐怕都熟悉svn时代的乌龟爬。上手快。我们下面的操作都是gui上的。

  安装过程不说了。一路next。我们跳过。直接到最后。假设你现在已经安装完成了。

  比如我已经有一个工程,helloworld:

  

  这是工程文件的内部结构:

  

  现在我们想让helloworld用上git怎么做呢,在工程根目录下,点击鼠标右键。

  

  选择Createrepository。

  这个选项不要勾上。稍后我们会解释什么是Bare。

  

  然后就完成了。

  

  里面多出了一个.git目录。当前的目录(及其所有子目录)已经在git的监视之中了。但是当前的代码还没有添加到git的跟踪数据库中。简单的说,git还没有储存任何版本信息。我们需要进行第一次提交:

  git默认你本地会有一个主分支master。

  

  我们写一些注释,并且勾上想要添加到git的文件。(如果有子目录的话,它都会显示在这里。)

  

  提交完成,close。这个push按钮,稍后再说。

  

  好了,这个时候我们在回到文件夹,看看有什么变化:

  

  现在这些文件就添加进git了。

  剩下的你就可以为所欲为了。像svn一样,自己试试几个命令吧:修改,difference,commit,revert,

  到这你已经入门了。

  最后我们来介绍两个重要的概念。

  1.“git目录”,就是指上图中,项目根目录下生成的“.git”文件夹。用过svn的同学都知道,svn有‘.svn’文件夹。他们的作用差不多。这里保存了git的本地数据库资料。就是所有的版本信息。跟svn不一样的地方就是,git中,只有根目录下有这个目录,所有的子目录下都没有,也就是每个工程只有一个.git目录。

  2.“git工作目录”,其实就是你的工程目录,比如上图中的工程根目录:H:\mycode\helloworld\。为什么有这个工作目录呢。就是你工作在这个目录下,你可以修改编辑里面的文件,最后把修改提交给git目录。这个共工作目录还有一个神奇的地方就是,你可以创建不同的branch(你默认工作在master下),当你切换不同的branch时,你的工作目录(工程目录)里的所有文件都会变成当前branch对应的文件。这个不展开了。

  最后再解释上面留下的两个问题:

  1.“Bare”创建Bare的意思是:你只想要git的数据库(即上图中的“.git”文件夹。),而不想要当前的文件。这通常用在公司的中央服务器上。它不需要当前项目的实际代码,只需要保留git数据库信息就行了。

  2.在commit之后的对话框中的push的意思。正如之前介绍的。push的意识是把你的修改push给别人(或者给公共服务器)。commit的意思只是提交到本地的.git数据库。并没有更新给别人。所以提交完之后,乌龟很贴心的给我们一个push按钮。通过它你可以快速把刚刚的修改push给别人,或者给服务器。

  总结,这不是一本完全的git手册,但至少能让你消除git恐惧症,快速入手。

  这里是gitbook的中文版:http://gitbook.liuhui998.com/他是真正的大而全。为什么最后才说它呢?因为它就像是一本牛津大辞典,全面,权威。但是对于幼儿园小朋友学英语,就不能一上来就背它吧。先跟着别人说,上手要紧。之后有什么不会的,再去查字典。

  好了。就到这。欢迎大家访问我的个人独立博客:http://blog.byneil.com欢迎大家多多交流。

  后面有时间的话,还想给大家分享一下我使用几大源码托管服务器的经验。希望大家顶啊。。。。

  [via]

TOP

发新话题