Skip to content

Latest commit

 

History

History
373 lines (344 loc) · 18.4 KB

06.git.md

File metadata and controls

373 lines (344 loc) · 18.4 KB

git

dos 命令

  • cd xxx 进入xxx文件或文件夹
  • cd.. 返回上一级目录
  • ls 列出当前文件夹中所有文件
  • clear 清屏
  • mkdir xxx 创建一个空文件夹
  • cat xxx 查看文件内容
  • pwd 显示当前目录的路径
  • vi 文件名.后缀 创建一个文件
    • 自动进入了文件 输入i 进行编辑模式
    • esc+ : + wq +enter 保存并退出文本编辑
    • esc+ : + q! +enter 不保存并退出文本编辑
  • cls 命令清空 控制台

git 命令

  • 配置和查看git的name 和email
    • git config --global user.name "Your Name" 配置姓名
    • git config --global user.email "[email protected]" 配置邮箱
    • git config user.name 用于查看配置的姓名
    • git config user.email 用于查看配置的邮箱
  • git init 初始化版本库
  • git remote add origin https://github.com/xxxxx/a.git 关联一个远程库
  • git add 添加指定文件到暂存区
  • git commit -m "提交描述" 提交暂存区所有文件到版本区
  • git push -u origin master 将内容推送到远程仓库
    • git push -u(第一次尽量加上-u,以后不用)origin master:把当前master分支推送到远程库
  • git status:查看仓库状态
    • 红色表示在工作区
    • 绿色表示在暂存区
    • 没有任何显示代表所有文件位于版本区
  • git log:查看历史记录
  • git reflog:查看历史记录的版本号id
  • git reset --hard HEAD^:往上回退一个版本
  • git reset --hard Obfafd  回退到指定Obfafd的commit id版本
  • git reset HEAD 用版本库中的文件去替换暂存区的全部文件
  • git checkout -- xx:把xx文件在工作区的修改全部撤销
  • git rm --cached x.txt 从暂存区删除文件
  • git rm xx:删除xx文件
  • git rm -r xxxx 删除文件夹
  • git clone https://github.com/xxxxx 从远程库中克隆
  • git clone -b xxx分支名 https://github.com/xxxxx 从远程库中克隆指定分支
  • git branch xxx :创建新分支
  • git checkout -b dev:创建dev分支 并切换到dev分支上
  • git branch:查看当前所有的分支
  • git checkout master:切换回master分支
  • git merge dev:在当前分支合并dev分支
  • git branch -d dev:删除dev分支
  • git diff branch1 branch2 显示出两个分支之间所有有差异的文件的详细差异
  • git diff branch1 branch2 --stat 显示出两个分支之间所有有差异的文件列表
  • git diff branch1 branch2 xxx 显示指定文件的详细差异
  • git remote:查看远程库信息
  • git remote -v查看远程库的详细信息
  • git pull origin master 将远程库的更新拉取到本地并自动合并
  • git push origin master:git会把master分支推送到远程库对应的分支上
  • git log --oneline 查看提交记录
  • git commit --amend 撤消修改
  • git switch -c dev 创建并切换到新的dev分支 (最新版本 用switch更科学)
  • git switch master 直接切换到已有的master分支

git 配合 gitee创建远程仓库 流程

  • git init 初始化版本库
  • git remote add origin https://github.com/xxxxx/a.git 关联一个远程库
  • git add 添加指定文件到暂存区
  • git commit -m "提交描述" 提交暂存区所有文件到版本区
  • git push -u origin master 将内容推送到远程仓库

使用SSH方式与github交互

  • 创建一对新的SSH秘钥(keys)
  • 输入命令:ssh-keygen -t rsa -C “你Github注册的邮箱” 建议一路回车 用默认的ssh存放地址 密码不设置 直接回车
  • 根据ssh生成的地址找到该文件进行内容复制在粘贴到 github中
    • 运行命令将公钥的内容复制到系统粘贴板(clipboard)中 win+v键查看是否复制成功 在将复制内容粘贴到github
  • 命令: clip < ~/.ssh/id_rsa.pub
  • 检查git是否和github关联上 命令:ssh -T [email protected]

工作区+版本区+暂存区

  • 工作区(working Directory):简单的理解——你在电脑里能看到的目录
  • 暂存区(stage):介于工作区和版本区中间,工作区到版本区的“必经之路”
  • 版本库(Repository):工作区有一个隐藏目录.git,准确的来说这个不算工作区,而是Git的版本库。

案例

