(五) 如何创建以及合并分支

最后更新于:2022-04-01 11:37:50

分支管理是任何一个版本管理工具都有的一项功能,也是项目中多人协作的重要工具,例如假如在主分支上面我们需要开发一个新的功能但又不影响主分支,不会因为新分支的代码提交或者变更导致其它主分支不可用,就需要新建一个分支开发;再比如我们需要修复主分支上面的一个比较大的bug,通常也需要新建出来一个分支为的也是不影响主分支。 代码管理中用好分支管理是保证我们开发流程正常进行,避免代码发生丢失混乱问题的重要保障。 回到我们的本地仓库目录,然后新建分支并切换到新分支,如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab272c06.jpg) 现在已经切换到了dev开发分支上面,所有修改和提交都将在这个分支上面操作,可以使用命令:git branch 查看所有存在的分支,当前分支会以* 号标出来。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab285013.jpg) 然后,我们修改git.txt文件,添加一条记录 “create a new brache dev”  ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab29588b.jpg) 如上图,我们看到新添加的内容并没有提交到master分支上面,因为我们是在branch分支上面提交的内容,分支之间互不影响,不会因为操作了一个分支对另一个分支产生影响,如果在开发中利用分支在结合权限,给在每个分支操作的人员不同的权限,合并代码的人不同权限,就不会造成提交分支问题。git merge dev :表示将指定分支合并到当前所在分支,一定要理解这句话不然会合并分支错误。 以前用SVN也好几年了,想象SVN的分支管理好多人都想用而且理论知识一大堆大,但是很好有人每天都用这个来建立分支,原因是太慢了如果你建立分支移动复制代码好的时候也得好几个小时,如果慢的话就得半天一天的了,实在让人受不了所以这个功能虽然有却成了摆设。 假如我们dev分支已经开发完成,也没有问题了接下来开始讲dev内容合并到master,命令:git merge ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab2b848b.jpg) 已经将dev的修改合并到了master分支,看一下master的内容是不是改变了呢。cat git 发现已经改变,多了一行记录,如果简单就可以在各个分支之间相互切换,而且速度是灰常快也就一秒钟的事情,这一点同svn相比效率要高出很多,建议大家多都使用这一个分支特性。 还有一个分支删除命令:git brach -d dev ,即可删除分支分支。 总结: 如果对某个分支级别操作,如创建、删除、查看分支一般用git brach +参数;如果是多个分支之间则用checkout +参数,不过也是一定的有时候可以通过参数实现其他命令功能。
';

(四)Github 创建远程仓库以及关联本地仓库

最后更新于:2022-04-01 11:37:48

#        Git仓库概述      我们来继续研究远程仓库,在前几篇博客中已经给大家介绍了git本地仓库的安装、初始化以及操作本地文件的各种命令,git、svn的目的都不仅仅是本地,svn是需要搭建一个svn服务器来保存、管理代码,git是不是也和svn一样呢,来需要有一个服务器呢?      答案是需要的,也许你也像我一样已经用了很多年的svn管理工具,有一个服务器也许是一个共识,在这一点他们两者还是有很多共同之处的,记得有一句话的意思是说“创新并不是完全抛弃了旧思想,而是在传统思想的基础之上,增加了一点点新的想法”,感觉这句话说的很对,很多东西都是对以前的产品、事务的继承和发展,并不是完全抛弃,      我们公司是搭建了一台git服务器作为版本库,其他开发人员只需要将版本库克隆到本地然后别人将自己写的代码push到服务器然后我们就可以从服务器上面pull下来最新代码,在每个人本机上面是拥有者完整的代码库的,这样保证了代码丢失的可能性很小,每个人在本机提交的时候都不会产生冲突,产生冲突也是pull别人代码时,可能和自己本地的冲突,在git里面也有着解决冲突的法宝。      git服务器的作用也有备份的作用,假设团队人少而且代码同时坏掉那么代码岂不是没有了;相反,假如服务器坏了,也可以拿本地上面的git作为新服务器,git是分布式的它的版本库分布在每一个克隆本机上面。      现在我们开发建远程仓库,为了节省资源和本着开源的原则我们在github上建立一个账号,[**github**](https://github.com)是保存众多开源项目的免费git服务器,为全球开源项目服务,当然如果你想有自己的私人空间并且容量大那么你需要花钱购买了,不过个人保存个自己的开源项目空间还是够用了。 #        **创建github远程仓库**      我已经建立好个人账户,打开new respository选项,如下图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab156dda.jpg)      我建了一个仓库叫tgb,创建好之后界面如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab174107.jpg)      红色框中为自己的仓库地址,如果你本地安装着git客户端,就可以通过这个地址把代码克隆下来。 #        **建立关联**      本地与远程建立关联我们采用ssh秘钥对方式,在本机生成公钥和私钥文件然后把公钥公开放在远程一端,私钥在本机根据公钥私钥认证机制即可连着远程仓库,这种方式比较安全而且不用每次都输入秘钥,在搭建hadoop集群时每台服务器之间也是进行ssh 公钥认证免密码登录来进行通信。       打开git bash 界面 :ssh-keygen -t -C "xxx@xxx.com" 即可,打开C盘用户目录下看有如下文件       ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab1915da.jpg)      将is_rsa.pub文件打开文件内容复制到github网站,有一个add sshkey界面如下图     ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab1b08c8.jpg)      title可以随便写,把公钥文件中内容复制到key文本框中,点击“add key”即可完成,上面那个已有的key是我本机的公钥。      接下来打开Git bash 切换到我们的本地仓库目录,在仓库中输入命令如下:       ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab1cb8df.jpg)      现在已经在本地和远程仓库关联起来了,可以把本地文件push到远程了,关联以后再推送就不需要remote,只用push命令就可以了,如下      ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab1dd20b.jpg)      由于是第一次连着需要确认是否正在,输入yes即可,再回过头来看看远程仓库是否有了内容: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab1efbec.jpg)     可以看到git服务器中已经有了本地推送过来的文件, # **总结:**      到这里本地和远程仓库已经建立好了,现在我们用的已经是分布式控制代码了,不管你在哪里都可以进行管理和开发,无论你在家里还是在中国、美国不会因为地域的限制而影响开发,是不是感觉这点要比svn好很多。      假如你正在车上、在偏远山区没有网络同样也不会影响你提交代码,这一点是svn做不到的,它们各有自己的特色,也没有必要用着哪一个抨击哪一个的不好。
';

