Git&GitHub

Git&GitHub

导图

版本控制工具应该具备的功能

  1. 协同修改:多人并行不悖的修改服务器端的同一个文件。

  2. 数据备份:不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。

  3. 版本管理 :在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。这方面 SVN 采用的是增量式管理的方式,而 Git 采取了文件系统快照的方式。

  4. 权限控制:对团队中参与开发的人员进行权限控制。 对团队外开发者贡献的代码进行审核——Git 独有。

  5. 历史记录:查看修改人、修改时间、修改内容、日志信息。将本地文件恢复到某一个历史状态。

  6. 分支管理:允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。

版本控制简介

版本控制

工程设计领域中使用版本控制管理工程蓝图的设计过程。在 IT 开发过程中也可以

使用版本控制思想管理代码的版本迭代。

版本控制工具

思想:版本控制

实现:版本控制工具

集中式版本控制工具:

CVS、SVN、VSS……

分布式版本控制工具:

Git、Mercurial、Bazaar、Darcs……

Git简介

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目

Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件

Git与常用的版本控制工具CVS、Subversion等不同,它采用分布式版本库的方法,不必服务器端软件支持

Git简史

官网地址:https://git-scm.com/

Logo:1570407506798

Git的优势

  1. 大部分操作在本地完成,不需要联网
  2. 完整性保证
  3. 尽可能添加数据而不是删除或修改数据
  4. 分支操作非常快捷流畅
  5. 与 Linux 命令全面兼容

Git安装

1570684988685

1570685030513

1570685076872

1570685099814

1570685142085

1570685167446

1570685189285

1570685212093

1570685232421

Git结构

工作区

就是你在电脑里能看到的目录(写的代码存在工作区)

暂存区

英文名叫stage,或index。一般存放在git目录下的index文件(.git/index)中,所以把暂存去有时候也叫做索引(index)(计划要提交的文件)

本地库(本地库)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库

Git和代码托管中心

代码托管中心的任务:维护远程库

局域网环境下

GitLab

外网环境下

GitHub https://github.com/

码云 https://gitee.com/

本地库和远程库

团队内部协作

跨团队协作

Git命令行操作

本地库初始化

命令:

1
git init

效果:

注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改

设置签名

在第一次使用git或者创建新的项目的时候要进行系统签名或者项目签名

形式:

​ 用户名:tom

​ Email地址:goodMorning@atguigu.com

作用:区分不同开发人员的身份

辨析:这里设置的签名和登陆远程库(代码托管中心)的账号、密码没有任何关系

命令:

  • 项目级别/仓库级别:仅在当前本地库范围内有效
1
2
git config user.name tom_pro
git config user.email goodMorning_pro@atguigu.com

信息保存的位置为:./.git/config文件

  • 系统用户级别:登录当前操作系统的用户范围
1
2
git config --global user.name tom_glb
git config --global goodMorning_pro@atguigu.com

信息保存位置为:~/.gitconfig文件

级别优先级:

​ 就近原则:项目级别优先于系统级别,二者都存在时采用项目级别的签名

​ 如果只有系统用户级别的签名,就以系统用户级别的签名为准

​ 二者都没有是不允许的

通常在开发的时候使用用户级别的签名就可以

基本操作

状态查看

查看工作区、暂存区状态

1
git status
第一次创建的状态

之后修改时的状态

1570690057888

提交到暂存区

写入一个文件good.txt

1
vim good.txt
1
2
将工作区的“新建/修改”添加到暂存区
git add [file name]
第一次创建的状态

之后修改时的状态

1570690342748

从暂存区中移除文件

只会从暂存区中删除,不会删除工作区中的文件

从暂存区提交到本地库

1
git commit 文件名 //次语句需要填写消息
1
git commit -m "commit message" [file name] //次语句直接在命令行中填写

进入消息填写页面

1570688561084

第一次创建的状态

这里的git staus与之前什么都没做的时候又不一样了

之后修改时的状态

1570690586809

查看历史记录

1
git log

多屏显示控制方式:

​ 空格 向下翻页

​ b 向上翻页

​ q 退出

1570691710201

git log –pretty=oneline

1570691937210

git log –oneline 只能显示过去的记录

1570692029609

git reflog 所有的记录都能显示,不管是过去还是未来 HEAD@{一动就到当前版本需要多少步}

1570692129203

前进后退

本质

基于索引值操作[推荐]

​ git reset –hard [局部索引值]

1570694142265

1570694186351

1570694218831

使用^符号:只能后退

​ git reset –hard HEAD^ 一个^后退一步,两个^后退两步,三个^后退三步

