2020年6月25日星期四

Git版本控制

Git&GitHub

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

  • 协同修改
    • 多人并行不悖的修改服务器端的同一个文件
  • 数据备份
    • 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态
  • 版本管理
    • 在保存每一个版本的文件信息的时候要做到不包吃重复数据,以节约存储空间,提高运行效率。
    • 这方面SVN采用的是销量式管理的方式,而Git采取了文件系统快照的方式。
  • 权限控制
    • 对团队中参与开发的人员进行权限控制
    • 对团队外开发者贡献的代码进行审核——Git独有。
  • 历史记录
    • 查看修改人 、修改时间、修改内容、日志信息。
    • 将本地恢复到某一个历史状态。
  • 分支管理
    • 允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。

2. 版本控制简介

  • 版本控制

    • 工程设计领域中石油版本控制管理工程蓝图的设计过程。在IT开发过程中也可以使用版本控制思想管理代码的版本迭代。
  • 版本控制工具

    ​ 思想:版本控制

    ​ 实现:版本控制工具

    • 集中式版本控制工具:CVS、SVN、VSS······

    • 分布式版本控制工具:Git、Mercurial、Bazaar、Darcs······

3. Git

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

3.1Git简史

3.2 Git的优势

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

3.3 Git安装

3.4 Git结构

3.5 Git和代码托管中心

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

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

3.6 本地库和远程库

  • 团队内部协作

  • 跨团队协作

4. Git命令行操作

4.1 本地库初始化 git init

  • 命令:git init

  • 效果:

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

4.2 设置签名 git config

  • 形式:用户名:Tom email地址:xxxxxxxxxxx@xxxx.com
  • 作用:区分不同开发人员的身份
  • 注意:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系。
  • 命令:
    • 项目级别/仓库级别:仅在当前本地库范围内有效

      • git config user.name xxxx
      • git config user.email xxxx
      • 信息保存位置: .git/config
    • 系统用户级别:登录当前操作系统的用户

      • git config --global user.name xxxx
      • git config --global user.email xxxx
      • 信息保存位置 ~/.gitconfig
    • 级别优先级:

      • 就近原则:项目级别优先于系统用户级别:二者都有时采用项目级别的签名
      • 如果只有系统用户级别的签名,就以系统用户级别的签名为准
      • 二者都没有不允许

4.3 基本操作

1.状态查看:git status

​ 查看工作区、暂存区状态

2.添加操作:git add [file name]

​ 将工作区的"新建/修改"添加到到暂存区

3.提交操作:git commit -m "commit message" [file name]

​ 将暂存区的内容提交到本地库

4.查看历史记录: git reflog

  • git log 显示每个版本的全部信息

    • 多屏显示控制方式:
      • 空格向下翻页
      • b 向上翻页
      • q 退出
  • git log --pretty=oneline 每条记录在一行显示

  • git log --oneline 每条记录在一行显示同时hash值只显示一部分(只显示当前版本之前的版本)

  • git reflog HEAD@{n} 移动到当前版本需要移动n步

5.前进后退 git reset --hard

  • 本质
  • 基于索引值操作[推荐]
    • git reset --hard [局部索引值(hash值)]
  • 使用^符号:只能后退
    • git reset --hard HEAD^
    • 注:一个^表示后退一步,n个后退n步
  • 使用~符号:只能后退
    • git reset --hard HEAD~n
    • 注:表示后退n步

6.reset命令的三个参数对比

  • --soft参数
    • 仅仅在本地库移动HEAD指针
  • --mixed参数
    • 在本地库移动HEAD指针
    • 重置暂存区
  • --hard参数
    • 在本地库移动HEAD指针
    • 重置暂存器
    • 重置工作区

7.删除文件并找回

  • 前提:删除前,文件存在时的状态提交到了本地库
  • 操作:git reset --hard[指针位置]
    • 删除操作已经提交到本地库:指针位置指向历史记录
    • 删除操作尚未提交到本地库:指针位置使用 HEAD

