Windows Git+TortoiseGit简易使用教程

转载自 http://blog.csdn.net/jarelzhou/article/details/8256139git

官方教程:http://tortoisegit.org/docs/tortoisegit/ (英文版)github

为何选择Git

效率

不少人有一种习惯吧,什么软件都要最新的,最好的。其实吧,软件就是工具,生产力工具,为的是提升咱们的生产力。若是现有的工具已经能够知足生产力要求了,就没有必要换了。生产效率高低应当是选择工具的第一位。算法

 

历史

开源世界的版本控制系统,经历了这么几代:windows

 

第一代,CVS,开创性的产品,至今不少古老项目仍在使用,但存在很多设计上的缺陷。缓存

 

第二代,SVN,在CVS基础上大幅度改进,很快就取代了CVS的地位,如今的项目数量仍然很是庞大,并且SVN的缺陷不算多,不少商业项目彷佛没有迁移到下一代版本控制系统的打算。好比Chrome就是使用SVN的。服务器

 

第三代,Hg与Git。提及这两个,有种既生瑜,何生亮的感脚。这两个项目几乎是同时启动的,目标都是为Linux kernel提供一个开源可靠的分布式版本控制系统,一样优秀,只不过Git是Linus亲自带队作的,因而Git就成了Linux的选择。除此以外,Eclipse从本来的SVN转移到了Git,而Firefox与Python则使用Hg,国内的金山软件也使用Hg,而Cocos2d则是Git,孰优孰劣,很差说。eclipse

 

总的来讲吧,前两代因为集中式管理的缺陷,如今用的确定会愈来愈少,不过老项目每每不会轻易换。Git胜在功能强大,分支完善,败在设计复杂,难以理解。Hg胜在清晰易懂,功能完善,败在不利于从SVN迁移,相应的社区活跃度不如Github。ssh

 

咱们暂时会使用git,也许之后也会尝试另外一个。分布式

 

TortoiseXXX是什么东西

也许你已经看到了TortoiseSVN、TortoiseGit与TortoiseHg这三个项目,你也许想知道这三个是什么东西。事实上,SVN、Git与Hg都是命令行的程序,对于大多数人来讲,尤为是Windows平台下,难以上手,门槛较大,而这三个项目正是解决这个问题。TortoiseXXX会在Windows的右键菜单下添加绝大多数的版本控制功能,免去了命令行的麻烦。可是说实话,右键菜单的效率和命令行的效率哪个高,很差说,不过TortoiseXXX仍是下降了门槛,对于初学者有很大的帮助,毕竟不是谁都能熟记那么多的命令的。工具

 

准备工做

软件安装

我指的是Windows下。因为Git历来没有官方的windows版(能够理解,linus作的嘛),windows下有两种非官方使用途径,一个是Cygwin,另外一个是msysGit。Cygwin比较凶残,直接把Gnu工具集转移到了windows上,不过不推荐,cygwin这个东西,若是不作嵌入式,不须要交叉编译,用不着这么凶残,msysGit就足够了,也更简单。目前是1.8.0。

 

TortoiseGit同时支持两种使用Git的方式。它只是一个壳,实际调用的仍是Git自己。这两个软件安装也没有什么好说的,除了安装路径以外,其余的所有默认就OK。

 

TortoiseGit安装后,请设置好你的姓名邮箱,这将会记录到版本信息中。开始菜单找到tortoisegit的settings就能够了,不用细说吧?

密钥

Git的身份验证不是密码,而是密钥。一般咱们会有一个Git服务器,而咱们的电脑就是工做机,咱们须要一个RSA密钥来确认身份。密钥分为两个:私有的和公开的,实际上是这样,公开的存放在服务器上,而私有的放在你手里,核对的时候经过一系列复杂算法就能够匹配了。私有密钥绝对不要被其余人看到,这是一个项目中,确认每一个人身份的标识。

 

密钥能够用命令行生成一个。不过咱们有TortoiseGit,看一下TortoiseGit的开始菜单,是否是有一个叫Puttygen的东西?密钥这个东西有不少工具均可以生成,Puttygen就是个图形化的工具。使用很简单,只要运行Puttygen,把右下角的数值改为4096(这个是最长的)而后点击“Generate”就能够了。点击以后它会要求你随机移动鼠标,直到进度条满为止。

 

生成完以后呢?千万不要关闭这个窗口!要是手贱关了,那么……再来一遍吧。你要在passphrase和下面的确认框输入密码,这个密码你本身写咯,不过记着哦。写好以后,点“save private key”保存就行。

 

Public key是填在服务器上的,咱们以github为例,若是是别的代码托管网站,或者你本身搭建,原理都同样。打开你的Github帐户,Edit YourProfile,而后SSH keys,而后add,而后把putty生成的public key贴进去就好了。

 

Github的那点事