使用~符号:只能后退

​ git reset –hard HEAD~n 表示后退n步

注:git reset –hard HEAD 恢复成当前指针指向的位置

reset命令的三个参数对比

–soft参数

​ 仅仅在本地库移动HEAD指针

1570463977707

–mixed参数

​ 在本地库移动HEAD指针并重置暂存区

1570464098556

–hard参数

​ 在本地库移动HEAD指针并重置暂存区并重置工作区

删除文件并找回

删除操作

1
rm 文件名

​ 前提:删除前,文件存在时的状态提交到了本地库

​ 其实这个操作在本地库有一个确定的一个记录,来记录文件的删除,如果本地记录了,这条记录是永远不会被删除的,本地库的文件被删除,但是本地库的记录没有被删除

找回操作

1
git reset --hard [指针位置]

此时工作区已经没有该文件了

​ 删除操作已经提交到本地库:让指针位置指向历史记录的位置就可以,git reset –hard [哈希值]

​ 删除操作尚未提交到本地库:指针位置使用HEAD,git reset –hard HEAD

比较文件差异

1
git diff [文件名]

​ 将工作区中的文件和暂存区进行比较

更改文件内容

1570853582210

查看不同

1570853870692

1
git diff [本地库中历史版本] [文件名]

​ 将工作区中的文件和本地库历史记录进行比较

查看不同

1570854023115

分支管理

什么是分支

在版本控制过程中,使用多线条同时推进多个任务

1570505413305

分支的好处

同时并行推进多个功能开发,提高开发效率

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

何影响。失败的分支删除重新开始即可

分支操作

创建分支

​ git branch [分支名]

查看分支

​ git branch -v

切换分支

​ git checkout [分支名]

合并分支

​ 第一步:切换到接受修改的分支(被合并,被增加新内容)上

​ git checkout [被合并分支名]

​ 第二步:执行 merge 命令

​ git merge [有新内容分支名]

解决冲突

​ 产生冲突

1570861208766

​ 冲突的表现

1570859793985

​ 在文件中直接改成自己想要的格式就可以,可以删除其中的符号

​ 解决冲突

1570861507848

​ 和并成功

1570861730754

冲突的解决

​ 第一步:编辑文件,删除特殊符号

​ 第二步:把文件修改到满意的程度,保存退出

​ 第三步:git add [文件名]

​ 第四步:git commit -m “日志信息”

​ 注意:此时 commit 一定不能带具体文件名

Git的基本原理

哈希

1570511224288

哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下

几个共同点:

①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。

②哈希算法确定,输入数据确定,输出数据能够保证不变

③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大

④哈希算法不可逆

Git 底层采用的是 SHA-1 算法。

哈希算法可以被用来验证文件。原理如下图所示:

Git 就是靠这种机制来从根本上保证数据完整性的

Git保存版本的机制

集中式版本控制工具的文件管理机制

以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异

1570862839345

Git的文件管理机制

Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的 工作方式可以称之为快照流

1570862931191

Git文件管理机制细节

Git的“提交对象”

1570863024202

提交对象及其父对象形成的链条

1570863445593

Git分支管理机制

1570863523312

分支的切换

1570863572455

1570863628895

1570863647624

1570863668552

GitHub

创建远程库

1570865399917

1570865446340

创建远程库地址别名

1
2
3
git remote -v //查看当前所有远程地址别名 

git remote add [别名] [远程地址]

1570866556678

推送

必须先创建远程地址别名再推送才能创建新的分支

1
git push [别名] [分支名]

1570868253845

其他账号提交数据

1570951220992

1570951281808

克隆

1
git clone [远程地址]

1570931739942

1570931802304

效果

  1. 完整的把远程库下载到本地
  2. 创建origin远程地址别名
  3. 初始化本地库

团队成员的邀请

1570933079439

1570933116979

1570933193215

“岳不群”其他方式把邀请链接发送给“令狐冲”,“令狐冲”登录自己的 GitHub账号,访问邀请链接

1570933238437

1570933355608

拉取

是读操作,不需要验证身份

1
pull=fetch+merge

git fetch [远程库地址别名] [远程分支名] 只是把远程仓库的文件保存到本地,但没有修改本地文件

原本没有vvv.txt文件,使用fetch之后没有改变本地文件

1571017475874

git merge [远程库地址别名/远程分支名]

1571017753021

git pull [远程库地址别名] [远程分支名] 同样是只读操作,不需要登陆

1571020598406

注:

git中pull和clone的区别

clone 是本地没有 repository 时,将远程 repository 整个下载过来