(三) 工作区、暂存区、版本库之间的关系案例

最后更新于:2022-04-01 11:37:46

#区分三者关系 Git最让你迷惑的无非是它里面的各种概念了,如果是刚开始接触Git希望看完本篇介绍之后有一个清晰的认识,笔者认识也有限这里只说说个人对使用Git的感受,说一下它里面的几个最常用的概念的理解。 在初始化git版本库之后会生成一个隐藏的文件 .git ,可以将该文件理解为git的版本库 repository,而我们自己建立的项目文件夹即工作区 working directory ,在.git 文件夹里面还有很多文件,其中有一个index 文件 就是暂存区也可以叫做 stage ,git还为我们自动生成了一个分支master以及指向该分支的指针head ,如下图    ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-08_570723345e470.png) 从图中可以看出来respository包括分支master和stage, working diretory 可以理解为我们打开开发环境如eclipse,里面的内容即工作区的内容,在工作区里面有的代码以及配置文件等我们需要提交到版本库里面,最终是到了分支master上面,暂存区只是一个临时保存修改文件的地方。 #实例讲解 平时我们使用的命令git add file1 是把文件从工作区提交到暂存区,git commit -m "prompty" file1 是把文件从暂存区提交到了分支master下面,这里因为只有一个分支master,就提交到master上了,下面让我们再来结合具体例子来说明一下。 我们修改一下tgb.txt文件增加一行 "l love you" ,并新建一个文件 test1.txt,现在还没有执行git add命令,这种修改都还停留在工作区内,用git status查看状态,如图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cd1a31b.jpg) 上图表明修改并没有在暂存区里面,当我们执行git add test1.txt ,git add tgb.txt后,再来看一下状态 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cd38c91.jpg) 这两个文件被添加到了暂存区,但是还没有提交,当执行git commit -m "tijiao" 后文件即从暂存区到了master分支上面,如图将看不到暂存区里面有什么内容。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cd4ca39.jpg) Git管理的是添加到暂存区里面的修改,包括增删改等等都算是可以跟踪的文件变动,也可以说git只管理我们变动的部分变动的我们才往暂存区提交,这也是git比其他版本系统设计优秀的一点,以后,会详细说一下各个版本系统管理文件是如何管理的,他们的设计思想是什么。 #通过三个命令理解 下面还有一个需要注意的git diff 命令的差异: git diff 比较的是工作区和暂存区的差别 git diff --cached 比较的是暂存区和版本库的差别 git diff HEAD 可以查看工作区和版本库的差别 通过一个添加文件既可以明显看出他们之间区别,不过这里有一个前提是已经提交到暂存区的文件修改的时候才可以看出明显区别,这也是以为啥git只能跟着提交到暂存区的文件,如果只是在工作区新建一个文件,那么输入这三个命令都没有结果为空白。 我们继续修改tgb.txt,在文件末尾添加  we are good boy. 分别输入三个命令,效果为: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297aaaf06eb.jpg) 从图中可以看出,工作区与暂存区、工作区与版本库都有变化,而版本库与暂存区并没有变化。进一步执行git add tgb.txt  ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab0938c8.jpg) 执行git add tgb.txt之后发现git diff没有输出内容,表明工作区与暂存区已经同步,暂存区与版本库、版本库与工作区没有同步。最后一步执行git commit  ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-04_57297ab0b06c1.jpg) 当执行完git commit后,三个命令都没有输出结果,表明我们修改的文件已经被同步的版本库,已经被版本库管理起来了。 #总结: 版本库管理文件会很方便尤其是代码,等好多的命令熟了之后也会觉得并不是那么难用,主要使用的时候觉得git反应比较快,而且速度还可以,现在很多人都在window开发而喜欢具有界面的版本工具软件,而不去学习git命令,学习一些git 命令还是很有用的,假如让你去linux上面开发或者在linux系统上面管理代码,你就会完全束手无策不懂原理也不懂命令,需要从新学习从新认识git。 可以说各种命令是git的根本,学习了命令无论哪一个界面管理工作一看也就会了,现在有好多的git可视化工具,不如学几个命令,况且再多的界面底层也是调用这么多的命令来实现的,有了界面就让我们变懒了,降低了开发者的水平,提高开发效率的同时也失去了更多的学习、研究机会。
';

