SVN是集中式版本控制系统,版本库集中放在中央服务器上,而干活时用的都是本身的电脑,因此首先要从中央服务器哪里获得最新的版本,而后干活,干完后,须要把本身作完的活推送到中央服务器。集中式版本控制系统是必须联网才能工做。jquery
Git则是分布式版本控制系统,即它就没有中央服务器,每一个人的电脑就有一个属于本身的版本库,这样,工做的时候就不须要联网了,由于版本都是在本身的电脑上。最终,各自将本地分支先合并,再将合并后的分支推向同名的远程库。git
Git和GitHub的区别:Git是分布式版本管理工具,而GitHub是一个网站,能够在github上创建一个网上仓库,而后提交本身的代码到该网上仓库,这样你的每次提交,别人也均可以看到你的代码,同时别人也能够帮你修改你的代码,这种开源的方式很是方便程序员之间的交流和学习。程序员
GitHub是一个很是适合程序员交流的网站,不少国际上的技术大牛都在github上有本身的开源代码,其余人只要申请个帐号就能够随意的看到这些大牛写的程序。同时国内的不少互联网公司如百度,阿里等也在github上公布有开源的代码。 github
工做区、本地库、远程库三者之间的工做原理及流程以下图:windows
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 #查看远程及本地的全部分支,当前分支前加"*"号
Git的分支管理策略中,代码库应该有且仅有一个稳定的主分支,一般是默认的master分支。主分支上不作开发,仅用做发布新版本,故主分支也叫作版本分支。
一般,开发应在另外一个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分支上生成一个新节点,这能够清晰地保留版本演进过程。
前面讲到版本库的两条主要分支: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
工做区、暂存区以及版本库三者之间的关系。
工做区:就是你在电脑上看到的目录,好比目录testgit下的全部文件(.git版本库目录除外)。或者之后须要再新建的目录文件等等都属于工做区范畴。
暂存区(stage):工做区有一个.git隐藏目录,这个不属于工做区,这是版本库。其中版本库里面存了不少东西,其中最重要的就是stage(暂存区),还有就是Git为咱们自动建立的第一个master分支。
在Git中每次提交都分为两个步骤:
第一步:用add命令将文件添加到版本库的暂存区
第二步:用commit命令把暂存区的全部内容提交到当前分支上
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回退到上一版本
因为本地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。
由远程库向本地库同步时远程库充当的是来源,本地库充当的是去向。
$ git clone <远程库的网址>
$ git clone <版本库的网址> <本地库目录名>
$ git clone –o 远程主机名 <版本库的网址> <本地库目录名>
注:该命令会在当前目录生成一个新目录,与远程主机的版本库同名。若是要指定不一样的目录名,能够将目录名做为git clone命令的第二个参数。并在克隆的时候将远程主机默认命名为origin,若是想用其它的远程主机名,须要用git clone命令的-o选项指定。实例:
$ git clone -o jQuery https://github.com/jquery/jquery.git
一旦远程版本库有了更新(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
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来指定远程主机名。
为了便于管理,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 <远程主机名>
当本地分支有了更新,就须要将其推送到远程与之关联的分支上
语法:$ git push <远程主机名> <本地分支名>:<远程分支名>
若是略去了冒号后的远程分支名,则表示将本地分支推送到远程与之关联的分支上;若该远程分支不存在,则会在远程主机新建该分支;若省略本地分支名,则表示删除指定的远程分支。
实例:
#推送master分支到origin主机的master分支上
$ git push origin master
#本地分支为空,表示删除远程的master分支
$ git push origin :master
# 等同于
$ git push origin --delete master
【注】1.从远程向本地拉取时远程分支是来源,由本地向远程推送时本地分支是来源
2.由远程向本地拉取时,若省略冒号前的来源分支(即远程分支)则表示拉取与当前分支关联的远程分支进行合并;若省略冒号后的目的分支(即本地分支),则视当前分支为目的分支。可是,由本地向远程push时,若省略冒号前的来源分支(即本地分支)则表示删除冒号后的远程分支。