Git和GitHub

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

  • 协同修改
    • 多人并行不悖的修改服务端的同一个文件
  • 数据备份
    • 保存每一提交的历史状态
  • 版本管理
    • git采取文件系统快照
  • 权限控制
    • 团队外贡献代码进行审核
  • 历史记录
    • 可以把本地文件回复到某一个历史状态
  • 分支管理
    • 允许开发团队在工作过程中多条生产线同时推进任务。

2.Git的优势

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

3.Git在本地的结构

  • 本地库
    • 历史版本存储的地方
  • 暂存区
    • 临时存储
  • 工作区
    • 写代码
    • 新建修改文件

工作流程

工作区–>git add–> 暂存区–>git commit –>本地库

4.Git和代码托管中心

  • 局域网环境下
    • GitLab服务器
  • 外网环境下
    • GitHub
    • 码云

4.1 代码托管中心的任务

  • 维护远程库

5 本地库和远程库的交互方式

  • 团队内部协作
  • 跨团队合作

5.1团队内部协作

  • 本地库1(初始创建人)
    • 代码开始在本地
    • 本地库1使用push命令,把本地文件推到远程库
    • 在本地库2把demo提交上去以后,本地库1可以使用pull命令把代码拉取下载下来
  • 本地库2
    • 本地库2本来为空
    • 对远程库使用clone命令,把远程项目克隆到自己的本地库
      • 这个clone是有初始化作用的
      • clone命令,是只用从远程库把所有代码都复制下来的时候才使用
    • 本地库2在本地写好代码后,要把更新内容同步到远程库
      • 先加入本地库1的团队
      • 然后使用push命令把内容传递到远程库
  • 远程库(代码托管中心)

5.2 跨团队协作

A和B为一个团队,C不属于AB的团队,但是C要协助AB完成项目怎么办?

  • A使用fork命令,复制一份内容,这个内容是属于C的
  • C使用clone把文件克隆到本地
  • C完成代码以先把文件push到fork过来的远程库内
  • 然后使用pull request命令,向A发起拉去请求
  • A检查完C的代码以后,使用merge命令,将C提供的代码合并到AB的远程库内

6.Git命令行操作

  • 本地库操作
  • 远程库操作

6.1 本地库操作

6.1.1 本地库初始化

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

6.1.2 设置签名

  • 形式
    • 用户名:tom
    • Emali地址:goodMorning@qq.com
  • 作用:区分不同开发人员的身份
  • 辨析:这里设置的签明和登录远程库(代码托管中心)的账号、密码没有任何关系
  • 命令:
    • 项目级别/仓库级别:仅在当前本地库范围内有效
      • 比如WeChat这个项目内有效
      • git config
      • git config user.email goodMorning_pro@qq.com
    • 系统用户级别:登录当前操作系统 的用户范围
      • git config –global
      • git config --global user.email goodMorning_pro@qq.com
    • 优先级别
      • 就近原则:【项目级别】>【系统用户级别】
      • 两个起码得有一个,不能二者都没有
  • 项目级别签名保存位置:cat ./git/config
    • 当前项目下的./get/config这个文件
  • 系统级别签明保存位置:~/.gitconfig

6.1.3 添加提交以及查看状态操作

  • git status:看看暂存工作区、暂存区的状态
  • git add good.txt:把工作区的good.txt这个文件添加到暂存区
    • 注意:新建文件必须使用add添加
  • git rm --cached good.txt:把good.txt这个文件从暂存区移出来
  • git commit good.txt:把暂存区good.txt这个文件提交到本地库
  • git commit -m "commit message" [file name]:提交操作,提交信息为commit message

6.1.4 实现版本的前进和后退

6.1.4.1 查看历史版本记录
  • git log:最完整的版本形式形式
    • 空格向下翻页
    • b向下翻页
    • q推出
  • git log --pretty=oneline:简洁地显示方式
  • git log --oneline:更简洁地显示方式,简化了哈希值
  • :在oneline的基础上,显示移动到当前的版本需要多少步git reflog

6.1.4.2 前进后退历史版本操作和本质

本质:移动head指针,head指针指向哈希值

**操作:**

  • 基于索引值的操作
  • git reset --hard [这里写局部的索引值]
    • 举例:git reset —hard 4ea7816
  • 使用^(异或符号):
    • 只能后退,不能往前(不能去新版本)
    • git reset --hard HEAD^
      • HEAD后面有几个==^==就往后退几个版本
  • 使用~n符号
    • 代表要后退n个版本
    • git reset --hard HEAD~3

reset命令的三个参数对比

  • —soft参数
    • 仅仅在本地库移动指针
  • —mixed 参数(凸显工作区)
    • 在本地库移动HEAD指针
    • 重置暂存区(移动暂存区)
  • —hard参数(三个区域同时移动)
    • 在本地库移动HEAD指针
    • 重置暂存区
    • 重置工作区

6.1.5 永久删除文件及已删除文件的召回

注意:这里的删除指的是从本地库删除

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

召回:直接跳转到没有被删除的版本就可以了

  • git reset —hard [指针位置]
    • 删除记录已经提交到本地库:指针位置指向历史记录(还未删除前的记录)
    • 删除操作记录没有提交到本地库:指针位置用HEAD

6.1.6 比较文件的差异

git diff [文件名]

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

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

  • 将工作区中的文件和本地历史记录笔记哦阿

不带文件名的命令

  • 比较当前工作区域中的所有文件

6.2 分支概述

6.2.1 什么是分支

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

6.2.2 分支的好处

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

6.2.3 分支操作

  • 创建分支:
    • git branch [分支名]
  • 查看分支:
    • git branch -v
  • 切换分支:
    • git checkout [分支名]
  • 合并分支:
    • 第一步:切换到接受修改的分支(那个分支要被修改被合并,就切换到那个上面)
      • git checkout [分支名]
    • 第二步:执行merge命令
      • git merge [分支名]
      • 注意,这个分支名,不是刚才切换过来现在所在分支。而是现在这个分支所想要合并的分支。
  • 产生冲突怎么解决?

  • 什么叫做冲突?

    • 不同分支对同一个文件进行了修改,在合并分支的时候会产生冲突,不能合并
  • 解决冲突

    • 第一步:编辑文件,删除特殊符号
    • 第二步:把文件修改到满意的程度,并保存退出
    • 第三步:git add [文件名]
    • 第四步:git commit “日志信息”
      • 注意:使用commit提交是,后面没有文件名,没有文件名

        6.3 远程库操作

  • get clone url:从git服务器拉取代码

  • get push:将本地库代码推送到服务器上
  • get pull origin 文件路径:从服务器上拉取最新的代码