Welcome to kimi's blog

路飞之git

git 的使用

git简介

1. 版本控制器

"""
完成 协同开发 项目,帮助程序员整合代码
	1.帮助开发者合并开发的代码
	2.如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突
	3.代码版本管理

软件:SVN 、 GIT(都是同一个人的个人项目)
	github、gitee(两个采用git版本控制器管理代码的公共平台)

git:集群化、多分支
"""

2. git 和svn比较

svn:集成式管理,服务端挂掉就做不了版本管理,代码合并
git:分布式管理,服务端挂掉,本地还可以继续做版本管理,代码合并

image

image

3. git介绍

git是版本控制器,控制的对象是开发的项目代码。

代码开发时间轴:需求1 => 版本库1 ==> 需求2 => 版本库2 => 版本库3(版本库1) => 版本库4(版本库2)

4. git,gitee,github,gitlab

# git:版本管理软件,装在操作系统上,有很多命令
# gitee:远程仓库:开源代码,私有代码,有个网站,可以看到有哪些开源代码,通过网站做一些配置
	-国内最大的开源远程仓库
     -小公司---》使用gitee的私有仓库
    
# github:远程仓库:开源代码,私有代码,有个网站,可以看到有哪些开源代码,通过网站做一些配置
	-国际上最大的开源远程仓库
    
# bitbucket:只有私有仓库
	-远程代码仓库

# gitlab:公司内部的远程仓库

git安装

官网下载对应版本:https://git-scm.com/download,双击安装软件--默认选项--在选取安装路径的下一步选取 Use a TrueType font in all console windows 选项,下载完成,任意路径下点右键,显示如下

image

git工作流程

# 三个区
	-工作区    存放文件的地方
    -暂存区    工作区的变更,提交到暂存区
    -版本库    暂存区的内容,提交到版本库

image

image

版本库间通信

image

git分支

image

git常用命令

记住的:
    git add  
    git commit -m
    git reset --hard 版本号
会用:
    git init
    git status
    git log
    git reflog
        
了解:
	git checkout .
    git reset HEAD
    git config --global user.email "306334678@qq.com"
    
"""
1.有红色信息(工作区有内容)执行add
2.全绿信息(内容全部在暂存区)执行commit
3.只有被版本库控制的代码,才能被监听,所以可以回滚到任何一个版本
"""

git的使用

桌面有git文件,文件夹想被git管理,文件夹作为仓库,如何操作?

在文件夹里面右击git bash here

