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. 慕课笔记-Java入门第二季

    1.java对象的使用 (1)创建对象 类名 对象名=new 类名(); (2)使用对象 引用对象的属性:对象名.属性; 引用对象的方法:对象名.方法(); Note: ①Java会给成员变量赋初始值 ...

  2. kali 装好java后提示 -bash: /home/javainstall/jdk1.8.0_171/bin/java: 没有那个文件或目录

    [问题现象] 在/etc/profile配置里面也是配置好了的,并且该目录是有java的 [问题原因] 出现这个问题的原因:64位的系统,安装了32位的Java. [解决方案] 通过网络搜索,发现通过 ...

  3. POP页面暂时不销毁

    摘要:我们经常使用的QQ空间,当我们短时间内两次进入页面的时候,页面是没有重新创建的,不光是缓存的数据,是整个页面都没有变.我们在开发中可能也会有这样的需求.开始的时候,想的思路是这样的:用定时器,将 ...

  4. ZOJ3329(数学推导+期望递推)

    要点: 1.期望的套路,要求n以上的期望,则设dp[i]为i分距离终点的期望步数,则终点dp值为0,答案是dp[0]. 2.此题主要在于数学推导,一方面是要写出dp[i] = 什么,虽然一大串但是思维 ...

  5. CSS div和css布局

    一.div和span DIV和SPAN在整个HTML标记中,没有任何意义,他们的存在就是为了应用CSS样式 DIV和span的区别在于,span是内联元素,div是块级元素.div占用整行,span只 ...

  6. sftp 常用命令 以及 以及与 scp 的比较

    1.scp 不能容忍网络闪断,因此一旦出现网络闪断,那么scp 命令就会异常退出 sftp 可以容忍网络闪断,而且具备断电续传,因此sftp 适用于网络更慢的环境, 2. sftp 是一个交互式文件传 ...

  7. 546 Remove Boxes 移除盒子

    给定一些不同颜色的盒子,以不同的正整数表示.消去连续相同颜色的盒子,直到全部消除完毕为止.每一次消去可以得到k * k分(k为消去盒子的个数, k  >= 1).计算可以得到的最大得分.注意:盒 ...

  8. javaoo面向对象

  9. python flask学习(2)

    本文主要整理下几个Flask扩展: 0.Flask-Bootstrap:集成Twitter开发的一个开源框架Bootstrap.1.Flask-Script:为Flask程序添加一个命令行解析器2.F ...

  10. 优秀Java程序员的四大忌,你避免了吗?

    做为一名优秀的程序员需要具备永不放弃的精神,如果一个程序员不具备这种永不放弃的精神,那么这个程序员只能算是一名假程序员.而通往成功的道路上往往是不平坦的,想要成为一个合格的高级Java程序员,需要规避 ...