昨日回顾

# 1 git:版本管理,代码管理的软件,安装
# 2 git,github,gitee,gitlab,。。。。
# 3 git工作流程:工作区,暂存区,版本库
    -git init
    -git status # 绿的和红色和白色
    -git add 文件名
    -git commit -m '注释'
    -git reset --hard 版本号
    -git log
    -git reflog
# 4 git忽略问题
    -仓库根目录 .gitignore
    -配置目录   目录名
    -配置文件   文件名
    -配置根目录下的某个文件或文件名 /xx  /xx.txt
    -模糊匹配   /*a*
    -问题:
        -最开始没有忽略,提交到版本库管理了,再写忽略,它也会被管理
        -一定保证版本库中没有这个文件,再写忽略
# 5 分支:多分支开发
    -master,dev,bug
    -创建分支:git branch dev
    -切换分支:git checkout dev
    -删除分支:git branch -d dev
    -合并分支:git merge dev  # 可能有冲突
    -查看分支:git branch
    
    
# 6 远程仓库
    -本地使用,只能做版本管理,无法协同开发
    -把代码都提交到远程仓库:github,gitee,gitlab。。。。
    -gitee 注册,新建仓库,空的
    -把本地仓库代码提交到远程仓库
        -git init
        -git add .
        -git commit -m '注释'
        -git remote add origin 远程地址(https,ssh) 
        -git pull origin master
        -git push origin master
        
# 7 ssh的配置
    -先生成公钥私钥 
    -公钥配置再我们【账号】的ssh配置中,本地有私钥,可以安全通信
    -删除原来的origin的远程关联关系
    -增加成ssh的
# 8 路飞项目提交到远程仓库


'''
	svn没有远程服务器无法工作。git可以在本地工作。svn本地没有版本库,git本地有版本库
	.git文件存放着所有版本信息
'''	

1 git多分支开发

# 为什么要有分支
    -可以保证,主分支的版本都是可以查看的版本
    -我们都在开发分支开发,开发完成,合并到主分支
   

# 分支操作
    -查看分支:
    	git branch  # * 和绿色表示你当前所在的分支,查看本地分支
	-创建
    	-git branch dev
    -切换分支
    	 - git checkout dev
    -删除分支
    	-git branch -d dev  # 在其他分支上才能删它
    -合并分支:【可能会有冲突】
        - 要把dev合并到master上
        - 先来到master分支:git branch checkout master
        - 执行合并命令:git merge dev   # 把dev合并到我(master)身上
        # 分支合并可能会出冲突
            
            
            
   -查看远程分支:【后面会讲】
    git branch -a

image-20230302090606165

给客户看主分支的代码,主分支只有实现的功能。复制代码新开一个分支用于开发,当开发分支完成需求,就将开发分支和主分支合并。

image-20230302091048724

分支操作

image-20230302091136307

星号表示在这个分支上,当前只有master这个主分支。

创建分支:

image-20230302091217842

切换分支:

image-20230302091306773

主分支还有文件没有管理。

分支删除:

image-20230302091405839

当前所在的分支,是不能删除的。要切换到别的分支再删除。

合并分支

image-20230302091652952

不在主分支开发,最后再合并到主分支。

切换分支:

image-20230302091850137

新建:

image-20230302092022899

查看:

image-20230302092048488

dev分支提交:

再新建一个文件添加点数据:

image-20230302092159169

切换回主分支:

image-20230302092321303

在dev新建的文件被隐藏到.git

合并分支:
先来到要合并进去的分支,我们这里的例子是master分支。

image-20230302092509421

合并分支:
主分支和子分支修改了同一行代码,会出现冲突。

公司:
主分支 开发分支 bug分支

每个人拉一个 个人分支(相当于复制一份代码) --合并-> dev分支
谁提交的慢就会出冲突。

2 git远程仓库

# 把本地的版本提交到远程仓库
# gitee,github,gitlab。。。。
# gitlab的搭建过程:https://zhuanlan.zhihu.com/p/413217715

# 讲课以 gitee作为远程仓库


# luffy_api 写好了一部分功能,要把代码提交到远程仓库

# 操作步骤:
    本地:
        1 在luffy_api 敲git init
        2 设置忽略文件(.gitignore)
        3 git add .
        4 git commit -m '第一次提交'
        ------提交到了本地版本库-------被版本管理了
    
    远程:
        1 远程要创建仓库:gitee上创建仓库,右上角 +
        2 填一些信息,保证仓库是空的
    本地:
        1 安装远端提示的步骤操作
        2 设置用户和邮箱
        3 咱们是已有仓库
        cd luffy_api
        # 添加一个远程仓库地址名字叫origin,地址是xxx
		git remote add origin https://gitee.com/liuqingzheng/luffy_api.git
        # 把本地的版本库推送到远程仓库
        # 把本地当前所在分支,推送到 origin对应的远程的master上git 
		git push origin master
    	# 需要输入用户名密码,输入一次,以后就不用输入了(本地保存了:凭据管理)
    	
    

# 如果提交了,再写忽略文件的步骤
    luffy.log--->暂存区---》版本库
    
    .gitignore---》写上忽略,但是不好被忽略,只要luffy.log有变化还是会被监控到
    
    删除luffy.log---》会被监控到---》add,commit---》版本库中已经没有luffy.log
    再出的luffy.log,就不会被管理了

后端忽略文件:

image-20230302095839096

已经提交的文件如何忽略:

image-20230302100317656

先得让版本库中的文件被移除。

image-20230302100752342

初始化之后仓库不是空。不是空会有问题,会存在合并代码的问题。

2.1 把路飞项目传到远程仓库(非空的)

# 1 创建远程仓库luffy_api---【非空】
# 2 git clone https://gitee.com/liuqingzheng/luffy_api.git  # 把远程仓库内容克隆到本地
# 3 把我们项目的代码,copy到 luffy_api这个文件夹下(.git文件夹不要copy)
# 4 git add .
# 5 git commit -m ‘初始化仓库’
# 6 git push origin master


# 以后,完成了项目的某个功能就要执行下面的命令,以后你在公司中得开发提交步骤
    -git add .
    -git commit -m '完成了xx功能,修改了xx文件。。。。'  # 提交到了本地仓库
    
    -每次提交【推到远端】代码之前,要拉取一下代码---》没事你就拉去一下,保证本地的版本库一直跟远端保存一样----以后冲突会变少
    -git pull origin master
    -git push origin master  # 把本地的mater分支推送到远端origin对应的地址-【可能推不上去】
    -如果推不上去,说明本地不是最新版本,一定下拉去一下,成了最新版本再去提交

开源协议规范:
linux改了之后可以商用,但是你也必须开源。必须在显著位置写使用了哪个开源协议。
选了设置模板 仓库也不是空的了。
选了初始化readme 仓库又不是空的了。

本地保存密码的位置:

image-20230302102426263

3 ssh链接远程仓库,协同开发

# 本地仓库和远程仓库建立关系时,建立的是https的链接,公司一般用ssh的链接
# https和ssh的区别
    -https:输入用户名密码,保存在凭据管理中
    -ssh:配置公钥私钥
        -生成公钥私钥
        -把公钥放到gitee上
        -配好远程仓库,以后直接提交,不需要输入任何秘钥的东西
# ssh的配置步骤
    -按照这个步骤操作:https://gitee.com/help/articles/4181
    -cmd命令行中,一路回车,会在【C:\Users\oldboy\.ssh】文件夹下生成公钥和私钥
       ssh-keygen -t ed25519 -C "306334678@qq.com" 
    -生成一个公钥,一个私钥
        id_ed25519  #私钥,千万不能泄露
        id_ed25519.pub #公钥,可以给任何人
        
    -把公钥配置在gitee的配置文件中
    -到此,你的机器和gitee互相上传下载代码,都不要认证了
    
    
 # 以后使用:免密了
    -先删除origin 对应的https的链接:git remote remove origin
    -查看一下,没有了:git remote
    -配置成ssh的地址
    git remote add origin git@gitee.com:liuqingzheng/luffy_api.git
    -以后直接拉去,提交代码即可
    git pull origin master
    git push origin master

设置:

image-20230302103144173

执行:

image-20230302103339934

image-20230302103422462

一个公钥一个私钥。使用的是非对称加密。

公钥放在这里:

image-20230302103557252

ssh提交代码:

之前的oringin仓库是https的,需要把仓库的协议换成ssh。

要去找ssh地址是什么:

image-20230302103814616

第一次ssh连接需要敲一个yes。

4 协同开发

# 我[仓库管理员]创建了仓库,我对仓库有各种权限
# 我们要多人开发(张三,李四),张三李四在自己的仓库中,能看到我的项目吗?看不到
# 我[仓库管理员],把张三李四设置为该仓库的开发者,设置完成后,在张三李四的仓库中就能看到这个项目了


# 仓库管理员,邀请开发者进入 
    -邀请的开发者,对这个仓库就有读写权限,他们就可以开发代码,提交
    
    
# 我作为开发者,本地没有代码
    1 把代码从远程仓库 clone 下来
    	git clone git@gitee.com:liuqingzheng/luffy_api.git
    2 使用pycharm打开,配置好解释器,安装依赖
    3 开发代码,开发完
        git add 
        # 设置用户名和邮箱
        git config user.name lqz
        git config user.email 3@qq.com
        
        git commit
        git push origin master
        
        
        
# 你刚去公司,你的步骤
    1 自己注册,hr给你 gitlab 账号和密码
    	-自己去你的账号里,配置ssh
    2 老大会把一个仓库地址给你 【它已经把你加成开发者了】  https  ssh
    3 clone下来代码
    4 使用pycharnm打开,配置环境===》代码运行起来
    5 开发代码,本地提交---》push到远端
        add
        commit
        push

git gui here:

image-20230302105140439

局部用户设置存放在.git/config:

image-20230302105657009

5 冲突解决

5.1 多人同一分支开发出现冲突

# 出现冲突的原因
    1 多人在同一分支开发
    2 分之合并出现冲突
    
    
    
# 多人在同一分支开发冲突
    -张三:
        git pull origin master
        在requirements.txt,最后一行加入 lqz
        git add .
        git commit -m 
        git push origin master
        
        
        
    -我:
        在requirements.txt,最后一行加入 lqz
        git add .
        git commit -m 
        git pull origin master
        # 冲突了
        # 解决冲突 冲突的 箭头去掉,阅读代码,选择保留或删除别人或自己的代码,再提交
        # 提交到远程仓库,这是解决后的

        
        
# 冲突出现的样子:你如果要删除别人的代码,你需要跟别人说一声
    <<<<<<< HEAD   我的代码
    print('刘亦菲')
    =======   它的代码
    print('彭于晏')
    >>>>>>> 6f720edbd84c8744b1c7c10767fb89a5d0fa98f5
   
 
 
# 避免出现冲突
 	-你如果想少出现冲突,勤拉取代码

 
    

image-20230302112515862

低版本不能提交,只能基于主分支最新版本提交。

需要拉下来:

image-20230302112606837

不是最新:

image-20230302113136560

拉的时候由于远程和本地修改了同一句话,会出现冲突,会多出以下文本:

 -冲突的样子
    <<<<<<< HEAD
    print('lqz') 
    =======        # 上面是你的代码
    print('lqz is handsome')
    >>>>>>> 

解决冲突,删掉冲突代码,再提交。

程序冲突:

image-20230302113725400

解决冲突,选择留谁的代码,然后提交到远程服务器。

不在同一行会不会冲突?一般不会。看和进来会不会报错。

避免出现冲突:每次有人提交新版本,就拉取下来。

5.2 分支合并出现冲突

# 1 新建本地dev分支,切换过去
    git branch dev
    git checkout dev
    
# 2 dev分支修改dev.py 第一行,提交到版本库
    # 在第一行加入print
    git add .
    git commit -m '修改了dev.py'
# 3 修改dev分支的home/views.py 最后一行
    # 在views.py最后一行加入注释
    git add .
    git commit -m '最后一行加入注释'

# 4 切回到master分支,修改dev.py 第一行和home/views.py 最后一行,提交到版本库
    git checkout master
    # 在第一行加入print
    # 在views.py最后一行加入注释
    git add .
    git commit -m 'master修改内容'


# 5 当合并代码,会出冲突,解决,提交
    git merge dev 
    # 有冲突,解决
     git add .
    git commit -m '解决冲突'
    

image-20221109101551819

配置文件很容易出现冲突。

6 线上分支合并(pr,mr)

# 之前全是线下分支操作,本地增删查改分支

# 1 远程建立分支:gitee上点击操作

# 2 把远程分支拉到本地 
    git pull origin dev # 已经拉下来了,但是还看不到,需要切换过去
    git checkout dev   # 来到了本地dev分支
    
    
# 3 本地dev分支增加代码
    git add .
    git commit -m '本地dev提交'
# 4 本地dev提交到远端
    git push origin dev
    
# 5远程分支合并:把dev合并到master
    -你提交pull request 的申请(pr,mr)---》跟你没关系了--->[合进去了,没有合进去]
    -你领导就能看到这个pr,审核通过,点合并
    -到此 dev分支就合并进master分支了

7 pycharm操作git

# 命令操作git,编辑器pycharm,可以操作git,图形化界面操作
# 以前使用的所有命令,都可以在pycharm中点点点实现

clone

image-20221109113952798

git add

image-20221109114106499

git commit

image-20221109114155394

image-20221109114331243

git push

git pull

image-20221109114643937

git branch操作

image-20221109115120455

查看git操作记录 git log

image-20221109115451627

本地代码跟版本库比较

image-20221109115602355

image-20221109115849670

image-20221109120249463

8 为开源项目贡献代码

# 为开源项目贡献代码
    1 看到开源项目,点fork,你的仓库就有这个开源项目了
    2 在本地拉去【你仓库】fork的代码
    3 你继续写,提交到自己远程仓库
    4 提交pr合并,如果作者同意,你就可以合并进去了

9 git面试题

1 你们公司分支方案是什么样的?
    -master,dev,bug 三条分支
    -master主要用来发布版本,写好了某个版本的代码合并进去,不直接在master上开发
    -dev:开发分支,项目的开发者,都在dev分支上开发
    -bug:bug分支,用来修改bug,发布小版本

2 使用git开发,遇到过冲突吗?
    -遇到过
    -多人在dev分支开发,出现的冲突
    -分支合并出现的冲突
    -把代码拉下来,直接解决冲突,保留我的代码,保留同事的代码
3 你知道git 变基?
    -分支合并:dev分支合并到master分支
    -merge或rebase 合并
    -把多次提交合并成一个
    
    
4 git pull 和git fetch的区别
	-pull 和 fetch都是拉取代码
 	-pull=fetch+合并
    
5 你知道git flow吗?git 工作流,它是一个别人提出的分支方案
    我们没有用,我们用的就是master+dev+bug分支方案
6 使用git 的操作流程
	- 如果是普通开发者:git clone下来,写代码,git add ., git commit, git pull, git push
7 什么是gitee,github:pr,gitlab:mr?
	-不同叫法:提交分支合并的请求

10 登录注册功能设计

# 后端接口
	1 账号/手机号/邮箱+密码登录接口
    2 手机号+验证码登录接口
    3 发送手机验证码接口  (第三方发送短信)
    4 注册接口--》手机号,验证码,密码
    5 判断手机号是否存在接口

11 补充

1 cgi fastcig WSGI uwsgi uWSGI  
    # cgi:通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服务器和请求处理程序之间传输数据的一种标准。
     一句话总结: 一个标准,定义了客户端服务器之间如何传数据
    
    # fastcig:快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本
      一句话总结: CGI的升级版
      常用的fastcgi软件: 
            Apache HTTP Server (部分)    :LAMP  LNMP
            Nginx(主流):nginx是一个符合fastcgi协议的软件,处于浏览器和web程序之间,主要做请求转发和负载均衡,也可以称之为服务器中间件
            Microsoft IIS:windows server
           

   # WSGI:Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口
    一句话总结: 为Python定义的web服务器和web框架之间的接口标准
    wsgiref:性能很低,python实现的,django内置了,测试阶段用,上线不用
    uWSIG:性能高,c实现的
    gunicorn:python实现的
    
  # uWSGI: 符合wsgi协议的web服务器,上面标准的具体实现

  # uwsgi:uWSGI服务器,自有协议
    
    

3 Apache
    -Apache 公司
    -Apache  web服务器
    -Apache  开源协议
        -Kafka :apache顶级开源项目
        -echars:原来是百度开发的,交给了apache孵化

远程仓库回滚

# 你不要用
# 想远程的代码,是最初的状态

# 步骤:
    1 本地版本回退
     git reset --hard 版本号
        
    2 强行推到远端
    git push origin master -f

image-20230302122734597

提交不上是因为本地的版本不是最新。

练习

1 讲到哪写到哪
2 整理git面试题
3 整理补充


4 扩展搜索面试题:浏览器输入一个地址到请求返回,经历的过程