Git

Git介绍

版本管理的必要性

什么是版本管理?需要把历史信息进行备份,每次备份一个版本。

  • 记录代码的历史版本
  • 方便多人协作开发(多个程序员做同样的项目),方便代码的自动化合并

版本管理工具演进

  • 本地模式,不方便团队协作
  • 集中式(Svn),服务器如果出问题,就无法工作了(有安全问题)
  • 分布式(Git),既方便团队协作也比较安全

版本管理环境安装配置

Git客户端安装

  • 官方下载地址
  • Git-2.26.1-64-bit.exe
    • 双击,然后一直下一步即可完成安装
  • 安装成功后,在桌面右键,如果看到如下效果,证明安装成功

image.png

配置用户信息

为何需要配置用户信息?需要确定代码是谁写的

  • git config
    • 查看配置信息
      • git config —list
    • 配置用户进行信息
  1. # --global 会将配置项保存到用户配置(提交代码需要用到这些信息)
  2. git config --global user.name "xxx"
  3. git config --global user.email "xxx"

总结:

  1. 为何需要配置用户信息?git工具需要知道代码是谁写的
  2. 需要配置用户名和邮箱

Git初体验

  • 初始化本地仓库
  1. git init
  • 将文件添加到暂存区(临时存放代码的位置)
    • 一般代码做完一部分就添加一次
  1. # 把项目中所有的文件纳入git的管理
  2. git add .
  • 提交暂存区代码到本地仓库(正式存放的位置)
    • 一般是完成的阶段性任务可以提交一次
  1. git commit -m '初始化版本'
  • 查看当前仓库中所有文件的状态
  1. git status
  • 查看提交的历史版本
  1. git log

总结

  1. 对于新创建的项目,需要执行git init初始化代码仓库
  2. 提交代码的版本需要2步
    1. git add .
    2. git commit -m ‘备注’
  3. git status 查看当前文件的状态
  4. git log 查询历史版本

核心概念分析

三个区域

  • 工作目录:放置代码的项目跟目录。
    • 工作目录中新建的文件没有被git管理
  • 暂存区:临时管理代码的区域(尚未完成的功能代码一般添加到这里)。
    • 只要代码添加到暂存区,那么就被git管理起来
  • 本地仓库:管理正式的代码的版本信息。
    • 阶段性完成的小功能可以提交到本地仓库

image.png

文件四个状态

  • 未跟踪,新建的文件(红色的),没有被git管理
  • 已暂存,添加到暂存区的文件(绿色的文件),已经被git管理,下一步需要被提交
  • 已提交,本地仓库中的文件
  • 已修改,暂存区的代码被修改了(代码在工作目录)(红色的)

相关命令补充用法

git add

  • git add .
    • 添加所有文件到暂存区
  • git add 文件列表 (多个文件名称之间用空格隔开)
    • git add a.txt b.txt
  • git add * 添加除 【.开头的文件】 之外的所有文件

git commit

需求:熟悉快速提交的用法(省略git add步骤直接提交)

  • git commit -am ‘备注’

注意:这样做有一个前提条件:不可以包含新建的文件(新建的文件无法用这种方式提交) 如果有新建的文件,必须先git add 在 git commit

远程仓库

远程仓库介绍

本地仓库的代码上传到远程仓库,可以方便同事之间共享代码 公司内部一般有自己的远程仓库,但是学习阶段,可以借助公开一些远程仓库测试。

注册远程仓库账号

这些远程仓库都需要先注册账号才能使用(support@github.com;noreply@github.com)

创建远程仓库

  • 使用注册号的账号登录远程仓库平台
  • 点击右上角的 + ,然后选择新建仓库
  • 在打开的界面中输入仓库名称(不能重复),其他选项默认
  • 然后点击底部的创建按钮
  • 跳转到一个新的页面,如下所示

image.png

  • 推送本地代码到远程仓库步骤
  1. 添加远程仓库地址的别名
  1. git remote add origin git@gitee.com:wzj1031/mydemo-128.git
  1. 把本地仓库的代码推送过去
  1. git push -u origin master

