前沿
关于Git的文章太多了,很多开发多多少少都会,今天我根据我的日常经验,输出一些软文,尽量不去搬一些常用的Git命令来糊弄大家,把我认为比较重要而且有意义的东西输出给大家,另外对于Git之外的常用的一些技巧也简单整理了一下。
本地推送到远程
一般我们开发的时候,直接克隆远程仓库,这个比较容易,拿到http地址,甩手就是一个git clone http:xxxx完事,但是,如果我们本地已经存在一个项目,想要推送到远程已有的仓库,这个经常遇到,怎么做。
git init
git remote add origin https://github.com/JackySoft/marsview.git
git add .
git commit -m "Initial commit"
git push -u origin master
关键在于需要使用git remote add origin添加一个远程地址。
账号配置
在公司开发项目或者Github推送项目,建议先把个人的git账号配置好,当提交以后,别人可以查到你的提交记录。 同时,如果你的本地邮箱跟Github邮箱不一致,会导致你不会成为Contributor,这个还是非常重要的。
最近有粉丝发现了Marsview的一些问题,于是提交了PR给我,但是最终没有变成Contributor,就是因为本地Git配置有问题。
全局配置
全局配置一般用于公司项目,建议进到公司以后,优先配置个人的公司账号。
git config --global user.name "张三"
git config --global user.email "zhangsan@marsview.cc"
局部配置
局部配置一般用于个人GitHub项目,这个只需要进入到个人项目根目录执行命令即可。
git config user.name "jackysoft"
git config user.email "jackysoft@marsview.cc"
VSCode工具使用
如果你对Git操作命令不熟悉,不妨试试VsCode的Git工具,非常强大,也节约时间。
查看更改记录
提交代码
输入修改备注,点击提交即可,提交的时候,如果想要日志更加规范,可以遵循一些习惯。
撤回提交
点击项目右侧三个点,选择commit,点击【撤销上一次提交】即可。
同样,针对切换分支、合并分支等等都一样,大家去用一下就会了,当然肯定有不少高手不喜欢用工具,这些都是介绍给对命令不熟悉的同学看的,因为不管用什么,效率才是王道。
日志提交规范:
- feat: 加入新特性
- fix: 修复bug
- improvement: 在现有特性上的改进
- docs: 更改文档
- style: 修改了代码的格式
- refactor: 代码重构,不包含 bug 的修复以及新增特性
- perf: 提升性能的改动
- test: 测试用例的改动
- build: 改变了构建系统或者增加了新的依赖
- ci: 修改了自动化流程的配置文件或者脚本
- chore: 除了源码目录以及测试用例的其他修改
- revert: 回退到之前的一个 commit
使用一个好的规范,会让人赏心悦目,建议适当遵循提交规范。
克隆问题
如果你是第一次克隆公司项目,常规来讲,一般用http协议,但是第一次往往需要输入账号密码,第二次就不需要了。如果你不想输入账号密码,可以试试ssh://xxx协议,这种克隆需要在gitlab或者github配置公钥。
一、本地生产密钥
ssh-keygen -t rsa -C "xxx@marsview.cc"
二、复制本地公钥
id_rsa.pub
三、打开Github
点击右上角点击新建【New SSH Key】,把公钥复制进去即可。
以后通过ssh://xxx克隆项目和推送提交,就不需要账号密码了。
公司分支规范
在公司做项目的过程中,分支规范也很重要,举个例子,团队5个人在同一个项目里面建了5个分支,今晚上线,如果我们上线用release分支,那我们需要把代码都合并进去,但是如果晚上10点,测试发现了问题,无法解决,需要回滚,此时怎么办?
有人可能会说,那就代码也回滚。 的确,代码回滚是一个办法,但是有操作风险,对于不熟悉的人来说,很困难。
也有人会说,发布系统都自带的有回滚功能。的确,借用发布系统的回滚也没问题,但是如果第二天又要Bug需要发布怎么办,release已经被污染了。
根据我的个人经验,为了很好的解决这个问题,我琢磨了一套分支规范:
| 分支 | 介绍 | 环境 |
|---|---|---|
| master | 仓库默认分支,暂不使用 | - |
| release | 线上保护分支 | PRD |
| release-pre | 预发环境分支,用于QA做固定Pre测试 | Pre |
| test | 测试环境分支,用于QA做固定Test测试 | Test |
| feature/xxx | 功能开发分支 | Dev/Test |
| hotfix/xxx | 热修复分支 | Pre/Prd |
| release-2024xxx | 上线分支;上线当日部署到Pre进行验证,通过以后直接作为上线分支使用 | Pre/Prd |
没错,我们每次上线的当天,必须创建一个release-20240816这样的上线分支,其他5个人都把个人feature/xxx合并到上线分支,如果验收无误,第二天直接合并到release即可。 倘若当天上线失败,我们只需要废弃改分支即可,我们可以创建无数个上线分支,这样既不会污染release,又能解决线上回滚问题,一举两得。
代码写一半,需要切换分支怎么办?
大家应该都有这样的经历,我写了一半,突然Leader找我需要修复一个问题发到线上,此时,我相信大部分同学都是直接把本地开发的一堆文件提交到仓库,然后切换分支,等到第二天已经忘了改了什么了,除非你去看commit日志,有没有更好的办法?
答案就是git暂存:git stash
操作命令:
# 缓存本地开发文件
git stash
# 取出最后一条缓存记录并删除
git stash pop
# 查看所有缓存列表
git stash list
# 应用某一条缓存
git stash apply stash@{index}
git stash就是临时保存,等你忙完手里事情以后,在回来,把临时的代码还原,这样可以非常完美的看到刚刚改的代码记录。
拉取方式
代码拉取其实有两种方式,一种是合并拉取,一种是变基拉取,很多人可能对于变基不太了解,然后首次使用的时候,执行git pull命令,可能会给你提示,让你选择拉取方式,我建议对git不熟练的人,选择merge的方式。
所以,进到公司,克隆仓库以后,除了设置个人的git账户,再设置一下拉取方式:
git config pull.rebase false
关闭变基以后,会默认使用代码合并的方式来拉取仓库,什么意思呢?就是假设你本地也有提交,别人也有提交,你需要更新被人的代码,所以要执行git pull,那此时会把你们的代码执行合并操作,这是最保险的,无非是多生产一个提交记录,假设有冲突,你解决冲突也非常容易,因为vscode有冲突对比。
合并分支
如果使用vscode工具的话,直接ctrl shift + P 会弹出菜单,选择merge,然后选择要合并的分支,注意此处是选择要把哪个分支合并到当前分支。
当然有些同学会使用命令,可能觉得命令更快,每个人都有自己的习惯,无可厚非,命令操作:
# 先切换到当前分支
git checkout main
# 合并feature/add分支到本地main分支
git merge feature/add
我个人觉得,使用工具更快,因为如果冲突了,工具会非常直观的把冲突代码拉出来,两边对比,你只需要选择保留或者删除即可。
回滚
回滚一般分为软回滚或者硬回滚,软回滚就是撤回本地提交的代码,你可以做二次修改,然后在强制推送上去。硬回滚就直接把远程代码也撤销了,而且也无法找回,这种就需要慎用。
软回滚
git reset --soft <commit version>
这种方式是最优雅的,撤回以后,代码会暂存在本地,你做二次编辑以后,再次提交上去,但是此时提交的时候,必须使用git push --force强力推上去,因为本地跟远程已经有冲突了。
硬回滚
git reset --hard <commit version>
这种方式比较暴力,如果你拿不定,最好不要用。
当然还有一种方式,就是使用git revert <commit version>,这种方式也是软回滚,只不过会多提交一次记录上去,同时保留以前错误的提交记录,方便你做对比。
题外话
镜像使用
在公司做项目时,我们一般会使用npm或者yarn或者pnpm安装依赖,但是如果你没有科学上网的工具,对于一些境外的插件,可能会安装失败,此时就需要使用镜像。
默认会使用npm官方镜像安装依赖插件,也可以手动设置镜像。
官方默认镜像:
https://registry.npmjs.org
手动指定淘宝镜像:
npm install react --registry=https://registry.npmmirror.com
但是,我不推荐这样的方式,建议在项目根目录创建一个.npmrc文件,用来统一设置镜像。
registry=https://registry.npmmirror.com
创建.npmrc文件,设置镜像后,以后每次安装依赖,都会自动使用该镜像,而且不管你是npm还是yarn还是pnpm都会使用该镜像安装插件。
别名使用
在开发项目的时候,我们会使用import xxx from './../../xxx'这样的路径查找,我们建议尽量给项目设置alias别名,使用import xxx from '@/xxx的方式。
vue.config.js
...
configureWebpack: {
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'@components': path.resolve(__dirname, 'src/components'),
},
},
}
...
vite.config.js
...
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
}
...
jsconfig 使用
为什么要配置jsconfig.json文件?我们上面已经使用了alias配置了路径别名,但是,我们使用鼠标是无法点进去的,也就是打不开对应的文件,这样的开发体感是非常差的,所以我们需要创建一个jsconfig.json或者tsconfig.json文件。
jsconfig.js
{
"compilerOptions": {
"baseUrl": ".",
"module": "commonjs",
"paths": {
"@/*": [
"./src/*"
]
}
},
"vueCompilerOptions":{
"target": 2
},
"checkJs": false,
"include": [
"src/**/*"
],
"exclude": [
"node_modules/**/*"
]
}
tsconfig.json
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
},
/* Linting */
"strict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noFallthroughCasesInSwitch": true
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }],
"exclude": ["node_modules", "lib", "es", "dist", "typings", "test", "docs", "tests"]
}
尤其是这段代码:
{
...
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
...
}
总结
以上就是我个人在日常工作中,对于Git的一些使用经验,可能不一定适合每个人,只是把我的经验分享给有需要的人,少走一些弯路,另外,我这边关于Git操作命令,有一个非常好的图,献给大家。