【Git版本控制】Git使用教程

1.Git的综述

 SVN是集中式版本控制系统,版本库集中放在中央服务器上,而干活时用的都是本身的电脑,因此首先要从中央服务器哪里获得最新的版本,而后干活,干完后,须要把本身作完的活推送到中央服务器。集中式版本控制系统是必须联网才能工做。jquery

 Git则是分布式版本控制系统,即它就没有中央服务器,每一个人的电脑就有一个属于本身的版本库,这样,工做的时候就不须要联网了,由于版本都是在本身的电脑上。最终,各自将本地分支先合并,再将合并后的分支推向同名的远程库。git

Git和GitHub的区别:Git是分布式版本管理工具,而GitHub是一个网站,能够在github上创建一个网上仓库,而后提交本身的代码到该网上仓库,这样你的每次提交,别人也均可以看到你的代码,同时别人也能够帮你修改你的代码,这种开源的方式很是方便程序员之间的交流和学习。程序员

GitHub是一个很是适合程序员交流的网站,不少国际上的技术大牛都在github上有本身的开源代码,其余人只要申请个帐号就能够随意的看到这些大牛写的程序。同时国内的不少互联网公司如百度,阿里等也在github上公布有开源的代码。 github

工做区、本地库、远程库三者之间的工做原理及流程以下图:windows

2.Git本地库管理

2.1.Git的分支管理策略

Git之因此能实现分布式版本控制,就是基于其分支管理策略。本地库所作的操做都是在某分支上进行的,不一样分支之间能够合并。能够拉取远程分支到本地,也能够推送本地分支到远程。bash

git branch <branchName> #建立新的分支服务器

git branch -d <branchName> #删除已有分支ssh

git checkout <branchName> #切换到其它分支上分布式

git merge <branchName> #合并branchName分支到当前分支上工具

git branch #查看当前分支

git branch -r #查看远程分支

git branch -a #查看远程及本地的全部分支,当前分支前加"*"号

2.1.1.主分支master

Git的分支管理策略中,代码库应该有且仅有一个稳定的主分支,一般是默认的master分支。主分支上不作开发,仅用做发布新版本,故主分支也叫作版本分支。

2.1.2.开发分支develop

一般,开发应在另外一个develop分支上完成。若是想正式对外发布,就在master分支上对develop分支进行"合并"(merge)。

#从master上分出一个develop分支

git checkout -b develop master 

#将develop分支合并到master分支的命令以下两个:

#切换到master分支

git checkout master

#对develop分支进行合并

git merge --no-ff develop

【注】git checkout -b <newBranch> <originalBranch>命令从原有分支originalBranch上分出一个新分支newBranch,并切换到该分支上。

默认状况下,Git执行"快进式合并"(fast-farward merge),会直接将master分支指向develop分支。使用--no-ff参数后,会执行正常合并,在master分支上生成一个新节点,这能够清晰地保留版本演进过程。

2.1.3.临时性分支

前面讲到版本库的两条主要分支:master和develop。前者用于发布新版本,后者用于平常开发。其实,常设分支只须要这两条就够了,不须要其余了。
可是,除了常设分支之外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种:

1)功能(feature)分支

2)预发布(release)分支

3)修补bug(fixbug)分支

这三种分支都属于临时性须要,使用完之后应该删除,使得代码库的常设分支始终只有master和develop。

1)功能(feature)分支:它是为了开发某种特定功能,从develop分支上面分出来的。开发完成后,要再并入develop。

功能分支的名字,能够采用feature-*的形式命名。

建立一个功能分支:

# git checkout -b feature-x develop

开发完成后,将功能分支合并到develop分支:

# git checkout develop

# git merge --no-ff feature-x

删除feature分支:

# git branch -d feature-x

2)预发布(release)分支:它是指发布正式版本以前(即合并到master分支以前),咱们可能须要有一个预发布的版本进行测试。预发布分支是从develop分支上面分出来的,预发布结束之后,必须合并进develop和master分支。它的命名,能够采用release-*的形式。