8. 比较文件差异 git diff [文件名]

  • git diff [文件名]
    • 将工作区中的文件和暂存区进行比较
    • 注:Git操作的是行,所以修改的内容是先删除 后增加
  • git diff [本地库中历史版本] [文件名]
    • 将工作区中的文件和本地库历史记录比较

9. 查看历史命令 history

4.4分支管理

  • 什么是分支?
    • 在版本控制过程中,使用多条线同时推进多个任务
  • 分支的好处
    • 同时并行推进多个功能的开发,提高开发效率。
    • 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可。

分支操作

  • 创建分支

    git branch [分支名]

  • 查看分支

    git branch -v

  • 切换分支

    git checkout [分支名]

  • 合并分支

    • 1.切换到接受修改的分支上(被合并,增加新内容)
      • git checkout [分支名]
    • 2.执行merge命令
      • git merge [要被合并的分支名]
  • 解决冲突

    • 冲突的表现

    • 冲突的解决

      1. 编辑文件,删除特殊符号
      2. 把文件修改都满意的程度,保存退出
      3. git add [文件名]
      4. git commit -m "日志信息"
        • 注:此时commit一定不能带具体文件名

5. 连接GitHub/码云

GitHub: https://github.com/

码云: https://gitee.com/

5.1 创建SSH Key

在Git命令行中输入:

ssh-keygen -t rsa -C "码云账号"
  • 在C:\Users\用户\下会生成一个.ssh的文件夹,.ssh内id_rsa是私钥,id_rsa.pub是公钥

  • 登录码云,个人主页/个人设置/安全设置/SSH公钥

  • 本地测试连接远程库是否成功

    ssh-T git@github.com ssh-T git@git.com

5.2 创建远程库

  • 个人主页/个人设置/数据管理/仓库空间信息/新建仓库

5.3 在本地创建远程库的别名

  • 为什么?

    1. 远程库的链接很长,使用不方便

    2. 每次都要登录去复制

  • 命令:

    git remote add origin [远程库url]

    • 注:origin 是远程库在本地的别名(也可以是其他的)
  • 查看远程库:

    git remote -v

  • 删除已有的远程库

    git remote rm origin

5.4 推送

  • 命令:

    git push origin master

    注1:origin是要推送的远程库

    注2:master推送的分支

5.5 克隆

  • 命令:

    git clone [远程库地址]

  • 效果:

    • 完整的把远程库下载到本地

    • 创建origin远程库地址别名

    • 初始化本地库

5.6 远程库拉取/更新本地库

  • pull = fetch+merge
  • git fetch [远程库别名] [远程分支名]
  • git merge [远程库别名] [远程分支名]
  • git pull [远程库别名] [远程分支名]

5.7 解决冲突

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

  • 远程库为非空仓库时,默认时一个新项目,和本地库时两个不同的项目,不能直接推送

  • 解决:

    1. 先从远程库克隆岛本地,再修改。

    2. 拉取远程库代码,再合并为一个库

      • 关联远程库

        git remote add origin [远程库url]

      • 拉取远程库代码到本地,并自动合并到本地库

        git pull origin master --allow-unrelated-histories

      • 推送

        git push -u origin master

    3. 强制推送到远程库(不推荐,容易覆盖远程库原先的内容)

      git push -f origin master

6. 使用Github/Gitee协同开发

协同开发流程:

  1. 项目经理上传初始化的框架到远程仓库

    • github/gitee 远程库添加SSH帐号

      ssh-keygen -t rsa -C '远程库账号'

    • 本地项目初始化框架上传到服务器

    • 服务器新建空项目

    • 修改维护本地项目框架

    • 和远程服务器建立连接

    • 提交到远程服务器

  2. Fork项目到自己git库

  3. 本地克隆/下载项目 维护修改

  4. 工作完成后,发从合并请求给项目经理

  5. 项目经理审核,是否合并并代码!

Git版本控制

没有评论:

发表评论