image

  1. 将已有的文件夹 - 初始化为git仓库

    # cd 目标文件夹内部
        git init  # 初始化仓库 ,当前文件夹多出 .git 文件夹,这个文件夹不要删,如果删除,这就不是git仓库了,之前的版本再也找不回来了,也不能被git管理
    
  2. 在指定目录下 - 初始化git仓

    # cd 目标目录
        git init 仓库名    # 在指定目录创建xxx文件夹
    
  3. 在仓库目录终端下 - 设置全局用户

    git config --global user.name '用户名'
    git config --global user.email '用户邮箱'
    
    注:在全局文件 C:\Users\用户文件夹\.gitconfig新建用户信息,在所有仓库下都可以使用作者
    
  4. 在仓库目录终端下 - 设置局部用户

    git config user.name 'kiki'   # 用户名
    git config user.email '123@qq.com' # 用户邮箱
    
    
    # 在当前仓库下的config新建用户信息,只能在当前仓库下使用
    # 一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户
    
  5. 查看仓库状态

    当仓库中有文件增加、删除、修改,都可以在仓库状态中查看

    在  .git 所在文件夹下   [只看暂存区和工作区]
    # 查看仓库状态
        git status  
            # 看到有两种颜色
                -红色:工作区变化了,但是没有提交到暂存区
                -绿色:已经提交到暂存区,没有提交到版本库
                -没有:所有东西都在版本库中了[所有文件都被git管理起来了]
    # 查看仓库状态的简约显示
        git status -s
    
  6. 工作区操作

    # 通过任何方式完成的文件删与改
    # 空文件夹不会被git记录
    
  7. 撤销工作区操作:改、删(了解)

    # 撤销所有暂存区的提交
        git checkout .
    # 撤销某一文件的暂存区提交
        git checkout 文件名
    
  8. 工作区内容提交到暂存区

    # 添加项目中所有文件
        git add .   # 当前路径下所有变更都提交
    # 添加执行文件
         git add 文件名
    
  9. 撤销暂存区提交:add的逆运算(很少使用)

    # 撤销所有暂存区的提交
        git reset HEAD .
    # 撤销某一文件的暂存区提交
        git reset 文件名
    # 撤销所有暂存区的提交
        git reset .
    
  10. 提交暂存区内容到版本库

    git commit -m '版本描述信息'
    
    eg: git commit -m '提交了1.txt'
    
  11. 撤销版本库提交:commit的逆运算

    回滚暂存区已经提交到版本库的操作:
        # 查看历史版本:
            git log
            git reflog
        # 查看时间点之前|之后的日志:
            git log --after 2018-6-1
            git log --before 2018-6-1
            git reflog --after 2018-6-1
            git reflog --before 2018-6-1
        # 查看指定开发者日志
            git log --author author_name
            git reflog --author author_name
            
        # 回滚到指定版本:
            # 回滚到上一个版本:
                git reset --hard HEAD^
                git reset --hard HEAD~
            # 回滚到上三个版本:
                git reset --hard HEAD^^^
                git reset --hard HEAD~3
            # 回滚到指定版本号的版本:
                git reset --hard 版本号 (重点)
                eg: git reset --hard 35cb292
    
  12. git忽略文件

    咱们项目中,有些文件,或文件夹不想被git管理,比如:-node_models/.idea/xx.pyc(python的编译文件)

    使用步骤:

    1.在仓库目录下  .git 所在目录下   新建  .gitignore
    2.在里面写忽略文件
        	mode_models
            .idea
            *.pyc
            *.log
    3.写的就会被忽略
     
    4.已经被管理过的不会被忽略
    

    过滤文件写法

    # .gitignore 文件
    # 1)在仓库根目录下创建该文件
    # 2)文件与文件夹均可以被过滤
    # 3)文件过滤语法
    
    """过滤文件内容:
       文件或文件夹名:代表所有目录下的同名文件或文件夹都被过滤
       /文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤
    """
    
    eg:
    a.txt:项目中所有a.txt文件和文件夹都会被过滤
    /a.txt:项目中只有根目录下a.txt文件和文件夹会被过滤
    /b/a.txt:项目中只有根目录下的b文件夹下的a.txt文件和文件夹会被过滤
    *x*:名字中有一个x的都会被过滤(*代表0~n个任意字符)
    空文件夹不会被提交,空包会被提交,包可以被提交(包中有一个init空文件)
    
    

git多分支

为什么要有分支?

  1. 可以保证主分支的版本都是可以查看的版本
  2. 我们都在开发支开发,开发完成,合并到主分支

分支操作

  1. 分支查看

    git branch
    
  2. 分支创建

    git branch 分支名
    git branch dev  # 创建dev分支
    
  3. 分支切换

    git checkout dev  # 切换到dev分支
    
  4. 分支删除

    git branch -d dev # 删除dev 
    

    创建的dev分支是存在.git 文件里,如果切到master,只是隐藏了文件,并没有删除dev分支的文件。各分支的文件只存于各分支里面。

    image

  5. 合并分支--重要

    1.把dev合并到进master
    2.切到master分支:git checkout master
    3.执行合并命令:git merge dev # 把dev合并到master主分支上
    
    
    # 针对小公司的分支方案:
    1. master分支,dev分支,bug分支 ,所有人在dev分支开发,开发完成合并到主分支
    2. master分支,dev分支,bug分支 ,个人分支,个人在个人分支上开发,开发完成合并到dev分支
    

image

注意:但主分支上出了bug,会单独拉出来bug分支,解决之后再合并到主分支上。

合并分支可能出现的问题?

是两个分支同时处理bug分支/dev分支处理相同的问题以及处理的内容相同,合并时就会出现冲突,如何解决?

冲突解决

出现冲突的原因:1.多人在同一分支开发,2.分支合并出现冲突