注意:如果第一次推送时添加-u,那么以后推送可以简化为 git push 如果第一次没有添加-u,那么每次推送需要 git push origin master

image.png

配置用户权限

  • 熟悉ssh验证流程

image.png

  • 执行如下命令,生成公钥和私钥对
  1. # ssh-keygen -t rsa -C '你的邮箱地址'
  2. ssh-keygen -t rsa -C "wangzijie1031@qq.com"

image.png

image.png

  • 把公钥提供给远程仓库
    • 右上角图标 —-> 设置

image.png

  • 把公钥文件(id_rsa.pub)里面文本内容直接填充表单,然后确定即可

推送本地代码到远程仓库

  • 创建远程仓库的别名
  1. # git remote add 别名 远程仓库地址
  2. git remote add origin git@github.com:byte0/mydemo.git
  3. # 上传本地代码到远程仓库, 第一次上传代码建议添加 -u ,作用是把本地仓库和远程仓库关联,关联之后后续推动代码比较方便
  4. # 第一次推送代码会提示yes/no? 需要输入yes
  5. git push -u origin master
  6. # 后续上传代码可以进行如下简化
  7. git push
  • 出现如下图示表示上传本地仓库代码到远程仓库成功了

image.png

把本地仓库的代码推送到远程仓库

  • 本地仓库需要先commit代码然后才可以推送到远程
  • 给远程仓库的地址起一个别名
  1. # 添加别名
  2. git remote add origin git@gitee.com:wzj1031/mydemo.git
  3. # 修改别名(把origin修改为abc)
  4. # git remote rename 原来的别名 新的别名
  5. git remote rename origin abc
  6. # 删除别名
  7. git remote remove origin
  8. # 查看别名
  9. git remote -v
  • 根据别名把本地仓库代码推送到远程
    • -u 的作用:把本地仓库和远程仓库建立关联,后续再推送可以简化 git push
  1. git push -u origin master
  2. git push

克隆远程仓库代码到本地

  • 新员工得到代码的方式
    • git clone 一般是第一次获取代码需要
  1. # 克隆代码(把远程仓库的代码完整的复制一份到本地)
  2. # git clone 远程仓库地址
  3. git clone git@github.com:byte0/mydemo.git
  • 已经克隆下来的项目代码需要更新最新代码
    • 每次更新代码使用 git pull
  1. # 更新远程仓库最新代码
  2. git pull origin master
  3. # 简写如下
  4. git pull
  • 每次推送代码使用git push
  1. git push origin master
  2. git push

image.png

  • 关于别名的操作

基于码云的团队协作配置方式

  • 在项目右上角【管理】—-> 【仓库成员管理】—-> 【所有】

image.png

  • 点击右上角【添加仓库成员】
  • 选择【直接添加】
  • 输入组员的账号名称(或者邮箱)
  • 点击确定

团队仓库配置

  • 组长:创建码云远程仓库 zuoye115-zhangsan
    • 创建仓库
    • 配置组员的读写权限
  • 团队作业协作模式
    • 组长创建项目然后把git地址发给组员(不用发,配置权限后自动就有)
    • 组员通过这个地址克隆仓库代码
    • 组员在这个仓库里面添加作业文件
    • 然后git add
    • 然后git commit
    • 推动代码
      • git push -u origin master
    • 后续再推代码直接git push

问题

  • 别人已经提前推送了代码,我们再推的时候会出现如下问题,要想推上去,需要先git pull,然后再git push

image.png

  • 但是在git pull的时候可能会出现如下问题

image.png

关于代码合并的冲突问题

  • 代码冲突的原因是什么?
    • 不同的程序员修改了相同文件的相同行号的代码(冲突效果如下所示)

image.png

  • 冲突后,git会对有冲突的代码进行标注

image.png

  • 如何解决冲突?需要自己手动解决冲突(原则:保证双方的功能代码都正常)
    • 双方代码谁的是合理的由需求决定
    • 一旦出现了冲突就不要继续写代码了,要先解决冲突,然后提交,然后推送到远程
    • 然后再继续开发。

回滚(撤销)操作

