lei4519 / blog

记录、分享
5 stars 1 forks source link

Git Book 笔记 #40

Open lei4519 opened 7 months ago

lei4519 commented 7 months ago

  1. Git & Svn 差异点,理解 Git 工作模式
  2. Git 的基本原理,如果进行版本控制,分支是什么?
  3. 模拟实际开发场景
  4. 梳理日常开发时的 Git 使用流程
  5. 使用 Vscode 对第三步进行实操

Git & Svn 区别

Svn: 集中化版本控制系统

集中化的版本控制图解

Git: 分布式版本控制系统

分布式版本控制图解

版本库

本地操作

Git 的设计目标(特点)

Linus 用来管理 Linux 源码。(Linus 自己用 C 语言花了两周时间写的)

Linux 系统:开源项目,由全世界的热心志愿者共同完成的。

Git 基本工作原理,如何进行版本控制?

Git 对每一次提交直接记录文件快照,而非差异比较

Svn 记录差异

存储每个文件与初始版本的差异。

Git 记录快照

Git 存储项目随时间改变的快照。

快照的创建

首次提交

$ touch README test.rb LICENSE  
$ git add README test.rb LICENSE  
$ git commit -m 'The initial commit of my project'   git cz  

再次提交

提交对象及其父对象。

分支的原理

分支创建

$ git branch testing  

HEAD 指向当前所在的分支。

分支切换

$ git checkout testing  

HEAD 指向当前所在的分支。

分支总结

实际场景模拟

创建一个新分支指针。

  1. 使用 git merge master 命令将 master 分支合并入 开发分支(推荐)
  2. 等到 开发分支开发完成,再将其合并回 master 分支

继续在 `iss53` 分支上的工作。

  1. 2.0 开发测试完成,将开发分支的代码合并到主分支上,部署上线

     $ git checkout master  
     $ git merge iss53  
     Merge made by the 'recursive' strategy. 通过“递归”策略进行合并。  
    • master 分支所在提交对象并不是 iss53 分支所在提交对象的直接祖先,Git 会使用两个分支的末端所指的快照(C4C5)以及这两个分支的公共祖先(C2),做一个三方合并

    一次典型合并中所用到的三个快照。

    • Git 会将合并的结果做了一个新的快照并且自动创建一个新的提交指向它。
    • 这种提交被称为合并提交,因为他不止有一个父提交对象。

      一个合并提交。

合并冲突

中断一次合并

忽略空白

变基

运程仓库

分支开发工作流

打标签

实际开发流程

  1. 使用 git clone 下载仓库
  2. 基于 develop 分支创建本地分支,开发过程中针对每个功能点进行提交记录。
  3. 开发完成后:
    1. 切换至开发分支,使用 git pull,拉取开发分支最新代码。
    2. 切换至本地分支,并确保本地分支的代码已全部提交或暂存,这使得我们变基过程中可以随时变基过程中所尝试的所有事情。
    3. 使用 git rebase develop 合并开发分支的代码,如有代码冲突,解决后需要重新提交合并对象。
    4. 切换至开发分支,使用 git merge 合并本地分支,使用 git push 推送远程仓库。
  4. 切换至测试分支,使用 git pull 拉取最新代码。
  5. 使用 git merge develop 合并开发分支代码,使用 git push 推送远程仓库,部署测试。
  6. 测试完成,切换至 master 分支,使用 git pull 拉取最新代码。
  7. 使用 git merge test 合并测试分支代码,使用 git push 推送远程仓库,部署上线。
  8. 需要修复紧急线上 bug,在 master 分支新建紧急修复分支,修复问题直到完成。
  9. 使用 master 分支合并紧急修复分支,推送远程仓库并部署。
  10. 在紧急修复分支执行第 3 步操作。将代码同步至开发分支。

以上操作只会在 git rebase 时有可能会遇到代码冲突。所以上述所有 merge 操作都是快进操作。

git rebase -i 可以修改提交记录,具体可以查看官网教程 - 重写历史。应该只对本地分支进行操作。

Commit Message 规范

Commit message 一般包括三部分:Header、Body 和 Footer。

Header

type(scope):subject  
feat(表格): 增加表格下载功能  

Body

对本次 commit 的详细描述,可分多行

Footer

配置 Commit 提示工具

首先,全局安装工具:

cnpm install commitizen cz-conventional-changelog-chinese -g  

生成配置文件:

echo '{ "path": "cz-conventional-changelog-chinese" }' > ~/.czrc  

提交时使用 git cz 代替 git commit

⚠️ 注意要使用命令行进行代码提交,不要再使用 vscode 中的 Git 提交功能 (这个还是 git commit)

为项目加入提交信息检查

为项目增加提交时 Eslint 检查和修复

​ ⚠️ 只会校验和修复暂存区中的文件,如果想修复本地,可以执行 npx eslint --fix --ext .js,.jsx,.ts,.tsx,.vue src

  1. 安装依赖
cnpm i lint-staged --save-dev  
  1. 生成配置文件 .lintstagedrc
echo '{  
  "src/**/*.{js,jsx,txs,ts,vue}": "eslint --fix"  
}' > .lintstagedrc  
  1. 配置 .huskyrc,增加预提交钩子

    "hooks": {  
    "pre-commit": "lint-staged --no-stash"  
    }  
  2. 配置完成后,提交代码时会自动做 Eslint 检查和修复,此步骤如果无法通过则需要重新提交代码。

    1. 如有错误性 (errors) 问题,需要解决错误重新提交。
    2. 如有提示性 (warning) 问题(代码格式化),会自动修复并将修改暂存(只是暂存,还是需要重新提交代码)。