Git版本控制

Git&GitHub

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

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

2. 版本控制简介

  • 版本控制python

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

    ​ 思想:版本控制github

    ​ 实现:版本控制工具安全

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

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

3. Git

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

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. 项目经理审核,是否合并并代码!