场景:本地仓库与远程仓库同步 克隆远程仓库 删除一个文件 又上传一个文件 (此时实现远程和本地同步)

  • 问题产生原由:克隆远程仓库 删除一个文件 又准备上传一个文件 此时新创建的文件可以上传成功 但是 此时 本地库和远程仓库 不一致
  • 解决方法
    • git fetch --all 是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中
    • git reset --hard origin/master
      • git reset 版本号,就是回退到该版本号上。
      • git reset HEAD就是回退到当前版本。git reset HEAD^回退到上一版本
    • git pull 将远程库的更新拉取到本地并自动合并

场景: 两人同时提交代码时 后一个无法提交 与前一个提交产生冲突

  • 问题产生原由:两个人本地库一模一样 a在第一行抒写一串代码b也如此 a先上传了但时此时b也要上传 b无法上传
  • 解决方法:
    • git pull 将远程库的更新拉取到本地并自动合并
    • 合并后 先处理非代码的提示信息 利用插件插件会显示 两者之间冲突的代码
    • 考虑优先级 谁先上传将谁的提前放 手动处理
    • 在重新提交

开发流程

开发一个页面时

  • 查看当前位于的分支 git branch
  • 创建新分支 git checkout -b xxx (创建新分支会自动切换到当前新分支)
  • 推送当前新分支到云端 git push -u origin xxx (云端新分支名和本地分支名可以相同)
  • 进行开发
  • 开发完毕
  • 查看当前位于的分支 git branch
  • 查看仓库文件状态 git status
  • 添加到暂存区 git add .
  • 查看仓库文件状态 git status
  • 提交到本地仓库 git commit -m '提交信息'
  • 查看仓库文件状态 git status (查看工作目录是否为干净的)
  • 推送到云端 git push
  • 切换分支 git checkout master (切换到主分支上)
  • 合并分支 git merge xxx (将 xxx 分支 合并到 master 主分支上 当前只是在本地合并)
  • 将合并后的主分支 master 上传到云端 git push

项目初始化配置

eslint prettier

  • 1.安装 npm i eslint eslint-plugin-vue eslint-config-prettier prettier eslint-plugin-import eslint-plugin-prettier eslint-config-airbnb-base -D
  • 包作用
    • eslint: ESLint的核心代码库
    • prettier: prettier格式化代码的核心库
    • eslint-config-airbnb-base: airbnb 的代码规范 (依赖plugin-import)
    • eslint-config-prettier: eslint结合prettier的格式化
    • eslint-plugin-vue: eslint在vue里的代码规范
    • eslint-plugin-import: 项目里面支持 eslint
    • eslint-plugin-prettier: 将prettier结合进入 eslint 的插件
  • 2.配置script 脚本项目安装 eslint配置
    • "lint:create":"eslint --init"
  • 3.执行 npm run lint:create 进行eslint 配置
    • 项目使用那种检查方式 (如何使用eslint?)
      • To check syntax only 仅检查语法
      • To check syntax and find problems 检查语法并查找问题
      • To check syntax, find problems, and enforce code style 检查语法、查找问题并强制执行代码样式
    • 项目使用那种类型模块 ....... 等一些列配置项 根据自己项目需求来进行配置即可
    • 配置完成后会生成一个 .eslintrc.js 的文件
  • 4.修改package.json文件,并添加一个脚本命令 scripts: {"lint": "eslint \"src/**/*.{js,vue,ts}\" --fix"}
