1 git简介

 

  Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
  Git 易于学习,占地面积小,性能极快。
  它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于 Subversion、CVS、Perforce 和 ClearCase 等版本控制工具
 

2 版本控制是什么

  
  版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
  版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换
 

3 常见的两种版本控制工具

3.1 集中式版本控制工具

  集中化的版本控制系统诸如 CVS、SVN 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或
者提交更新。
  多年以来,这已成为版本控制系统的标准做法。这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。
  事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作
 

3.2 分布式版本控制工具

  Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS) ,分为两种类型的仓库:

    本地仓库和远程仓库

    本地仓库:是在开发人员自己电脑上的Git仓库

    远程仓库:是在远程服务器上的Git仓库

  Clone:克隆,就是将远程仓库复制到本地

  Push:推送,就是将本地仓库代码上传到远程仓库

  Pull:拉取,就是将远程仓库代码下载到本地仓库

  分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
    1. 服务器断网的情况下也可以进行开发,自己本地也可以做版本控制
    2. 每个客户端(自己电脑)保存的也都是整个完整的项目(包含历史记录,更加安全)
 

4 Git简史

 

 

  Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。

  到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统Git

5 Git的工作机制

   Git分为工作区,暂存区,本地仓库,远程仓库

  工作区就是我们操作的文件所在的文件夹

  暂存区:临时存储区域

  本地仓库:记录文件的所有历史信息(包括历史版本)

  远程仓库:一个共同的仓库,各个本地仓库的文件可以推送到这里,本地仓库也可以从远程仓库拉取新的文件。

 

  1.从远程仓库中克隆代码到本地仓库

  2.从本地仓库中checkout代码然后进行代码修改

  3.在提交前先将代码提交到暂存区

  4.提交到本地仓库。本地仓库中保存修改的各个历史版本

  5.修改完成后,需要和团队成员共享代码时,将代码push到远程仓库

  

6 Git安装

6.1 下载

  https://git-scm.com/download

 

 

6.2 安装

  (简单点的话可以一直next,采用默认的设置安装)

  

   选择 Git 安装位置,要求是非中文并且没有空格的目录,然后下一步。

Git 选项配置,推荐默认设置,然后下一步。

Git 安装目录名,不用修改,直接点击下一步

Git 的默认编辑器,建议使用默认的 Vim 编辑器,然后点击下一步

默认分支名设置,选择让 Git 决定,分支名默认为 master,下一步

修改 Git 的环境变量,选第一个,不修改环境变量,只在 Git Bash 里使用 Git

选择后台客户端连接协议,选默认值 OpenSSL,然后下一步

配置 Git 文件的行末换行符,Windows 使用 CRLF,Linux 使用 LF,选择第一个自动

转换,然后继续下一步

选择 Git 终端类型,选择默认的 Git Bash 终端,然后继续下一步

选择 Git pull 合并的模式,选择默认,然后下一步

选择 Git 的凭据管理器,选择默认的跨平台的凭据管理器,然后下一步

其他配置,选择默认设置,然后下一步

 

点击 Finsh 按钮,Git 安装成功

右键任意位置,在右键菜单里选择 Git Bash Here 即可打开 Git Bash 命令行终端

 

 

在 Git Bash 终端里输入 git --version 查看 git 版本,如图所示,说明 Git 安装成功

 

 

7 Git 常用命令

 

7.1 设置用户签名

7.1.1 基本语法
  git config --global user.name 用户名
  git config --global user.email 邮箱
 
7.1.2 说明
  签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。
  ※注意:这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系
 

7.2 初始化本地库

  在安装好git,设置好签名后,就需要先初始化本地库
 
7.2.1 基本语法
  git init
 
7.2.2 示例
  来到我们要作为本地库的文件夹,右键打开git命令终端,执行git init
  
  

  执行成功,在文件夹下看到.git的文件夹生成(默认是隐藏的),勾选隐藏的项目,就可以看到,表示本地库已完成初始化

 

   

7.3 查看本地库状态

7.3.1 基本语法 

  git status
 
7.3.2 示例

 

   可以看到,它这里显示,有一个文件aaa.txt没有add到暂存区(因为初始化完成后,我创建了一个aaa.txt的文件)

7.4 添加文件到暂存区

7.4.1 基本语法

  git add 文件名

 