Github是开源社区目前最活跃的项目托管网站,相似的网站还有SourceForge,bitbucket,google code等,每一个网站支持的版本控制系统不同,主要就是SVN、Git与Hg,github仅支持Git,其余协议须要很麻烦的插件来扩展,通常不多会用。

 

尽管Git自己是分布式的,但咱们一般仍然须要一个中心的做为标准的服务器,方便协同开发。Github就是起到了这个做用。

 

一般咱们这样进行协同开发:项目有几个成员,建立者在Github上建立项目,并把其余人添加到项目中。项目组成员能够直接向中心库提交代码,而其余人若是想参与进来,就须要用“fork”建立一个项目的分支副本,而后向原始项目提交合并申请,非项目组成员的提交是须要批准才能合并的。这也是一般的开源软件的开发模式:核心成员主导方向,全部开发人员均可以参与进来。

 

固然了,非开源项目就没有那么麻烦,只要项目成员向中心库提交代码就好了。

 

Git工做流程

不要着急,咱们在正式使用以前,须要对Git的基本工做流程有一个清晰的理解。

从本地库单一分支开始

Git是分布式的,所以,服务器上的库和你本地的库实际上是同等的,两边的库都是具备完整的历史版本信息的。事实上,若是没有服务器,那么成员之间也是能够直接进行代码同步的,只不过这样会很混乱。这一点和SVN与CVS这样的集中式系统是很不一样的。

咱们先研究本地的单一分支库。

文件状态

文件的两种基本状态:被追踪,和不被追踪。

缘由很简单,项目中有咱们须要进行控制的代码文件,也有不须要的临时文件。若是咱们新添加了一个文件,那么它默认是不被追踪的,你须要主动去添加到追踪文件中(add操做)。

 

对于被追踪的文件,有三种状态,已修改(modified),已暂存(staged),已提交(commit)。

已修改:你把原有的库中的某个文件进行了修改,此时因为文件的校验值发生了变化,Git会检测到你作了修改。此时咱们须要作暂存的操做。

已暂存:在修改以后,你能够把修改暂时写入缓冲区,在积累了几回修改足够构成一次提交以后,再一次性提交(commit)到本地库。其实上面讲的“add”操做,完整的应该说是什么?应该是“add files to stage”。

已提交:注意这个提交是提交到本地库,由于本地也有一套完整的代码库。

 

暂存的历史不会被记录,只有commit到库中的信息才会被记录到版本信息库中,之后能够随时回滚查看。

 

可能有的时候你会以为,中间的那个暂存区要来干吗?不少余嘛。小项目固然彻底无所谓,可是若是项目大了,那么版本的历史信息会很复杂的。这个时候,没必要要的版本过多,也很差。暂存区就是用来防止一些没必要要的commit。

分支的做用

分支是git的最突出的一个地方。

其实概念很简单,看名字就知道了,不过为何要分支?

好比一个项目,如今要同时开发A功能和B功能,怎么处理?

 

其实也很简单,好比有一个中心库,而后你克隆到本地,作了一些修改,commit到版本A,而我呢,commit到版本B,而后呢?合并吗?合并的结果是什么,合并以后,若是代码一点问题都没有,若是A和B两个功能咱们不须要再回溯,那么什么都不是问题。可是每每现实中,若是A忽然发生了问题怎么办。

 

分支就要用上了:咱们有一个主干分支,而后分别开一个A分支和B分支,你作你的,我作个人,而后确认无误以后,合并到主干。那这样,若是发生问题,是否是就比原来要容易解决多了?不然你都不知道问题出在了哪里。

 

流程

 

真正开发的时候,每每至少会有两个长期的分支(develop,master),最新的进度在develop中,而master则是稳定可靠的随时能够发布的版本。固然,develop中的代码也是可运行的完整代码,不能有残缺的代码。开发中会有不少临时的分支,用来开发一些新功能,在确认无问题以后,合并到develop中,而后删除临时分支。Develop中的代码不必定是合适发布的,多是实验性的,在develop中的某个版本到了比较成熟的时候,去和master合并。

 

当master中有bug了怎么办?那就新开一个bugfix分支,解决掉master的bug,同时再和master与develop合并(develop通常也会存在一样的bug嘛),而后删除临时分支。

 

咱们在开始工做前,先从服务器上拉去最新的版本,而后开发,而后把本身的版本合并到服务器上去。

 

正式开始

创建github仓库 

创建仓库的操做须要在网站上进行。咱们一般是在服务器上创建仓库(repository),而后克隆(clone)到本地。若是你想在本地直接创建仓库(init),那么一般是本地的单人代码库,或者是局域网内部共享的库,或者你就是代码服务器的管理员。

Github上创建仓库的操做很简单,打开网站,右上角右数第三个按钮就是了(看图)。你只须要输入项目名字,以及创建“.gitignore”文件就行。这个文件其实就是咱们明确指明不须要版本跟踪的文件,上文已经提到过了。一般这个文件是咱们本身写的,可是github已经为咱们的各类常见项目提供了现成的样板,更加方便。

 