pull 是本地有 repository 时,将远程 repository 里新的 commit 数据(如有的话)下载过来,并且与本地代码merge

note:git pull相当于git fetch和git merge

其意思是先从远程下载git项目里的文件,然后将文件与本地的分支进行merge

解决冲突

要点:

  1. A做了修改,并提交到远程库,但是此时B不知道版本已经更新,B还是在原来旧版本上进行修改,则此时github就不允许B再进行追踪了,B必须在最新的版本下修改才能进行追踪

    如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。

报此错误

1571032576147

  1. 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。

没有冲突的时候

1571032534839

有冲突的时候

1571032919064

1571033094536

跨团队协作

fork

fork开始

1571033587630

fork过程

1571033653499

fork之后

1571033713295

注意从东方不败自己的仓库中push下来

1571033890350

修改之后再推送到自己的github仓库之中

pull request

同样是东方不败自己的github仓库

1571034098078

1571034151483

1571034209202

此时需要发消息给岳不群

1571034229496

这里为岳不群的操作

1571034346667

1571034426956

对话

1571035376298

1571035397810

审核操作

岳不群的操作

1571035455939

合并操作

1571035486794

1571035509478

1571035530325

将远程仓库拉取到本地

SSH登录

只能为一个账号登陆

进入当前用户的家目录

$ cd ~

删除.ssh 目录

$ rm -rvf .ssh

运行命令生成.ssh 密钥目录

$ ssh-keygen -t rsa -C [邮箱账号]

[注意:这里-C 这个参数是大写的C]

进入.ssh 目录查看文件列表

$ cd .ssh

$ ls -lF

查看 id_rsa.pub 文件内容

$ cat id_rsa.pub

复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPG keys

New SSH Key

输入复制的密钥信息

回到 Git bash 创建远程地址别名

git remote add origin_ssh git@github.com:atguigu2018ybuq/huashan.git

推送文件进行测试

Git工作流

概念

在项目开发过程中使用 Git 的方式

分类

集中式工作流

像 SVN 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有修改都提交到 Master 这个分支上,这种方式与 SVN 的主要区别就是开发人员有本地库。Git 很多特性并没有用到

1570535485564

GitFlow工作流

Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构

1570536125659

Forking工作流

Forking 工作流是在 GitFlow 基础上,充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受 不信任贡献者的提交

1570536207752

GitFlow工作流详解

分支种类

主干分支 master

主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境

完全一致。

开发分支 develop

主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。

bug 修理分支 hotfix

主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修

理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。

准生产分支(预发布分支) release

较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集

成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后

可以视情况删除。

功能分支 feature

为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支

中独立出来。 开发完成后会合并到开发分支。

GitFlow工作流举例

1570536337856

项目经理:guoweixin github

Git-Idea

image-20200429230225964

IDEA-GIT插件

Idea默认集成Git

配置版本控制系统

git.exe文件存放的位置

image-20200429233831825

image-20200312130657340

创建项目与第一次提交

创建本地库

如果创建成功,则在所选择的项目的目录下有.git这个文件夹

没有提交的代码是红色的,提交后的代码是绿色的

选择Git之后再选择Add,代码变成绿色,此时代码进入暂存区

保存到暂存区后,右键项目点击Git,并Commit Directory,此时可以进入提交本地库页面

填写Commit Message信息,再进行提交,此时将代码提交到本地库

image-20200312132802625

显示出提交的版本

image-20200312132923085

第一次本地库push到远程库

创建github远程库

第一次提交项目到本地库的人员创建远程库

创建远程仓库,远程仓库的名字不一定与项目名称一样

image-20200312134348342

image-20200312134420311

idea中的项目名可以与github上起的项目名不同

将本地库的项目push到远程库

设置帐户信息

全局设置帐户信息或局部设置帐户信息

全局设置帐户信息

image-20200312172941160

局部设置帐户信息

image-20200312174043610

这里的origin名字可以随便起,地址是远程库的地址

image-20200312190455859

与远程库连接好之后,将本地库中的代码Push到远程库中

这里的origin就是之前配置Remote的别名

此时再输入用户名和密码

此时项目推送成功

image-20200312182231818

之后的开发人员从远程库Clone项目

所要克隆下来的项目

image-20200430090357941

将项目TestGit2克隆下来

image-20200430101800516

克隆的时候登不登账号都可以,从网上push的时候才需要登录账号

image-20200430102056078

对克隆下的项目进行更改,此时修改的文件的颜色就会发生改变

image-20200430103001000

第二次进行提交

