概述

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

版本控制

一种记录文件内容变化,以便将来查阅特定版本修订情况的系统
最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本, 方便版本切换
image.png
个人开发过渡到团队协作需要版本控制
image.png

版本控制工具

集中式版本控制工具

CVS、SVN(Subversion)、VSS……

  • 有一个单一的集中管理的服务器,保存 所有文件的修订版本
  • 协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新
  • 在一定程度上看到项目中的其他人正在做些什么
  • 管理员也可以轻松掌控每个开发者的权限
  • 缺点是中央服务器的单点故障 : 服务器宕 机一小时, 谁都无法提交更新,也就无法协同工作

image.png

分布式版本控制工具

Git、Mercurial、Bazaar、Darcs……

  • 把代码仓库完整地镜像下来(本地库)
  • 每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份
  • 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
  • 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全 )

image.png

Git简史

image.png

Git工作机制

image.png

Git 和代码托管中心

代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库

  • 局域网
    • GitLab
  • 互联网
    • GitHub(外网)
    • Gitee 码云(国内网站)

      安装

      忽略

      Git常用命令

      | 命令名称 | 作用 | | —- | —- | | git config —global user.name 用户名 | 设置用户签名 | | git config —global user.email 邮箱 | 设置用户签名 | | git init | 初始化本地库 | | git status | 查看本地库状态 | | git add 文件名 | 添加到暂存区 | | git commit -m “日志信息” 文件名 | 提交到本地库 | | git reflog | 查看历史记录 | | git reset —hard 版本号 | 版本穿梭 |

设置用户签名

基本语法

  • git config —global user.name 用户名
  • git config —global user.email 邮箱

    案例实操

    全局范围的签名设置

    1. Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
    2. $ git config --global user.name Layne
    3. Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
    4. $ git config --global user.email Layne@atguigu.com
    5. Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
    6. $ cat ~/.gitconfig
    7. [user]
    8. name = Layne
    9. email = Layne@atguigu.com

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

    初始化本地库

    git init

    查看本地库状态

    git status

    添加暂存区

    git add 文件名
    git add .

    提交本地库

    git commit -m “日志信息” 文件名

    历史版本

  • git reflog 查看版本信息

  • git log 查看版本详细信息

    版本穿梭

    git reset —hard 版本号
    Git 切换版本,底层其实是移动的 HEAD 指针

    Git 分支操作

    image.png

    概念

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

    好处

    同时并行推进多个功能开发,提高开发效率。
    各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

    操作

    | 命令名称 | 作用 | | —- | —- | | git branch 分支名 | 创建分支 | | git branch -v | 查看分支 | | git checkout 分支名 | 切换分支 | | git merge 分支名 | 把指定的分支合并到当前分支上 |

查看分支

git branch -v

创建分支

git branch 分支名

切换分支

git checkout 分支名

合并分支

git merge 分支名

产生冲突

冲突产生的表现:后面状态为 MERGING
image.png
冲突产生的原因:
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替 我们决定使用哪一个。必须人为决定新代码内容。

解决冲突

编辑有冲突的文件,删除特殊符号,决定要使用的内容
特殊符号:<<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix
执行提交时注意:此时使用 git commit 命令时不能带文件名

Git 团队协作机制

团队内协作

image.png

跨团队协作

image.png

GitHub 操作

远程仓库操作

命令名称 作用
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程地址 起别名
git push 别名 分支 推送本地分支上的内容到远程仓库
git clone 远程地址 将远程仓库的内容克隆到本地
git pull 远程库地址别名 远程分支名 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并

创建远程仓库别名

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git remote -v
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git remote add ori https://github.com/atguiguyueyue/git-shTest.git
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git remote -v
ori https://github.com/atguiguyueyue/git-shTest.git (fetch)
ori https://github.com/atguiguyueyue/git-shTest.git (push)

推送本地分支到远程仓库

git push 别名 分支

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git push ori master
Logon failed, use ctrl+c to cancel basic credential prompt.
Username for 'https://github.com': atguiguyueyue
Counting objects: 3, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 276 bytes | 276.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/atguiguyueyue/git-shTest.git
* [new branch] master -> master