(二) 如何提交文件和历史版本恢复

最后更新于:2022-04-01 11:37:43

上篇博客已经介绍了初始化版本库以及建立文件等操作,接下来让我们继续看如何新建、修改、提交、恢复历史版本等操作命令。 #查看文件的状态git status 先让我们来建一个简单的tgb.txt文件,如下通过git add tgb.txt  、git commit -m "version10 tgb" tgb.txt 将文件提交到版本库。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cb99b73.jpg) 为了查看状态明显,我们再来修改一下tgb.txt这个文件,可以增加一行,如: love the world version1.0  ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cbb1695.jpg) 在上面的步骤中我们通过 echo 、>> 两个命令往tgb.txt文件的末尾添加了一行信息 ,然后 命令git status 查看了该文件的状态,从显示结果可以看出该文件被修改了但是还没有提交。 没有被提交的文件在暂存区里面,这里我们并不能够看出提交了什么内容,如果想要看到提交了什么内容,还需要使用另外一个命令git diff (diffrence),如 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cbc9723.jpg) 当把tgb.txt文件都提交之后,我们通过git  status命令查看文件状态,显示当前分支没有可以提交的内容。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cbde52f.jpg) #版本回退操作 当你修改了一个代码文件或者错误的删除了一些内容,有时候需要回退,正常人性化的软件都会支持这些操作,在git里面照样也支持,首先可以通过git log查看最近的提交的历史版本有哪些,如下图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cbf38aa.jpg) 上图表示进行了四部操作,从最近操作排序,第一个是删除了 git文件 第二步是添加了 “了love the world version2.0”…………,你想回归到任何一个版本都是可以的,可以通过下面命令操作,例如想恢复到上一个版本。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cc15812.jpg) 在上面进行了恢复最近一个版本,可以删除的git.txt文件又回来了,是不是很方便呢,解释一下版本恢复命令: reset --hard HEAD^ ,表示上一个版本,HEAD^^,表示上两个版本,简写形式 HEAD~10表示恢复到上10个版本,这里有个问题是我们更改过很多版本但是有时候我们并不知道哪个版本改了什么东西。 这个命令还可以用 commit_id当版本表示,如reset --hard HEAD commit_id , git如果恢复到某个历史版本后,这个版本之前的状态就会查询不出来,为了还可以恢复到未来某个版本,我们需要查询最近所做的操作,可以通过git reflog 命令,得到commit_id之后再通过reset命令来达到效果,如图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cc2abaf.jpg) # 总结: git是一个优秀的分布式版本管理系统,有了git为开源事业做出了巨大贡献,正在不过研究和使用git.     
';

(一) 本地仓库的创建和初始化

最后更新于:2022-04-01 11:37:41