通常不会有什么问题,你填写完以后“create repository”就好了,咱们会看到这样的页面:

 

这样就建立成功了。能够看到,如今初始的库中,有一个master分支,而且有了一次commit,做为初始化的操做。你也能够在本地创建仓库查看,实际上是同样的。不过咱们一般不在本地创建仓库,若是你须要协同开发的话,由于你不能让服务器去克隆你电脑上的仓库,只能是你去克隆服务器的仓库。固然了,若是你不打算用服务器的话,那是另一回事了。

 

能够看到上面有项目的三种协议的地址:http,ssh,以及git协议的。这三种协议各有优缺点,都是指向同一个项目的。你还能够下载zip压缩包,或者用github的windows客户端进行方便的克隆。这个客户端作的不错,不过它只能用在github上面,其余的代码托管平台不能用,这个就很差了。咱们仍是用msysgit+tortoisegit的方式,对命令行熟悉的童鞋能够考虑直接上命令行啦。又扯开去了,不说了。

 

克隆仓库到本地

咱们用ssh的协议为例。ssh的仓库地址大概是长这个样子:

git@github.com:jarelzhou/testproject.git

在你想要放本地仓库的地方,右键,git clone…

听说本地仓库不建议放在eclipse的workspace中,不知为什么。题外话了,这样可能会形成项目间的混乱。

右键以后,看到这样的界面,url中填写以前github提供的ssh地址,putty key记得选择以前咱们建立的private key。

 

而后会要你输入passphrase,这也是以前设置好的:

 

建立中:

    

 

而后是这个警告窗口,这个窗口只会出现一次,之后就不会有了,这是要你核对sshkey的,你能够核对一下:

 

若是没错的话,点“Yes”就好了。过了一小会儿,会出来提示成功:

 

这个关掉就能够了。

此时仓库信息中已经有了本来仓库的位置了,再也不须要额外的设置。

 

 

有没有看到,仓库已经克隆下来啦?被版本控制的目录会打上绿勾,若是没有的话你能够刷新一下看看,windows的图标缓存有bug,并且至今没有解决,刷新若是尚未的话可能得注销一下了。

 

作一些改动

咱们如今来尝试给这个测试的项目添一点东西。好比添加一个main.cpp:

 

保存以后看到目录变成了这个样子:

 

发现有一个~结尾的存档文件,不该该被跟踪的。右键文件,选择ignore便可。添加到忽略列表以后,你再刷新,就能够看到,main.cpp~这个文件上的图标消失了。

 

而main.cpp这个文件是咱们要添加到控制中的。右键,Tortoisegit-》add,它就从未跟踪状态到被跟踪状态,并且是被添加到了stage中。

有一种说法,.gitignore自己也应该被忽略,不过这样的话可能你们添加的文件不一致,因此咱们仍是不忽略了。

 

这个时候,咱们来commit一下,记录到本地版本库中。右键,commit便可。注意,git要求每次commit必须输入描述信息。

 

点OK就能够了。此时目录中全部文件又变成了绿勾的状态。

 

推送到服务器端

咱们已经在本地作了修改,并commit到了本地的库。Git不容许直接commit到远程库,只容许两个库之间的同步操做,而没有commit的修改,是没有记录到仓库中的。如今,咱们来推送(push)到服务器端。

仍旧是强大的右键……tortoisegit把几乎所有的操做放到了右键菜单中去。选择push:

 

点OK就好了。而后又是一个乌龟翻跟斗的动画:

 

推送完了以后,关掉这个窗口就好了。

如今咱们回到github的网站,刷新一下,看看,是否是文件被推送上去啦?

 

除此以外,还有pull操做,是从服务器端拉取最新的版本库,由于可能项目组的其余成员已经作了修改,你须要把其余人的改动同步下来。

 

分支操做

咱们如今只有一个分支,更合理的设置是两个常设分支,而后按需出现的临时分支。创建分支的方法:右键,create branch,设置好这个分支是从哪一个状态分叉出来的,默认是当前的工做状态,你也能够设成其余的。切换工做分支是checkout/switch。

在同步的时候,咱们一般是每一个分支单独同步的,你须要推送什么分支,就选择哪一个分支,不要推送错了。Pull的时候,也是这样。Tortoisegit提供了拉取/推送所有分支的选项,不过你在作这个操做以前,必需要清楚你在作什么。

 

最后

写到这里,windows下tortoisegit的大概操做就说完了。你能够发现,我其实并无过多地去描述tortoisegit怎么操做,我更多的是在讲,git的设计,以及一种比较清晰的工做流程。这种工做流程不只仅是tortoisegit,这在你用命令行的git,甚至是其余的版本控制系统,都是差很少的。工具不重要,重要的是如何去用工具提升咱们的效率。

 

写这篇文章到最后,我也把整个的过程理了一遍,对git也有了更深的理解。仍是写下来比较清楚。