克隆远程仓库到本地

git clone 远程地址

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong
$ git clone https://github.com/atguiguyueyue/git-shTest.git
Cloning into 'git-shTest'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
--创建远程仓库别名
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest
(master)
$ git remote -v
origin https://github.com/atguiguyueyue/git-shTest.git (fetch)
origin https://github.com/atguiguyueyue/git-shTest.git (push)

小结:clone 会做如下操作。1、拉取代码。2、初始化本地仓库。3、创建别名

SSH 免密登录

image.png
操作如下

  • $ cd
  • $ rm -rvf .ssh
  • ssh-keygen -t rsa -C huanggh@baiyun.com
  • cd .ssh
  • ll -a
  • cat id_rsa.pub
    --进入当前用户的家目录
    Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
    $ cd
    --删除.ssh 目录
    Layne@LAPTOP-Layne MINGW64 ~
    $ rm -rvf .ssh
    removed '.ssh/known_hosts'
    removed directory '.ssh'
    --运行命令生成.ssh 秘钥目录[注意:这里-C 这个参数是大写的 C]
    Layne@LAPTOP-Layne MINGW64 ~
    $ ssh-keygen -t rsa -C atguiguyueyue@aliyun.com
    Generating public/private rsa key pair.
    Enter file in which to save the key (/c/Users/Layne/.ssh/id_rsa):
    Created directory '/c/Users/Layne/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /c/Users/Layne/.ssh/id_rsa.
    Your public key has been saved in /c/Users/Layne/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:7CPfRLITKcYDhaqpEDeok7Atvwh2reRmpxxOC6dkY44 
    atguiguyueyue@aliyun.com
    The key's randomart image is:
    +---[RSA 2048]----+
    | .. |
    | .. |
    | . .. |
    |+ + o . . |
    |oO . = S . |
    |X . .. + = |
    |+@ * .. = . |
    |X.&o+. o = |
    |Eo+Oo . . |
    +----[SHA256]-----+
    --进入.ssh 目录查看文件列表
    Layne@LAPTOP-Layne MINGW64 ~
    $ cd .ssh
    Layne@LAPTOP-Layne MINGW64 ~/.ssh
    $ ll -a
    total 21
    drwxr-xr-x 1 Layne 197609 0 11 月 25 19:27 ./
    drwxr-xr-x 1 Layne 197609 0 11 月 25 19:27 ../
    -rw-r--r-- 1 Layne 197609 1679 11 月 25 19:27 id_rsa
    -rw-r--r-- 1 Layne 197609 406 11 月 25 19:27 id_rsa.pub
    --查看 id_rsa.pub 文件内容
    Layne@LAPTOP-Layne MINGW64 ~/.ssh
    $ cat id_rsa.pub
    ssh-rsa 
    AAAAB3NzaC1yc2EAAAADAQABAAABAQDRXRsk9Ohtg1AXLltsuNRAGBsx3ypE1O1Rkdzpm
    l1woa6y6G62lZri3XtCH0F7GQvnMvQtPISJFXXWo+jFHZmqYQa/6kOIMv2sszcoj2Qtwl
    lGXTPn/4T2h/cHjSHfc+ks8OYP7OWOOefpOCbYY/7DWYrl89k7nQlfd+A1FV/vQmcsa1L
    P5ihqjpjms2CoUUen8kZHbjwHBAHQHWRE+Vc371MG/dwINvCi8n7ibI86o2k0dW0+8SL+
    svPV/Y0G9m+RAqgec8b9U6DcSSAMH5uq4UWfnAcUNagb/aJQLytrH0pLa8nMv3XdSGNNo
    AGBFeW2+K81XrmkP27FrLI6lDef atguiguyueyue@aliyun.com
    
    复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPG keys
    image.png
    image.png
    image.png
    接下来再往远程仓库 push 东西的时候使用 SSH 连接就不需要登录了