#Git是什么? Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 如果说为什么要选择Git,可以说因为Git高端大气上档次,实现了免费开源易用的版本控制功能,并有诸多优点。 #为什么选择Git?  ### git起源 在1991年linus创建了Linux从此linux成为服务器领域的佼佼者,大部分web服务器、邮件、数据库各种服务器端程序都安装在了linux上面运行,主要是因为它运行的快速、高效、利用率高,这样一个优秀的系统并不是一个人在维护,来自民间的众多高手一起在维护这linux发展,那么这么多分布式世界各地的人如何共同维护如此多的Linux代码呢? 这就需要一个分布式代码管理工具,linus使用过BitKeeper来管理代码但是它是收费的,让很多人用着不爽,后来linus本人就自己开发写了一个工具来管理,这就是git的第一个版本。 后来随着时间推移越来越多的开源软件通过Git来管理,为了把世界各地的开源项目管理起来,GitHub网站随后上线了,很多流行的项目加入的此网站上面。例如我们经常使用的jquery等。 ###vs集中式版本系统 集中式版本控制系统像CVS、SVN等,一般是将代码部署到一台服务器上面,每个开发者在每天开发之前需要从服务器上面checkout下来最新的代码,本地修改完后要 commit,要求本地电脑与服务器连着才可以提交如果网络带宽慢则会很卡,记得曾经在公司提交代码,几十k的代码每次提交都会卡住,很影响开发速度和开发质量。 集中式图例如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846ca84be5.jpg) 如果在公网上面开发和提交代码那么久会更慢了,设想如果你想在家里面开发项目,SVN服务器在公网上面先下载后更新会有多慢,如果家里没有联网就会更悲催了。 相比之下,git不需要连接网络就可以提交代码,本机具有完成的代码库,事实上每个开发者都具有一个完整的代码库,我们可以随心所有提交代码,每个人修改代码之后会将修改的代码互相推送给每个人,通常为了提高互相推送的传输效率往往搭建一台git服务器来进行代码的推送和拉回,可以提高开发效率。如下图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846caa7147.jpg) 除了git,与git类似的分布式代码管理还有Mercurial、Bazaar等等。有特殊需求的可以找具有某种特性的管理软件。 #安装Git git安装在不同的系统上面安装方式不太一样,包括linux、mac 、window等,对于大多数开发者来说常用的还是window版安装,因此这里只说一下window安装方式。 在window上面执行linux程序需要先安装cygwin这个程序,它是用来window与linux shell交互的软件,实现了让window用户体验linux系统的各种命令,而不用安装几个G的linux系统。 安装Git-1.9.5-preview20150319.exe这个软件中集成了cygwin,它们会一起安装到系统中,安装过程很简单一直下一步,在快捷菜单出现Git,打开如下图 表示安装成功。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cae7b2f.jpg) #创建版本库 1.在e盘下面建立文件夹git/demo1/,然后进入该目录输入命令:git init 既可完成初始化工作。如下图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-03_572846cb17dbe.jpg) 版本库根目录下,会出现一个.git 文件,这个是版本库文件控制着这个目录(包括子目录)下面的文件更删改查改动。 2.在目录下面新建一个  git.txt 文件夹,依次执行  git add git.txt  ;git commit git.txt 既可将文件提交。 #总结 公司一直在使用Git但一直也没有总结一下,感觉一直停留在会用的层次对自己还是对别人没有什么提高,有时候需要拿出来一些时间对所使用的、所涉及的、所感悟的用文字写下来。 在过了很多年之后回过头来看看自己经理过的东西,应该会有不一样的感觉,匆匆时光如果什么都不留下会感觉空旷,在写的过程中会思考一些小的细节,让整个过程更清晰。 由于工作或是其他原因,发现一边工作可以坚持写博客还是挺难的,不是没有时间也不是没有东西可写,只是不能够像在大学时有一颗平静的心,来写写东西。 如果说以前写博客的目的是学习和积累,以及让更多的人认识你,或是找一个不错的工作作为动力,那么现在也可以坚持写,首先是利于自己的不论是出于有用或没用的目的,对自己肯定是有用的。 写一写是将一些想法表达出来,甚至你可以写写对领导的不满、对工作的抱怨,以及如果你是老板你会怎么样做,你要怎么样做待会是一个优秀的员工等等,还可以是一个特别小的设计思路、一行代码、一个发生在公司的小事情都是你可以拿出来写写的。 暮然回首一下你曾经待过的公司,可能你已经忘记了你的队友叫啥、在你们开发项目中发生过什么事情,好的设计方案、实现方案,每个领导身上的优点,以及公司的运营流程等等,这些如果你平时不写写啥的,过半年你就会什么也想不起来了,人都是对最近发生的事情记忆尤新,网络记录是帮我们的最好帮手。
';

前言

最后更新于:2022-04-01 11:37:39

> 原文出处:[Git菜鸟变大神](http://blog.csdn.net/column/details/lilongsheng-git.html) 作者:[lilongsheng1125](http://blog.csdn.net/lilongsheng1125) **本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!** # Git菜鸟变大神 > 结合使用Git的项目经验,作为总结和提高,希望与大家多多交流想法,共同提高。
';