【版本控制】Git使用教程

1.Git的综述

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

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

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

GitHub是一个非常适合程序员交流的网站,很多国际上的技术大牛都在github上有自己的开源代码,其他人只要申请个账号就可以随意的看到这些大牛写的程序。同时国内的很多互联网公司如百度,阿里等也在github上公布有开源的代码。 

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

  • Workspace:工作区
  • Index(stage):暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

【注】暂存区是本地库的一部分,本地库是由本地分支与暂存区构成

2.Git本地库管理

2.1.Git的分支管理策略

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

git branch <branchName> #创建新的分支

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

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时,若省略冒号前的来源分支(即本地分支)则表示删除冒号后的远程分支。

猜你喜欢

转载自www.cnblogs.com/leiblog/p/10879867.html
今日推荐