7.4.2 示例

  执行git add aaa.txt把文件加到暂存区

  执行git status查看本地库状态,发现有一个新的文件aaa.txt在暂存区

  

 

7.5 提交暂存区文件到本地库

7.5.1 基本语法

  git commit -m "日志信息" 文件名
 
7.5.2 示例
  暂存区文件aaa.txt就被提交到本地库了

 

7.6 查看历史版本

7.6.1 基本语法
  git reflog (文件名) 查看版本信息 :带上文件名就是查看这个文件的版本信息
  git log (文件名) 查看版本详细信息:带上文件名就是查看这个文件的版本信息
 
7.6.2 示例
  git reflog 查看版本信息(最下面的是最早的操作,最上面的是最新的操作),蓝色框里面的就是版本号

   git log 查看版本详细信息,顺序是从下到上的(最下面的是最早的操作,最上面的是最新的操作)

 

7.7 版本穿梭

  本地库存储着历史各个版本的信息,所以我们可以从当前版本切换到另外一个版本
 
7.7.1 基本语法  
  git reset --hard 版本号
  
7.7.2 示例
  使用vim编辑bbb.txt
  命令:vim bbb.txt
  

   此时bbb.txt只有一行内容"bbbbbb"

   加上一行内容

  

   执行git add和git commit把修改的内容提交到本地库

  

   再查看bbb.txt的版本信息,可以看到修改的记录

  

  执行git reset --gard 版本910739a   ,这个910739a   就是上面bbb.txt的第一个版本

      

  执行命令cat bbb.txt查看bbb.txt,发现内容只有一行了,退回到bbb.txt最初的版本

  

   同时查看本地工作文件,发现bbb.txt也退回到最初版本

  

 

   需要注意的是,版本穿梭,针对的是整个本地库,而不是某个文件,所有文件都会回到我们穿梭时候的那个版本的内容。

  

8 分支操作

8.1 什么是分支

  在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实是指针的引用) 
 

 

    如上图:master分支是主分支,同时它也是线上运行的正式版本。

  现在,master-1正在线上运行,而此时我们需要添加两个功能模块,分别是feature-blue和feature-game。为了避免这两个模块的开发对线上运行的代码的影响,也为了避免两个功能模块开发之间的运行,所以创建两个分支,feature-blue和feature-game。此时,master-1、feature-blue-1和feature-game-1这三个分支的内容还是一样的。

  同时两个开发团队分别去做feature-blue和feature-game这两个模块。

  feature-blue团队在一段时间开发后完成了feature-blue-2版本,发现没有什么问题,就把feature-blue-2合并到master,master就更新到了master2,此时master2就有了feature-blue模块。

  feature-game的团队,由于这个模块比较复杂,经过三个版本,一直到feature-game-4这个版本才完成整个模块的功能(在这个期间,master-2发现存在bug,修复了bug,变为了master-3这个版本)。feature-game-4这个版本经过测试,发现没什么问题,就把feature-game-4合并到master,形成了master4这个分支,此时master就具备了feature-game这个功能模块。

  通过这个例子我们看到,分支可以有效的将各个功能模块的开发分开来,避免相互影响,同时,又不影响线上正在运行的主分支。在其它分支完成后,把新的内容合并到主分支就好了。

  各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。

  

8.2 分支操作命令

  

 

8.3 创建分支

8.3.1 基本语法  

  git branch 分支名
 
8.3.2 示例
  创建了一个分支,分支名为baster1(注意创建分支前,本地库需要有文件commit了)

 

8.4 查看分支

8.4.1 基本已发
  git branch -v
 
8.4.2 示例

 

8.5 切换分支

8.5.1 基本语法
  git checkout 分支名
 
8.5.2 示例
  从master切换到了baster1
 

 

8.6 合并分支

8.6.1 基本语法

  git merge 分支名 
 
