为什么要引入Git:
一个公司有几个甚至十几个人共同合作开发一款项目的时候,公司对项目代码有明确规范,不可能再像学校做的小项目一样,你觉得哪个同学的代码写的不好,或者和你的代码有冲突,’Duang’直接给别人改掉或删掉,也就是想怎么改就怎么改。这种情况对于十几个人合作的项目来说肯定是不行的。这个时候就需要版本的控制
举一个简单的例子,如果你用Microsoft Word写过长篇大论,那你一定有这样的经历:
想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:
过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。
看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。
更要命的是,有些部分需要你的其他同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改Word文件。一天后,同事再把Word文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。
于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?
这个软件用起来就应该像这个样子,能记录每次文件的改动:
版本 | 用户 | 说明 | 日期 |
---|---|---|---|
1 | 张三 | 删除了第一段简介 | 2015/4/18 13:25 |
2 | 张三 | 增加了第二,三,四,五段的内容 | 2015/4/19 12:30 |
3 | 李四 | 修改了第三段合同金额数据 | 2015/4/20 09:09 |
4 | 王五 | 修改了第四段关于后续维护的条款 | 2015/5/01 11:22 |
这样,你可以在这个版本管理工具上清楚的看到每次不同的人在同一文件上所做的修改说明,并且可以选择下载你需要的版本下来再进行维护。
下面这段文字,大家就当看故事一样看一下就行了。介绍这段,主要其实就是说明一个问题,为什么很多同学一入手Git感觉很高深难用.因为Git是机遇Linux系统的,所以对于用惯了傻瓜的window的同学来说,Linux系统相当的陌生,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等等。
4)集中式和分布式版本控制系统有什么区别:
集中式的版本控制:Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,版本库是集中存放在*服务器的,而干活的时候,用的都是自己的电脑,所以要先从*服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给*服务器。*服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
分布式版本控制系统:其根本没有“*服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
【总结:分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的*服务器要是出了问题,所有人都没法干活了。分布式版本控制系统通常也有一台充当“*服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。 】
以上的种种原因使得Git这个工具产生-------->
1、GitHub 与 Git 的关系
1)、Git是一款免费、开源的分布式版本控制系统,他是著名的 Linux 发明者 Linus Torvalds 开发的。说到版本控制系统,估计很多人都用过 SVN ,只不过 Git 是新时代的产物,如果你还在用 SVN 来管理你的代码,那就真的有些落伍了。不管是学习 GitHub ,还是以后想从事编程行业,Git 都可以算是必备技能了,所以从现在开始建议你先去学习熟悉下 Git 。通俗来说它是用来进行版本控制的,就是用来保存项目的地方。
但是项目要是运行,还是需要你本地的环境,它只不过是用来保存代码罢了。
【SVN:SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。Svn是一种集中式文件版本管理系统,】
【分布式版本控制 (DVCS) 是一种不需要中心服务器的管理文件版本的方法,但是它也可以使用中心服务器。它的真正价值在于,它允许开发人员组实现他们选择的几乎任何工作流,允许开发人员以各种新的方式工作它能够完成很多事情,比如传统的集中式模型,或两个开发人员在咖啡馆通过无线连接协同工作,等等。】
2)、GitHub 上面说了,主要提供基于 git 的版本托管服务。也就是说现在 GitHub 上托管的所有项目代码都是基于 Git 来进行版本控制的,所以 Git 只是 GitHub 上用来管理项目的一个工具而已,GitHub 的功能可远不止于此!5 GitHub 的影响力
3)GitHub如何操作?
可以通过客户端进行代码提交,更新。
也可以通过指令来进行操作。
2 GitHub 有什么用:
学习优秀的开源项目开源社区,我们的软件开发才能变得越来越容易,越来越快速。试想你在做项目时,如果每一模块都要自己去写,如网络库、图片加载库、ORM库等等,自己写的好不好是一回事,时间与资源是很大的成本。对于大公司可能会有人力与资源去发明一套自己的*,但是对于大部分互联网创业公司来说时间就是一切。而且你在使用开源项目的过程也可以学习他们优秀的设计思想、实现方式,这是最好的学习资料,也是一份提升自己能力的绝佳方式!
3 GitHub网站以及一些简单的GitHub工具的使用步骤:
1)首先当然是注册一个账户,点击 Sign Up注册
2.分别填入昵称,邮箱,登录密码,确认密码
3.选择Free(默认)完成注册 <如果你看不懂上面的英文,你可以把网页翻译成中文>
4.点击 Finish sign up 完成注册,直接跳转到邮箱验证(非常重要)
5.点击Send verification email,GitHub会发送验证邮件到你的邮箱,进入你的邮箱,按照默认链接激活注册。注意这一步非常重要,如果不激活邮箱验证,后面的操作将都不会产生效果
注意:其实这些操作都可以通过git shell命令行来完成,只是我们这里结合着GitHub网站和可视化工具
2)双击进行安装
3).安装好之后桌面出现下面的图标,GitHub就傻瓜的图形界面,Git Shell是命令行的版本,我们这里直接使用图形界面就ok
4)如果第一次进入软件,会直接提示让你登录,输入你刚刚在GitHub注册的账户即可
6)登录之后新建仓库
点击左上角:
进行新建仓库,如下图:
创建好之后,如下图:
表示这个一个全新的Repository,在自己的电脑上也出现了相应的目录
接下来发布这个仓库,点击右上角Publish Repository发布仓库,同时要求填写仓库相应描述
右上角变为Syn表示已经发布成功,右键单击View on GitHub就能直接通过浏览器进入GitHub网站看到我们发布的新仓库了。
提交同步文件7)仓库创建好之后,相当于就是我们的第一个版本,你可以在网站左上角看到有一个 1 commit这就表示是我们第一次提交,比如我们现在往仓库里面(这里指myFirstReposity文件夹里面)新加一些“测试.doc”文件,马上可以看到在工具上多出了一项UnCommited changes
下一步打开GitHub程序,会发现界面有所改变,之后按照提示填写内容,然后点击提交即可,如下图所示:
提交之后如下图所示,然后点击右上角进行同步
同步完之后在浏览器中查看,这时项目的提交次数已经变成了”2“,如下图所示:
点击可以查看先前的版本,如下图所示:
修改项目
1)计算机中修改先前新建的空白文档”测试.doc“,路下图所示:
修改保存之后,在软件中再一次进行提交同步操作,如下图所示:
同步之后再浏览器中查看,提交次数已经变成了3次,之后可以分别下载第二次与第三次提交的文档,可以比较看出我们修改的内容。
另外,你可以对你自己的资料进行修改
更进一步的理解GitHub:
1、GitHub网站也只是Git的壳而已,你其实可以不用把它想成一个网站,它只是一个分布式版本控制软件服务器的壳。所以我们主要注册之后,自己的代码可以往服务器上传。
2、Git这种分布式版本控制又像是一个交友平台。什么意思呢?比如你注册了一个交友平台,想认识一些陌生人,你会上传一些自己的漂亮的照片,自己的简介,自己的心情,自己的兴趣爱好等等去结交一些志同道合的人。别人看到了,会联系你,如果觉得你好,可能还会把你介绍给其他人。而其人没有直接看到你的人,又通过别人认识了你。这其实Git的中心思想
3、上面一直在说Repository仓库,其实你就可以理解为你的项目,一个仓库就是你的一个项目。所以上面的那些步骤,不过是自己在往项目里面提交。如果是团队合作又怎么做的呢?其实很简单,就像上面所的,就像交友一样。
【注意:我们下面所说的另一个用户相当于另外一个人和另外一台电脑了】
1、在网站上操作Fork(叉)
1)现在我们用另外一个用户登录GitHub账户,找到之前to-striver用户上传的叫做myFirstRepository的仓库
2.现在你找到了这个仓库,可以将这个仓库直接加入到你的账户当中,点击右上角的Fork,这个仓库就加入进来了
3.下图可以明显看到现在这个新用户已经Fork了YIFer创建的这份项目
5)同样将Frok的文件保存到本地目录。
6)当然这里就可以和之前一样,这个新用户同样可以提交修改文件,步骤和之前一样。但是注意一点,这个用户提交修改的文件,只是相当于在他自己Fork的目录下。简单来说,意思就是你把文件拷贝了一份,然后你在拷贝的这份文件上面进行修改什么的,对源文件是没有影响的
9)提交成功,可以直接点击链接,查看这次pull requests
10)如果是to-strive用户,接收到别人的pull requests之后,就会在网站上看到,注意红色框部分
11)点击进入,可以看到具体别人提交的pull requests
12)点击查看这次提交,如果可行,选择合并 Merge pull request
13)合并成功
为什么要创建分支:
1)当一个项目有很多个模块,那么我们可以根据模块打出分支,然后让每个开发在对应的模块的分支上面进行开发。最后再由一个人进行分支合并即可。
2)成功发送一个合并请求之后,图标会发生改变:
之后点击会跳转至网页确定真正合并:
当我们执行了删除掉已经不用的分支之后,远程库上将不再有这个分支,此时在客户端此分支上执行sync操作之后,会发现 sync按钮又变回了publish按钮。此时这个分支是一个本地库分支;
总结一些术语
Git 术语
术语 | 定义 |
---|---|
仓库 | 一个仓库包括了所有的版本信息、所有的分支和标记信息. |
Repository | 在Git中仓库的每份拷贝都是完整的。仓库让你可以从中 |
取得你的工作副本。 | |
一个分支意味着一个独立的、拥有自己历史信息的代码线 | |
分支 | (code line)。你可以从已有的代码中生成一个新的分支 |
Branches | ,这个分支与剩余的分支完全独立。默认的分支往往是叫 |
master。用户可以选择一个分支,选择一个分支叫做 | |
checkout. | |
标记 | 一个标记指的是某个分支某个特定时间点的状态。通过标 |
Tags | 记,可以很方便的切换到标记时的状态,例如2009年1月25 |
号在testing分支上的代码状态 | |
提交 | 提交代码后,仓库会创建一个新的版本。这个版本可以在 |
Commit | 后续被重新获得。每次提交都包括作者和提交者,作者和 |
提交者可以是不同的人 | |
URL | URl用来标识一个仓库的位置 |
用来表示代码的一个版本状态。Git通过用SHA1 hash算法 | |
修订 | 表示的id来标识不同的版本。每一个 SHA1 id都是160位长 |
Revision | ,16进制标识的字符串.最新的版本可以通过HEAD来获取. |
之前的版本可以通过"HEAD~1"来获取,以此类推。 |