module.exports = {
    root: true,
    // 环境 浏览器 node环境  最新es语法
    env: {
        browser: true,
        node: true,
        es2021: true
    },
    // Eslint 会对我们的代码进行校验,而 parser 的作用是将我们写的代码转换为 ESTree (AST),ESLint 会对 ESTree 进行校验
    parser: 'vue-eslint-parser',
    extends: [
        'eslint:recommended',
        'plugin:vue/vue3-recommended',
        'plugin:@typescript-eslint/recommended',
        'plugin:prettier/recommended',
        // eslint-config-prettier 的缩写
        'prettier',
        'vue-global-api',
        '.eslintrc-auto-import.json',
        '.eslintrc-auto-import-types.json'
    ],
    // 解析器的配置项
    parserOptions: {
        // es的版本号 或者年份都可以
        ecmaVersion: 12,
        parser: '@typescript-eslint/parser',
        // 源码类型 默认是script es模块使用module
        sourceType: 'module',
        // 额外的语言类型
        ecmaFeatures: {
            jsx: true
        }
    },
    // eslint-plugin-vue @typescript-eslint/eslint-plugin eslint-plugin-prettier的缩写
    plugins: ['vue', '@typescript-eslint', 'prettier', 'import', 'simple-import-sort'],
    rules: {
        'import/no-extraneous-dependencies': ['error', { devDependencies: true }], // 解决依赖问题
        'simple-import-sort/imports': 'error',
        'simple-import-sort/exports': 'error',
        '@typescript-eslint/ban-ts-ignore': 'off',
        '@typescript-eslint/no-unused-vars': 'off',
        '@typescript-eslint/explicit-function-return-type': 'off',
        '@typescript-eslint/no-explicit-any': 'off',
        '@typescript-eslint/no-var-requires': 'off',
        '@typescript-eslint/no-empty-function': 'off',
        '@typescript-eslint/no-use-before-define': 'off',
        '@typescript-eslint/ban-ts-comment': 'off',
        '@typescript-eslint/ban-types': 'off',
        '@typescript-eslint/no-non-null-assertion': 'off',
        '@typescript-eslint/explicit-module-boundary-types': 'off',
        'no-var': 'error',
        'prettier/prettier': 'error',
        // 禁止出现console
        // "no-console": "warn",
        // 禁用debugger
        // "no-debugger": "warn",
        // 禁止出现重复的 case 标签
        'no-duplicate-case': 'warn',
        // 禁止出现空语句块
        'no-empty': 'warn',
        // 禁止不必要的括号
        'no-extra-parens': 'off',
        // 禁止对 function 声明重新赋值
        'no-func-assign': 'warn',
        // 禁止在 return、throw、continue 和 break 语句之后出现不可达代码
        'no-unreachable': 'warn',
        // 强制所有控制语句使用一致的括号风格
        // curly: 'warn',
        // 要求 switch 语句中有 default 分支
        'default-case': 'warn',
        // 强制尽可能地使用点号
        'dot-notation': 'warn',
        // 要求使用 === 和 !==
        eqeqeq: 'warn',
        // 禁止 if 语句中 return 语句之后有 else 块
        'no-else-return': 'warn',
        // 禁止出现空函数
        'no-empty-function': 'warn',
        // 禁用不必要的嵌套块
        'no-lone-blocks': 'warn',
        // 禁止使用多个空格
        'no-multi-spaces': 'warn',
        // 禁止多次声明同一变量
        'no-redeclare': 'warn',
        // 禁止在 return 语句中使用赋值语句
        'no-return-assign': 'warn',
        // 禁用不必要的 return await
        'no-return-await': 'warn',
        // 禁止自我赋值
        'no-self-assign': 'warn',
        // 禁止自身比较
        'no-self-compare': 'warn',
        // 禁止不必要的 catch 子句
        'no-useless-catch': 'warn',
        // 禁止多余的 return 语句
        'no-useless-return': 'warn',
        // 禁止变量声明与外层作用域的变量同名
        'no-shadow': 'off',
        // 允许delete变量
        'no-delete-var': 'off',
        // 强制数组方括号中使用一致的空格
        'array-bracket-spacing': 'warn',
        // 强制在代码块中使用一致的大括号风格
        'brace-style': 'warn',
        // 强制使用骆驼拼写法命名约定
        // camelcase: 'warn',
        // 强制使用一致的缩进
        indent: 'off',
        // 强制在 JSX 属性中一致地使用双引号或单引号
        // 'jsx-quotes': 'warn',
        // 强制可嵌套的块的最大深度4
        'max-depth': 'warn',
        // 强制最大行数 300
        // "max-lines": ["warn", { "max": 1200 }],
        // 强制函数最大代码行数 50
        // 'max-lines-per-function': ['warn', { max: 70 }],
        // 强制函数块最多允许的的语句数量20
        'max-statements': ['warn', 100],
        // 强制回调函数最大嵌套深度
        'max-nested-callbacks': ['warn', 3],
        // 强制函数定义中最多允许的参数数量
        'max-params': ['warn', 3],
        // 强制每一行中所允许的最大语句数量
        'max-statements-per-line': ['warn', { max: 1 }],
        // 要求方法链中每个调用都有一个换行符
        'newline-per-chained-call': ['warn', { ignoreChainWithDepth: 3 }],
        // 禁止 if 作为唯一的语句出现在 else 语句中
        'no-lonely-if': 'warn',
        // 禁止空格和 tab 的混合缩进
        'no-mixed-spaces-and-tabs': 'warn',
        // 禁止出现多行空行
        'no-multiple-empty-lines': 'warn',
        // 禁止出现;
        semi: ['warn', 'never'],
        // 强制在块之前使用一致的空格
        'space-before-blocks': 'warn',
        // 强制在 function的左括号之前使用一致的空格
        // 'space-before-function-paren': ['warn', 'never'],
        // 强制在圆括号内使用一致的空格
        'space-in-parens': 'warn',
        // 要求操作符周围有空格
        'space-infix-ops': 'warn',
        // 强制在一元操作符前后使用一致的空格
        'space-unary-ops': 'warn',
        // 强制在注释中 // 或 /* 使用一致的空格
        // "spaced-comment": "warn",
        // 强制在 switch 的冒号左右有空格
        'switch-colon-spacing': 'warn',
        // 强制箭头函数的箭头前后使用一致的空格
        'arrow-spacing': 'warn',
        'prefer-const': 'warn',
        'prefer-rest-params': 'warn',
        'no-useless-escape': 'warn',
        'no-irregular-whitespace': 'warn',
        'no-prototype-builtins': 'warn',
        'no-fallthrough': 'warn',
        'no-extra-boolean-cast': 'warn',
        'no-case-declarations': 'warn',
        'no-async-promise-executor': 'warn'
    },
    // 全局自定义的宏,这样再源文件中使用全局变量就不会报错或者警告
    globals: {
        uni: true,
        wx: true
    }
}