首先进行Add操作,将新修改文件添加到缓存区

image-20200430103337043

之后Commit,将文件添加到本地库

image-20200430104155924

image-20200430104821464

提交成功

image-20200430104917393

文章目录
  1. 1. 导图
  2. 2. 版本控制工具应该具备的功能
  3. 3. 版本控制简介
    1. 3.1. 版本控制
    2. 3.2. 版本控制工具
      1. 3.2.1. 集中式版本控制工具:
      2. 3.2.2. 分布式版本控制工具:
  4. 4. Git简介
    1. 4.1. Git简史
    2. 4.2. Git官网和Logo
    3. 4.3. Git的优势
    4. 4.4. Git安装
    5. 4.5. Git结构
    6. 4.6. Git和代码托管中心
      1. 4.6.1. 局域网环境下
      2. 4.6.2. 外网环境下
    7. 4.7. 本地库和远程库
      1. 4.7.1. 团队内部协作
      2. 4.7.2. 跨团队协作
  5. 5. Git命令行操作
    1. 5.1. 本地库初始化
    2. 5.2. 设置签名
    3. 5.3. 基本操作
      1. 5.3.1. 状态查看
        1. 5.3.1.1. 第一次创建的状态
        2. 5.3.1.2. 之后修改时的状态
      2. 5.3.2. 提交到暂存区
        1. 5.3.2.1. 第一次创建的状态
        2. 5.3.2.2. 之后修改时的状态
      3. 5.3.3. 从暂存区中移除文件
      4. 5.3.4. 从暂存区提交到本地库
        1. 5.3.4.1. 第一次创建的状态
        2. 5.3.4.2. 之后修改时的状态
      5. 5.3.5.
      6. 5.3.6. 查看历史记录
      7. 5.3.7. 前进后退
        1. 5.3.7.1. reset命令的三个参数对比
      8. 5.3.8. 删除文件并找回
      9. 5.3.9. 比较文件差异
    4. 5.4. 分支管理
      1. 5.4.1. 什么是分支
      2. 5.4.2. 分支的好处
      3. 5.4.3. 分支操作
        1. 5.4.3.1. 创建分支
        2. 5.4.3.2. 查看分支
        3. 5.4.3.3. 切换分支
        4. 5.4.3.4. 合并分支
        5. 5.4.3.5. 解决冲突
        6. 5.4.3.6. 冲突的解决
  6. 6. Git的基本原理
    1. 6.1. 哈希
    2. 6.2. Git保存版本的机制
      1. 6.2.1. 集中式版本控制工具的文件管理机制
      2. 6.2.2. Git的文件管理机制
      3. 6.2.3. Git文件管理机制细节
      4. 6.2.4. Git分支管理机制
      5. 6.2.5. 分支的切换
  7. 7. GitHub
    1. 7.1. 创建远程库
    2. 7.2. 创建远程库地址别名
    3. 7.3. 推送
    4. 7.4. 克隆
  8. 8. 团队成员的邀请
    1. 8.1. 拉取
    2. 8.2. 解决冲突
      1. 8.2.1. 要点:
      2. 8.2.2. 没有冲突的时候
      3. 8.2.3. 有冲突的时候
  9. 9. 跨团队协作
    1. 9.1. fork
    2. 9.2. pull request
    3. 9.3. 对话
    4. 9.4. 审核操作
    5. 9.5. 合并操作
  10. 10. SSH登录
    1. 10.1. 进入当前用户的家目录
    2. 10.2. 删除.ssh 目录
    3. 10.3. 运行命令生成.ssh 密钥目录
    4. 10.4. 进入.ssh 目录查看文件列表
    5. 10.5. 查看 id_rsa.pub 文件内容
  11. 11. Git工作流
    1. 11.1. 概念
    2. 11.2. 分类
      1. 11.2.1. 集中式工作流
      2. 11.2.2. GitFlow工作流
      3. 11.2.3. Forking工作流
    3. 11.3. GitFlow工作流详解
      1. 11.3.1. 分支种类
      2. 11.3.2. GitFlow工作流举例
  12. 12. Git-Idea
    1. 12.1. IDEA-GIT插件
    2. 12.2. 配置版本控制系统
    3. 12.3. 创建项目与第一次提交
    4. 12.4. 第一次本地库push到远程库
      1. 12.4.1. 创建github远程库
      2. 12.4.2. 将本地库的项目push到远程库
        1. 12.4.2.1. 设置帐户信息
    5. 12.5. 之后的开发人员从远程库Clone项目
    6. 12.6. 第二次进行提交
|