git的使用
git介绍
很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下,或许这就是大佬吧。
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
git基础使用
首先,在开始使用git之前,有几个概念需要弄清楚,Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。工作区也就是你在本地电脑上面开发时候用的目录,如:mywork文件夹。在工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。这里主要涉及到三个命令:
git add //添加文件到暂存区
git commit //提交文件到当前分支,默认为master分支
git push origin master //提交代码到远程master分支
这三个命令也是我们平时开发当中用的最多的命令,掌握了这三个命令之后,对应日常的开发应该没有问题。
git分支介绍
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。
但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。
具体的涉及到分支的命令可以参考廖雪峰大神的git教程
##git当中的一些小技巧
假设现在有这么一种工作场景,我们在dev分支上面正在开发项目,然后功能开发到一半,这个时候线上的代码如何出问题了,你不得不切回到主分支去解决线上的bug,当你切到主分支上面的时候,会发现我们在dev分支上面开发了一半项目并没有提交,然后影响到了主分支,现在执行git status的时候可以看到有对应的代码为跟踪和提交,这个时候,一般人的解决方案就是在切换到dev分支上面,然后把相应的代码进行相关提交,然后再切换到主分支上面进行相关问题的解决,其实这里还有一种更好的办法,就是使用git stash命令,这个命令其实可以这么理解,我们本来工作台上面放着很多东西,然后有别的东西需要现在占用一下工作台,这个时候,我们先把工作台的东西挪开,然后在等手里的工作做完了,再把之前的东西放回到工作台上面,可以说这就是git stash命令的主要作用。把东西拿回工作台的命令 git stash apply,还有一个命令是git stash pop,这2个命令有一些区别,git stash apply选中某个id,然后到id对应的内容,git stash pop不仅仅会把东西拿回到工作台,而且会把这次git stash这次的id删除掉。