1.Git的综述

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

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

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

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

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

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

【Git版本控制】Git使用教程的更多相关文章

  1. Git版本控制 Git、github,gitlab相关操作

    目录 关于版本控制 版本管理工具 集中式管理 分布式管理 git版本管理 git介绍 软件安装 Git工作状态 原理流程步骤 git基本操作 对文件进行修改 分支 共享仓库 创建共享仓库: 共享仓库上 ...

  2. GIT版本控制 — GIT与SVN的相互转换 (三)

    git-svn git-svn用于Git和SVN的转换,可以把Git仓库迁移成SVN仓库,反之亦可. 详细介绍可见[1],或者命令行输入git-svn. Bidirectional operation ...

  3. Git版本控制教程

    Git 版本控制入门 不了解Git请查看权威Git书籍 ProGit(中文版). 一份很好的 Git 入门教程,点击这里查看. Git客户端下载地址: 官方Git - TortoiseGit - So ...

  4. git,版本控制教程

    主要内容 版本回退 工作区和暂存区 管理修改 撤销修改 删除文件 分支管理     *****此处没有深讲***** 一.两条基本查看命名 查看状态命令: git status 查看修改内容命令: g ...

  5. Git版本控制使用方法入门教程

    1. 概述 对于软件版本管理工具,酷讯决定摒弃CVS而转向Git了. 为什么要选择Git? 你真正学会使用Git时, 你就会觉得这个问题的回答是非常自然的.然而当真正需要用文字来回答时,却觉得文字好像 ...

  6. Git版本控制:Git高级教程

    http://blog.csdn.net/pipisorry/article/details/50669350 Git有很多命令行参数,使用起来非常方便.可以运行 man git log ,来看一下这 ...

  7. 版本控制-Git服务器搭建和常用命令使用

    Git是目前世界上最先进的分布式版本控制系统(没有之一).使用Svn的请参考<版本控制-svn服务器搭建和常用命令(centos 6.3)>,下面介绍Git的常用命令 常用命令 简单版 升 ...

  8. Git和Github简单教程

    原文链接:Git和Github简单教程 网络上关于Git和GitHub的教程不少,但是这些教程有的命令太少不够用,有的命令太多,使得初期学习的时候需要额外花不少时间在一些当前用不到的命令上. 这篇文章 ...

  9. Github.com的Git和TortoiseGit图文教程

    图文介绍Windows系统下使用 Github账户 + msysgit + TortoiseGit 进行文件管理的方法. 安装 安装mysysgit 下载地址:msysgit 安装过程: 0.启动 1 ...

  10. 史上最浅显易懂的Git分布式版本控制系统教程

    从零起步的Git教程,让你无痛苦上手世界上最流行的分布式版本控制系统Git! 既然号称史上最浅显易懂的Git教程,那这个教程有什么让你怦然心动的特点呢? 首先,本教程绝对面向初学者,没有接触过版本控制 ...

随机推荐

  1. 在 UIViewController 中手动增加 TableView 出现 Type 'SomeViewController' does not confirm to protocol 'UITableViewDataSource' 问题的解决办法

    许多时候我们都有在普通的继承自 UIViewController 的控制器中使用 TableView 的需求,这时候就需要当前控制器类继承 UITableViewDelegate 和 UITableV ...

  2. ubuntu 安装R 语言

    我个人的环境是 ubuntu 12.04 64 位桌面版. 我自己在安装R 语言时,发现它依赖的库真不是一般的多,所以我在这里简单记录一下我整个安装过程 首先你需要安装 apt-get install ...

  3. Windows服务使用Windsor容器

    该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. Windsor是ABP框架自带的IOC容器. 关于什么是IOC,你可以Bing或者Go ...

  4. 00 | QPS

    每秒查询率 QPS Query Per Second 某个查询服务器 在 规定时间内 处理了多少流量 对应的fetches/sec,即每秒响应请求数,就是最大吞吐量 原理:每天80%的访问集中在20% ...

  5. [題解](貪心/堆)luogu_P2107小Z的AK計劃

    清明講過一道類似的,難度略大的:P3545 [POI2012]HUR-Warehouse Store 兩道題類似,都是暫時先把前面的加進候選集合里,如果超出限制的話就拿現在這個和前面的交換, 相當於不 ...

  6. [題解/狀壓dp]POJ_2411_Mondriaan's dream

    关于“我读过很多书,到后来大部分都被我忘记了,那阅读的意义是什么?”的疑问,我看过最巧妙的一个回答:当我还是个孩子的时候,我吃过很多的食物,大部分已经一去不复返而且被我忘记了,但可以肯定的是,它们中的 ...

  7. ZJOI2017 day2 T2 线段树 想法题

    考完D2发现自己简直zz了...花式扔基本分 首先这道题有个显然的套路:树上一些点到一个定点的距离和=这些点深度和+点数*定点深度和-2*lca深度和 ——上一次见这个套路是LNOI2014,上次做的 ...

  8. 洛谷 P1053 篝火晚会

    https://www.luogu.org/problemnew/show/P1053 错误记录:判-1的时候出了些问题(比如只判了图是否连通):数组没清空 #include<cstdio> ...

  9. 一文带你读懂 Mysql 和 InnoDB存储引擎

    作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...

  10. vue2.0:(二)、mock数据

    什么是mock数据呢?很多情况下,后台的搭建比起前端来说要麻烦的多,所以,常常是前端写好了页面以后后台接口却没有写好,但是在一个项目中,接口调试确实是最浪费时间的,所以,往往前端需要自己模拟数据. 第 ...