本文开头先特别声明一下:由于GitHub教程属于Git系列教程的GitHub子篇章,因此GitHub教程中将不再详细介绍Git操作命令及其用法,我会根据实际需要穿插着回顾Git操作命令。如果读者需要学习或者回顾Git命令,可以参考Git系列教程中的Git子篇章,当然也可以参考廖雪峰Git教程,廖雪峰老师的Git教程讲得还是挺不错的,通俗易懂。
首先需要添加本地Git公钥到GitHub账户下,这样就能够将您的账户绑定到自己的GitHub账户,操作如下:
到此为止,您的本地Git已经和GitHub绑定。如何验证是否绑定成功?
ssh -T git@github.com
在本地git-bash中输入上面指令后,如果出现的是类似下图的情况,说明已经绑定成功,可以进入下一步操作啦。
Congratulation!
成功绑定github账户后,我们需要在GitHub平台上New repository。具体怎么操作不再重复叙述,可以参看GitHub教程(一) 使用指南。结果类似如下:
然后我们把GitHub上的这个远程分支(origin master,master---版本库主分支标记,origin---默认的远程版本库的名字[别名(alias),可修改]) clone 到本地目录。
$ git clone git@github.com:账户名/项目名.git // git协议的url路径可以在 Clone or download 选项中copy
值得注意的是,git clone "url(protocol:git)"命令能够在任意目录下使用,只要在该目录下能够打开git-bash[应该都能打开,即任意目录下均可用]。
现在进入到从远程仓库clone下来的本地Git仓库,里面有几个文件,其中.git指的是本地版本库(内部包括待命区[index]和版本库[master])。
在此目录下,我们使用 $ git log 命令查看提交历史信息,具体情况分析如下图所示
Note:关于Git版本库等内容,请参考系列教程Git系列教程(二) Git仓库目录结构,由于文章篇幅问题,此处不再展开讨论。
到此为止,您已经完成了一半任务---从GitHub上创建仓库,并拷贝到本地。
Bravo!
有些东西现在不清楚它们具体的作用也没有事,在使用过程中您就会慢慢对这些东西有更加深入的理解体会。一点一点克服不适应,才能成为专家。记得有句话说的挺好的:正因为困难,才容易成功。部分内容我已经从命令行改成了eclipse操作,这样降低了入门Git的难度,也有利于读者直观的了解Git的情况。
要通过Git传本地仓库到远程仓库,您的本地xxx/master必须得与相对远程origin/master有差异。
问题 为什么本地Git仓库和远程Git仓库之间必须有差异?
回答 这其实与Git的实现方式紧密相关。Git通过差异分析器(比如vimdiff)来比较两个版本库之间内容的差异,再提交差异的内容。同学可以想象一下,如果现在项目有100G的内容,但是差异只有1M,是不是就不需要将1G内容重新都传一遍,而只要传1M内容,速度的提高十分显著。这就是为什么Git这么流行的重要原因之一。
这儿准备上传到GitHub的项目是我帮朋友做的毕设项目---微信公众平台助手,当然项目本身不值一提,本科毕业设计的难度你懂的,就那个档次水平。
您可以暂时停一下,先把项目用maven搭建好咯,再继续看。。。
至于具体怎么构建maven project,这个问题不属于本系列教程的范畴,您可以参考其它资料(比如 Maven In Action,中文翻译成 maven实战)。
在此苦等若干分钟
提问 为什么你选择搭建maven project?
回答 这里我要解释一下。第一点,以前我也不用maven工程,但是到公司上班后才发现公司使用maven来构建工程,用完之后发现这玩意儿太爽了,妈妈再也不用担心我jar包依赖问题了,pom.xml文件轻松搞定(其实也不轻松,不过相对以前那种纯手工,来的还是稍微方便点,纯属个人感觉);第二点,貌似 github上面开源的项目都是基于maven构建的,可以看出maven就是项目构建技术的一种重要趋势(还有别的方法也在出来,可以查查),紧跟时代潮流呗。
跪着递上一副原理图,摘录自Git基本原理详解【尊重版权,礼貌性地加个链接 】,主要是这种图自己再画一遍也类似,所以只是在原图基础上稍加改动。。。
现在我们要做的是将现有的maven项目代码copy到工作目录中,工作目录 (working tree) 正是我们本地maven工程应有的藏身之所。CV大法。。。
使用CV大法后,结果就是这样,当然这只是表面现象。
然后打开eclipse,将原来的maven工程删除,再将此存在的maven工程import到eclipse中。Import Existing Maven Project后,具体结果如下。
如果开发者修改本地代码,eclipse的git插件会在工程上出现">"小箭头,表示工作目录已修改,需要提交到暂存区。
由于这里只是单纯的将maven工程copy到Git仓库中,但是本地仓库却没有对这个maven工程的任一文件有跟踪监视(track)。不信的话我们用尝试着用命令看看呗,验证一下我说的到底是否正确。
好像就是这种情况捏。那么问题就来了[自古深情留不住,唯有套路得人心。哦耶!]
提问 什么时候文件会被跟踪,为什么?
回答 这玩意其实还是稍微有些复杂,我就挑“软骨头”啃啃。只有在工作目录中的文件被纳入版本库(至少是被add到版本库的index区)时才会被Git监控追踪。原因用通俗的话解释起来很简单:C语言的文件指针难道不需要赋地址值就能够操作文件吗?显然不可能。那这里也是这个道理咯。
现在问题已经搞清楚了,那么就对症下药。
$ git add <file> // 如果填 * 则代表将工作区中的所有文件都添加到暂存区
eclipse集成JGit后则有相应的GUI界面简化命令行操作。在工程中右键,Team → Add to Index,将工作目录修改add添加到暂存区。
查看一下具体的分支情况,在eclipse中操作结果如下图所示。
选择commit and push,提交更改到远程仓库
项目更新后结果如下
查看远程版本库,GitHub结果如下
"白猫黑猫,抓到老鼠就是好猫",显然上述eclipse集成JGit能够帮助我们快速完成任务。
不过必须指出,虽然使用eclipse集成JGit插件简化Git的入门难度,能帮助用户快速使用Git,但是对读者自身提高---了解Git原理却是不利的。
经过这节教程学习,或许看完的同学还是云里雾里,很多概念还没有清晰的理解把握,我认为这种情况是正常的,慢慢地总结学习吧。