# 冲突出现的样子
    <<<<<<< HEAD   我的代码
    print('刘亦菲')
    =======   它的代码
    print('彭于晏')
    >>>>>>> 6f720edbd84c8744b1c7c10767fb89a5d0fa98f5 # 版本号
    
    
    
# 情况1:多人在同一分支开发冲突
    -张三:
            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
            # 冲突了
  # 解决冲突-->箭头去掉-->阅读代--->选择保留或删除别人或自己的代码--->再提交----解决后再提交到远程仓库

# 情况2:分支合并出现冲突
       -我:
           1 创建dev分支 
                git branch dev
           2 在dev分支的views.py 中第2行加入代码
           3 提交到本地仓库
        
        
       -我:
          1 在主分支的views.py 中第2行加入代码
          2 提交到版本库

          3 在主分支合并代码  git merge dev
          4 冲突了,解决冲突
          5 再提交代码,到此结束

git远程仓库

把本地的版本提交到远程仓库(gitee、github、gitlab.....)

gitlab的搭建过程:https://zhuanlan.zhihu.com/p/413217715

本篇文字是以远程仓库gitee为讲解

  1. 作为项目仓库初始化人员

    线上要创建空仓库 => 本地初始化好仓库 => 建立remote链接(remote add) => 提交本地仓库到远程(push)

  2. 作为项目后期开发人员

    远程项目仓库已经创建成功 => 复制远程仓库到本地(clone) => 进入仓库就可以进行接下来的开发

采用HTTP协议连接远程仓库

本地提交luffy_api,将代码提交到远程仓库,提交代码需要用户名和密码

新建仓库

image

操作

# 远程
1.远程要创建仓库:gitee上创建仓库,右上角 +
2.保证仓库是空的,填写基本信息

# 本地提交到版本库
1.在luffy_api 敲git init--初始化
2.设置忽略文件(.gitignore)
   .idea
   *.log  # 一定要是包,如果没有init文件是不会被管理的
   scripts
   *.pyc
3.pycharm/git bash 敲----git add .
4.提交库---git commit -m '第一次提交'
  提交到了本地版本库-------被版本管理了
    
# 本地安装远端提示的信息
pycharm如何导入仓库
 1.安装远端提示的步骤操作
    GIT全局设置:
    git config --global user.name "kimi"
    git config --global user.email "1603847806@qq.com"
    创建git仓库
    mkdir luffy_api
    cd luffy_api
    git init 
    touch README.md
    git add README.md
    git commit -m "first commit"
    git remote add origin https://gitee.com/mos-house-is-in-a-hurry/luffy_api.git
    git push -u origin "master"
 2.设置用户和邮箱
 3.咱们是已有仓库
      cd luffy_api
      git remote add origin https://gitee.com/mos-house-is-in-a-hurry/luffy_api.git
       git push -u origin "master"
 4.cd luffy_api
 5.添加一个远程仓库地址名字叫origin,地址是xxx
      git remote add origin xxx
 6.# 把本地的版本库推送到远程仓库
    # 把本地当前所在分支,推送到 origin对应的远程的master上
        git push origin master
    # 需要输入用户名密码,输入一次,以后就不用输入了(本地保存了:凭据管理)
凭据管理在本地里---也可删除,删除了之后需要每次都登录

注意:用户名是邮箱image

image

注意:提交到版本库之后发现漏写了忽略文件的情况?

# 比如忘记添加了luffy.log,如何解决?
# 只要版本被管理,就算写上忽略,还是会被监控的
1. luffy.log--->暂存区---》版本库
2..gitignore---》写上忽略,但是不好被忽略,只要luffy.log有变化还是会被监控到

解决方法:
  1.删除luffy.log---》会被监控到---》add,commit---》版本库中已经没有luffy.log

采用SSH协议连接远程仓库

采用ssh方案:需要公钥和私钥 。私钥在本地保存,公钥配置到gitee上,下次提交就需要其他任何认证了。

使用步骤

1.生成公钥私钥:https://gitee.com/help/articles/4181
    本机命令,查看公钥:cat ~/.ssh/id_rsa.pub