提交规范 husky + lint-staged + commitlint

  • husky 是一个为 git 客户端增加 hook 的工具,在一些git操作前 自动触发的函数 如果我们希望在检测错误的同时,自动修复 es1int 语法错误,就可以通过后面钩子实现
    • 1.安装 :npm i husky --save-dev
    • 2.编辑 package.json 或者 直接使用命令创建配置
      • scripts: {"prepare": "husky install"}
      • npm pkg set scripts.prepare="husky install"
    • 3.执行 npm run prepare 根目录生成 .husky 文件
    • 4.添加一个钩子 npx husky add .husky/pre-commit "npm test"
    • husky
  • lint-staged 过滤出 Git 代码暂存区文件(被 git add 的文件)的工具,将所有暂存文件的列表传递给任务
  • commitlint 是对我们git commit提交的注释进行 校验的工具
    • commitlint
      • 1.安装 npm install --save-dev @commitlint/cli @commitlint/config-angular
      • 2.在安装好了 husky 的前提下添加一个配置文件 npx husky add .husky/commit-msg "npx --no -- commitlint --edit ${1}" ./husky 文件夹下多出一个 commit-msg文件
      • 3.根目录下添加一个文件 commitlint.config.cjs

git 上常见的问题

推送访问超时 (常见)

  • 报错 Failed to connect to github.com port 443 after 21092 ms: Timed out
  • 原因 1.网络访问缓慢导致 2.开了vpn然后特别慢 导致没办法访问
  • 解决 1.设置全局代理 -> 取消全局代理 -> 推送代码
    • 设置全局代理 git config --global https.proxy
    • 取消全局代理 git config --global --unset https.proxy
  • 解决 2.手动关闭vpn 最好是从设置中关闭 软件不一定帮你关闭了

什么是 CI/CD

  • CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法
  • CI/CD 的核心概念是持续集成、持续交付和持续部署。它是作为一个面向开发和运营团队的解决方案,主要针对在集成新代码时所引发的问题(也称为:“集成地狱”)

CI 持续集成(Continuous Integration)

  • 协同开发是目前主流的开发方式,也就是多位开发人员可以同时处理同一个应用的不同模块或者功能
  • 持续集成(CI)可以帮助开发者更加方便地将代码更改合并到主分支
  • 一旦开发人员将改动的代码合并到主分支,系统就会通过自动构建应用,并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏
  • 如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速修复这些错误

CD 持续交付(Continuous Delivery)

  • CI 在完成了构建、单元测试和集成测试这些自动化流程后,持续交付可以自动把已验证的代码发布到企业自己的存储库。
  • 持续交付旨在建立一个可随时将开发环境的功能部署到生产环境的代码库。
  • 在持续交付过程中,每个步骤都涉及到了测试自动化和代码发布自动化。
  • 在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中。

CD 持续部署(Continuous Deployment)

  • 对于一个完整、成熟的 CI/CD 管道来说,最后的阶段是持续部署。
  • 它是作为持续交付的延伸,持续部署可以自动将应用发布到生产环境。
  • 实际上,持续部署意味着开发人员对应用的改动,在编写完成后的几分钟内就能及时生效(前提是它通过了自动化测试)。这更加便于运营团队持续接收和整合用户反馈。
  • 总而言之,所有这些 CI/CD 的关联步骤,都极大地降低了应用的部署风险。
  • 不过,由于还需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段,因此前期工作量还是很大的。

submodule 技术 Git 子模块

  • git submodule add <path> 当前项目中添加子模块
  • 主项目中嵌套使用子模块,子模块修改后需要单独去提交子模块的代码,主项目也需要重新提交
  • 场景:两个项目的公共重复代码可以使用该方式