建立一个预发布分支:

# git checkout -b release-1.2 develop

确认没有问题后,合并到master分支:

# git checkout master

# git merge --no-ff release-1.2

对合并生成的新节点,作一个标签

# git tag -a 1.2

再合并到develop分支:

# git checkout develop

# git merge --no-ff release-1.2

最后,删除预发布分支:

# git branch -d release-1.2

3)修补bug(fixbug)分支:软件正式发布之后,不免会出现bug。这时就须要建立一个分支,进行bug修补。修补bug分支是从master分支上面分出来的。修补结束之后,再合并进master和develop分支。它的命名,能够采用fixbug-*的形式。

建立一个修补bug分支:

# git checkout -b fixbug-0.1 master

修补结束后,合并到master分支:

# git checkout master

# git merge --no-ff fixbug-0.1

# git tag -a 0.1.1

再合并到develop分支:

# git checkout develop

# git merge --no-ff fixbug-0.1

最后,删除"修补bug分支":

# git branch -d fixbug-0.1

2.2.提交文件到当前分支

工做区、暂存区以及版本库三者之间的关系。

工做区:就是你在电脑上看到的目录,好比目录testgit下的全部文件(.git版本库目录除外)。或者之后须要再新建的目录文件等等都属于工做区范畴。

暂存区(stage):工做区有一个.git隐藏目录,这个不属于工做区,这是版本库。其中版本库里面存了不少东西,其中最重要的就是stage(暂存区),还有就是Git为咱们自动建立的第一个master分支。

在Git中每次提交都分为两个步骤:

第一步:用add命令将文件添加到版本库的暂存区

第二步:用commit命令把暂存区的全部内容提交到当前分支上

2.3.撤销工做区中某文件的修改

case1:若已知待撤销的内容,直接手动更改待撤销的文件,而后从新add到暂存区,最后再commit到当前分支。

case2:文件添加到暂存区后又作了修改,撤销修改回到添加暂存区时的状态。使用git checkout –fileName撤销工做区的修改,实例:

git checkout —readme.txt

【注】命令git checkout -readme.txt 中的"-"很重要,若是没有"-"的话,该命令是切换分支命令。

case3:撤销已提交到当前分支的修改

使用reset版本回退命令回退到上一个版本,以达到撤销修改的目的。具体操做以下:

使用git log或git reflog命令查看版本日志,再用git reset --hard 版本号命令回退到上一版本便可(或者经过git reset --hard HEAD^直接回退到上一版本)。实例:

git reset --hard 6fcfc89回退到上一版本

3.GitHub上的远程库与本地库之间的同步

3.1.GitHub上进行SSH认证

因为本地Git仓库和GitHub仓库之间的传输是经过SSH加密的,因此必需要让github仓库认证你的SSH key,在此以前,必需要生成SSH key。

第一步:生成SSH Key

在windows下查看[c盘->用户->本身的用户名->.ssh]下是否有id_rsa、id_rsa.pub文件,若是没有须要手动生成。打开git bash,在控制台中输入如下命令:$ ssh-keygen -t rsa -C youremail

 参数-t用于指定密钥类型,若未指定则默认生成用于SSH-2的RSA密钥,这里使用的是rsa。

参数-C用来指定对该密钥的注释,方便用户标识这个密钥,指出密钥的用途或其它的信息,这里通常输入在GitHub上注册时填的邮箱做为该密钥的标识。 

第二步:登陆github,打开setting->SSH keys,点击右上角New SSH key,把公钥id_rsa.pub的所有内容放进key输入框,再为当前的key起一个title来标识每一个key。

3.2.由远程库向本地库同步

由远程库向本地库同步时远程库充当的是来源,本地库充当的是去向。

3.2.1.clone命令克隆远程库到本地

$ git clone <远程库的网址>

$ git clone <版本库的网址> <本地库目录名>

$ git clone –o 远程主机名 <版本库的网址> <本地库目录名>