8.6.2 示例
  1)在baster创建一个文件qqq.txt
  

   

 

   2)把qqq提交到本地库

   

 

    3)切换到master

  

 

    4)合并baster1到master

     发现,新创建的qqq.txt被合并过来了

  

 

 8.6.3 冲突示例

  1)在master对qqq.txt进行修改,注意,修改后一定要commit(git会把没有commit的内容直接移到要checkout的branch上面去)
    

   

 

   2)切换到baster1

    

 

   3)对qqq.txt进行修改

    

   

  4)切换到master

    

 

   5)合并baster1到master

    MERGING状态代表有冲突,也指出了冲突问价是qqq.txt

  

 

   6)处理冲突文件vim qqq.txt

       <<<<<<< HEAD
     当前分支的代码
        =======
       合并过来的代码
        >>>>>>> 

   

    我们保留两个分支的修改(也可以只保留某一个分支的修改),保存修改

  

 

    7)添加qqq.txt到暂存区

  

 

    8)提交qqq.txt

      注意,git commit -m "备注说明"  后面不要文件名,冲突解决。

   

     

    9)查看

      查看qqq.txt,发现三行内容

      切换到baster1,查看qqq.txt,两行内容

    

 

9 Git代码托管中心

  git托管中心常用的有三个,GitLab,GitHub,Gitee

 

9.1 局域网环境下


  GitLab服务器,它是在局域网环境下搭建的,私密性比较强

 

9.2 外网环境下

  GitHub:国外的托管中心,网络影响较大
  Gitee(码云),国内的托管中心


10 本地库和代码托管中心远程库交互


10.1 团队内协作

  

 

10.2 团队外协作

 

 

11 远程仓库操作

  使用Github或者Gitee,两者的操作基本一致。

  国内使用gitee会更舒服点,使用Git经常因为网络操作失败

 

11.1 网址

 

  GitHub 网址:https://github.com/ 
  Gitee网址:https://gitee.com/
  创建个账号,登录
 

11.2 创建一个远程仓库(gitee)

  点击+,新建仓库,输入仓库名称(一般取项目名称),选择开源或者私密都可以,创建
  

 

11.3 远程仓库操作相关命令

 

11.4 在本地git添加远程库地址别名

11.4.1 基本语法 

  查看当前所有远程地址别名:git remote -v 
  新增远程地址别名:git remote add 别名 远程地址
  删除远程地址别名:git remote rm 别名
 
11.4.2 示例
  git remote add 别名 远程地址,后面这个远程地址就是我们刚才在gitee上创建的远程仓库的地址(HTTPS)
  

 

 新增远程地址别名,别名为gittest

查看远程地址别名:发现有两个gittest别名,分别对应拉取和推送

 

 

 

11.5 推送代码到远程仓库

11.5.1 基本语法

  git push 别名 分支
 
11.5.2 示例
  把本地仓库的master分支推送到了gitee上的远程仓库(没有登录的会提示登录)

 操作后,发现本地仓库的文件已经推送到了远程仓库

 

11.6 演示团队协作-添加团队成员

11.6.1 创建一个新的gitee账号

11.6.2 把新的账号加入到我们的项目的团队中来

  管理-仓库成员管理-开发者-邀请(可以发送链接要求,也可以直接通过对方用户名添加)

 

 

 完成添加后,团队中就有两个账号了

 

11.7 clone代码

  作为一个新的成员,要一期开发gittest这个项目,首先要把远程仓库的代码clone到本地仓库

 

11.7.1 基本语法

  git clone 远程地址 
 
11.7.2 示例
 
  1)初始化新的本地仓库gittest1
  
  

 

   2)克隆远程仓库到本地仓库

    git clone 远程地址,这里不能使用别名,只能用地址,这个地址使用新账号的远程仓库的地址

  

  操作完成,发现远程仓库文件已经克隆到了本地仓库

11.8 使用新对本地仓库代码修改后push到远程仓库

11.8.1 由于我是在同一个电脑上操作的,所以先要修改凭证管理器

  我们把账号密码改为新的gitee账号

 

 

11.8.2 对本地仓库文件进行编辑
  在aaa.txt加了一行文字
  
 
11.8.3 提交到本地仓库
  git add
  git commit
  
11.8.4 push到远程仓库
  

操作成功后我们修改的内容就被push到远程仓库了

 

11.9 pull拉取更新的内容

11.9.1 我们回到原先的本地仓库gittest

11.9.2 凭据管理器改为原来的账号

11.9.3 基本语法

  git pull 远程仓库别名(地址) 分支名称

 

11.9.4 示例

  发现1个文件发生了改变,就是aaa.txt,改变的内容被拉取下来了

使用cat查看,发现增加的一行内容已被拉取下来了