把暂存区文件再撤销到工作目录

  • git add 的逆操作 (暂存区 -> 工作目录)
    • 把暂存区中的文件移除到工作目录(这些被移除的文件不再被git管理,可以删除)
  1. # 方法一:git restore --staged 文件列表
  2. git restore --staged a.js b.js
  3. # 方法二:git rm --cached 文件列表
  4. git rm --cached a.js b.js
  5. # 如果希望把文件从暂存区撤销到工作目录并且删除工作目录的文件,可以执行如下命令
  6. git rm a.js # 已经提交的代码可以直接删除
  7. git rm -f a.js # 添加到了暂存区,但是没有commit,代码需要添加 -f 强制删除

撤销代码的修改

今天去上班,接到一个新的任务,花费了一个上午完成了60%(修改了10个文件),中午吃晚饭,回来接着做,刚坐到工位,突然想到思路错了,此时应该如何是好?撤销所有的修改

  • 如何撤销所有的修改?
    • 本质上就是用暂存区修改前的代码覆盖当前工作目录的代码
  1. # 该命令执行时,一定要慎重的考虑好(撤销后,无法再找回)
  2. git checkout .

把本地仓库的代码撤销掉

下班前,领导要求提交代码,测试部门需要进行功能测试,你刚提交完成代码,自己就发了一个bug,此时如何是好?这个时候需要把代码回滚,然后重新去做。做完之后再提交。

  1. # git reset --hard commitID
  2. # 回滚到指定的版本(用指定版本的代码覆盖工作目录和暂存区)
  3. git reset --hard 615da1d
  • 查看历史版本的简化方式
  1. git log --oneline
  • 工作目录和暂存区新添加和修改的所有代码都不要了
    • 用当前本地仓库的最新代码覆盖工作目录和暂存区
  1. git reset --hard HEAD
  • 回滚时保留工作目录和暂存区
  1. git reset --soft commitID
  • 混滚时保留工作目录但是不保留暂存区(—mixed是默认选项)
  1. git reset --mixed commitID
  2. git reset commitID
命令 工作目录 暂存区 本地仓库
—hard 覆盖 覆盖 回滚(撤销)
—mixed 不覆盖 覆盖 回滚(撤销)
—soft 不覆盖 不覆盖 回滚(撤销)

分支管理

分支概念分析

分支:把代码复制一份新的就是一个新的分支(分支就是某一个版本代码的复制品)

image.png

  • 一个分支一般用于处理不同的任务(特性分支)
  • 测试项目时一般会以某一个分支为基准进行测试(测试分支)
  • 有时代码出现了bug,此时可以创建一个单独的分支来修复bug(bug修复分支fix)

    查看当前所有本地分支

  1. git branch

image.png

创建分支

  1. # git branch 分支名称
  2. git branch test
  • 创建分支时是以当前分支最后一个版本为基准
  • 创建出来的分支是一份独立的代码

切换分支

  1. # git checkout 分支名称
  2. git checkout test
  • 切换分支后,当前工作目录中看到的代码就是新切换的分支的代码
  • 切换分支时,需要先提交代码 git commit

合并分支

  1. # git merge 分支名(来源分支)
  2. git merge test
  • 分支的合并需要:从当前分支把另外一个分支(来源分支)合并过来

image.png

删除分支

  1. # git branch -d/-D 分支名称
  2. # 如果test分支已经被合并了,那么才可以删除,否则无法删除
  3. git branch -d test
  4. # 强制删除分支,无论合并与否都会删除
  5. git branch -D test

创建并切换分支

  • 创建分支 git branch 分支名称
  • 切换分支 git checkout 分支名称
  • 创建并切换分支
  1. # git checkout -b 分支名称
  2. git checkout -b abc

image.png

合并分支时可能冲突

冲突产生的原因:不同分支的相同文件的相同位置的代码都做了修改

  • 合并分支之前,当前分支的代码需要先提交

image.png

  • 合并冲突的效果

image.png

  • 冲突代码效果

image.png

  • 一旦产生冲突,必须程序员自己解决,解决的原则是:保证两个分支的代码都合理
    • 你的都对
    • 他的都对
    • 两者各有一部分对

image.png