2.在命令窗口中执行,一路回车
     ssh-keygen -t ed25519 -C "1603847806@qq.com" 
        -生成在:C:\Users\Administrator\.ssh  两个文件,一个公钥,一个私钥
3.把公钥,配置在gitee上
4.之前origin对应的地址是 https的,现在要使用ssh提交代码,需要把它删除,再增加成ssh的协议
   git remote remove origin
   git remote add origin git@gitee.com:mos-house-is-in-a-hurry/luffy_api.git
    
5.提交本地代码到远程仓库
    git push origin master

将公钥配置在gitee库上,那是你的身份凭证。没有就拉取不了别人的代码(前提是成为同行开发者,观察者是没有权限的)
image

协同开发

# 如何成为其他码云项目的开发者
"""
1.生成自己电脑的公钥,配置到自己的码云个人公钥中
2.把自己的码云用户名提供给别人,别人添加你成为项目开发者
3.自己确认添加,成为开发者,克隆开发项目,进行开发
"""

#如何成为公司自建git服务器的开发者
"""
1.生成自己电脑的公钥(公钥生成一次就可以了),把它提交给项目管理者
2.项目管理者添加你公钥,加入开发者,提供给你项目克隆地址
3.克隆开发项目,进行开发
"""


# 协同开发
1. 作为开发者,第一次同步项目(前台已经是项目开发者了)
    git clone 项目地址
    eg:git clone git@gitee.com:liuqingzheng/luffy_api.git
2. 保证自己本地有dev分支,且与远程仓库版本同步(确保远程也有dev分支)
3. 本地开发的代码,必须add、commit到本地版本库后,才和远程仓库进行交互
4. 交互顺序:必须 先拉(pull)后提(push)
5. 必须切换到要交互的分支,再与远程同名的分支进行交互,如本地dev与远程dev交互
    git checkout dev
    git add .
    """ 提交仓库的时候要设计用户名和邮箱,有局部先局部,没有就用全局的"""
     # 设置用户名和邮箱
        git config user.name kimi
        git config user.email 1603847806@qq.com
    git commit -m '本次提交的信息提示'
    git pull origin dev  # 拉下来可以看不见,切到dev就能看见
    git push origin dev
    
    # 也可以 git push origin SSH
    
  
 # 刚去公司
  1.自己注册,hr给你 gitlab 账号和密码
       自己去账号里配置ssh
  2.老大会把一个仓库地址给你 【它已经把你加成开发者了】  https  ssh
  3. clone下来代码
  4.使用pycharnm打开,配置环境===》代码运行起来
  5.开发代码,本地提交---》push到远端
         add
         commit
         push

线上分支合并

# 线下分支合并
    git merge dev
    
# 线上 分支合并
    1.gitee上,新建一个分支 ,本地同步远程dev分支 --防止冲突,本地清空dev分支
    2.拉取远程的分支dev
        git pull origin dev  # 拉下来看不到分支,切过去才看dev
        git checkout dev     # 切换到dev分支
    3. 在dev上开发开发
    	随便加代码
    4.git add 
    5. git commit  # 提交到本地的dev了
    6. 将远程dev分支推到远端 dev
        git push origin dev
    7.master中没有代码,dev中有提交的,现在要线上分支合并
        把远程的dev合并进远程的master
    8. 提交pr    提交rr
       -在网站上,申请提交pull request
       -领导审核,测试,通过后,点击合并
       -线上dev就合并进线上的master了

image

image

远程仓库回滚

建议----一般都不能使用

# 想远程的代码,是最初的状态

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

为开源项目贡献代码

目前学习的是gitee库,想为好的开源项目改进某些东西并合并进开源项目,如何做?

  1. 先fork开源项目,复制这个项目到我的仓库中
  2. clone下来,改代码,一路提交远端我的仓库
  3. 提交pr,等待作者同意

pycharm使用git

  1. 配置git的安装路径

image

  1. pycharm使用git使用add、commit提交到版本库和git pull origin master、git push origin master等命令

image

image

image

与历史库做对比!image

image

posted @ 2023-03-01 20:11  魔女宅急便  阅读(41)  评论(0)    收藏  举报
Title