注:该命令会在当前目录生成一个新目录,与远程主机的版本库同名。若是要指定不一样的目录名,能够将目录名做为git clone命令的第二个参数。并在克隆的时候将远程主机默认命名为origin,若是想用其它的远程主机名,须要用git clone命令的-o选项指定。实例:

$ git clone -o jQuery https://github.com/jquery/jquery.git

3.2.2.fetch命令获取远程分支到本地

一旦远程版本库有了更新(Git术语叫作commit),咱们须要将这些更新取回到本地。这时就要用到git fetch命令,获取远程分支到本地,并以远程主机名/分支名命名。获取的远程分支不会与本地分支进行合并,故对本地代码无影响。默认状况下git fetch命令获取远程全部分支(branch)。若是只想获取特定的分支,则能够指定分支名。

语法:

#将远程主机上的更新所有取回到本地。

$ git fetch <远程主机名>

#取回origin主机的master分支到本地

$ git fetch <远程主机名> <分支名>

【注】fetch从远程所取回的分支在本地是以"远程主机名/分支名"的形式命名。好比origin主机的master分支,就要用origin/master读取。

git branch命令的-r选项,能够用来查看远程分支,-a选项查看全部分支。

$ git branch -r

origin/master

$ git branch -a

* master

remotes/origin/master

3.2.3.pull命令拉取远程分支并与本地分支合并

git pull命令先拉取远程分支到本地,再与本地指定的分支合并。

语法:$ git pull <远程主机名> <远程分支名>:<本地分支名>

实例:$ git pull origin next:master

若是是将远程分支与本地当前分支合并,则冒号后面的目的分支可省略。

实例:$ git pull origin next

上面命令表示取回origin/next分支,再与当前分支合并。实质上,这等同于先作git fetch,再作git merge。

$ git fetch origin

$ git merge origin/next

【注】1.从远程fetch到的分支在本地都是以"远程主机名/分支名"表示的。

2.若是远程主机删除了本地所关联的分支,git pull在拉取远程分支时不会删除所关联的本地分支。这是为了不,因为其余人删除了远程主机的分支,致使git pull时不知不觉删除了与本地关联的分支。

3.从远程克隆仓库到本地时默认给远程主机命名为origin,能够经过选项-o来指定远程主机名。

3.3.由本地向远程同步

3.3.1.remote命令管理远程主机名

为了便于管理,Git要求每一个远程主机都必须指定一个主机名。git remote命令就是用于管理远程主机名的,这包括对远程主机名的增、删、改、查操做。

添加远程主机

语法:$ git remote add <远程主机名> <网址>

删除远程主机

语法:$ git remote rm <远程主机名>

修改远程主机名

语法:$ git remote rename <原主机名> <新主机名>

查询远程主机

查询全部与本地库关联的远程主机名

语法:$ git remote

查询全部与本地库关联的远程主机名及其地址

语法:$ git remote –v

实例:

origin git@github.com:jquery/jquery.git (fetch)

origin git@github.com:jquery/jquery.git (push)

查看某远程主机的详细信息

语法:$ git remote show <远程主机名>

3.3.2.push命令将本地分支推送到远程主机上

当本地分支有了更新,就须要将其推送到远程与之关联的分支上

语法:$ git push <远程主机名> <本地分支名>:<远程分支名>

若是略去了冒号后的远程分支名,则表示将本地分支推送到远程与之关联的分支上;若该远程分支不存在,则会在远程主机新建该分支;若省略本地分支名,则表示删除指定的远程分支。

实例:

#推送master分支到origin主机的master分支上

$ git push origin master

#本地分支为空,表示删除远程的master分支

$ git push origin :master

# 等同于

$ git push origin --delete master

【注】1.从远程向本地拉取时远程分支是来源,由本地向远程推送时本地分支是来源

2.由远程向本地拉取时,若省略冒号前的来源分支(即远程分支)则表示拉取与当前分支关联的远程分支进行合并;若省略冒号后的目的分支(即本地分支),则视当前分支为目的分支。可是,由本地向远程push时,若省略冒号前的来源分支(即本地分支)则表示删除冒号后的远程分支。