git日常操作
- 在 gh-pages 显示: git push origin master:gh-pages (http://[name].github.io/[xxx])
查看版本·
- 查看: git head
- 查看某个版本: git head~2/3/*
- 查看指定版本: git show sha-1
- 查看引用日志: git reflog
删除
- 删除:git rm
- 删除文件夹: git rm -r
打标签
- 查看标签: git tag
- 查看标签详细信息:git tag -ln
- 新建标签: git tag -a v1.0 -m '...'
- 推送标签: git push origin v1.0
- 删除标签: git tag -d v1.0
- 删除远程标签:git push origin --delete tag
<branchName>
- 拉取标签: git checkout -b
<branch_name>
<tag_name>
- 获取上游标签:git fetch upstream tag
<tag_name>
- 将相关的分支也推送到仓库上:git push --follow-tags origin master
合并/分支
- 查看分支: git branch
- 生成并切换分支: git checkout -b dev
- 删除分支: git branch -d dev
- 合并分支: git merge dev (dev 分支 commit 后,切换别的分支,再合并)
- 删除远程分支:git push origin --delete
<branchName>
- 分支重命名:git branch -m old new
日志
- 查看日志:git log
- 查看日志(美化版):git log --graph --pretty=oneline
- 查看日志(终极美化版,head 信息减少):git log --graph --pretty=oneline --abbrev-commit
- 查看差异:git diff
- 查看缓存区的差异: git diff --cached
- 查看文件修改情况: git log —stat
- 查看某次记录: git show ${VERSION}
- git commit --amend,当你 commit 后,再修改,使用此命令,不会多一个 commit 记录
- 记录一行显示:git log —online
回滚
- 回滚:git revert HEAD
- 回滚报错取消:git revert --abort
git revert head
会返回上一个版本, 如果要跳到某个版本的话,会造成冲突,有个方法,一级级进行回滚,就不会造成冲突
清空缓存区:git reset
清除缓存区: git reset --hard
git add .
后,使用git reset --hard
会清掉这次添加的记录,并且文件也会回滚(慎用),如果不加--hard
并不会丢失修改的文件内容
git reset --hard
后,想 push 到远程,要先 pull 远程代码下来,解决冲突,再提交,另外一种方法是用 git push origin master -f
强制推送,远程的代码就变成你推送时的代码
回到指定版本
使用 git revert head,一级级得进行回退
缓存(stash)
使用 stash 进行缓存文件,进行另外的开发
比如你在远程有一个 master 分支,你在本地 master 分支开发。当你正在开发的时候,接到一个紧急通知,要修改一个小 bug ,当你又不能把现在本地的代码提交上去,这时候使用 stash 解决
stash 不能把添加文件的操作进行缓存,而修改和删除的操作可以
- git stash(不会把新添加的文件进行缓存)
- git stash save -a (会把所有的文件进行缓存,包括 .gitignore)
- git stash save -u (不包括 .gitignore)
- git stash save 'msg' (添加文本)
- git add, git commit, git merge (修改 bug)
- git stash pop (把缓存代码恢复)
- 修改冲突(如果有冲突)
- 缓存代码: git stash
- 查看缓存代码列表: git stash list
- 恢复缓存代码并删除: git stash pop
- 恢复缓存代码: git stash apply
- 删除缓存代码: git stash drop
- 恢复特定的缓存代码: git stash pply stash@{0}
rebase
commit 合并操作
合并 top 几条的记录:git rebase -i HEAD~{number}
执行了 rebase 命令后,会出现编辑内容:
pick commitId feat 1
pick commitId feat 2
pick commitId feat 3
pick commitId feat 4
...
...
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
可以修改每行 commit 记录最左边的操作符,根据不同的操作符有不同的效果
PS: 多用于在自己的分支下,对多个 commit 记录进行合并
资料:
- [gitbase use](https://github.com/zuopf769/how_to_use_git/blob/master/使用git rebase合并多次commit.md)
忽略文件
.gitignore
如果要忽略某个原本已经在仓库的文件,要先删除它才行
typechange
git status | grep typechange | awk '{print $2}' | xargs git checkout
快速解决 typechange 问题
emoji
在 commit 使用 emoji 表情
git commit -m ':memo: 更新文档'
就会出现一个图标,详细的图标列表,在这链接里
git commit 规范化和 changelog 自动生成
![整个 commit 提交的流程图](http://ppev1tg5s.bkt.clouddn.com/md/git commit 流程.png)
git commit 规范化工具
参考链接
- cz-cli:用于规范化你的 commit 工具
- commit 规范 - 阮一峰:使用 angluar commit 规范,changelog 自动生成教程
- git hooks 介绍
- npm package.json 介绍
cz-cli 安装和使用
// 全局安装工具
npm install -g commitizen
// 全局安装适配器,可选
npm install -g cz-conventional-changelog
// 设置适配器,可选
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc
// 在项目中初始化适配器
commitizen init cz-conventional-changelog --save-dev --save-exact
// 在项目中安装依赖
npm i cz-conventional-changelog cz-conventional-changelog -D
// 提交代码
git add ./
git cz
commit 规范
以下内容,摘自阮一峰老师的文章,进行一定的删减、添加
Commit message 都包括三个部分:Header,Body 和 Footer
Header
包括三个字段:type
(必需)、scope
(可选)和subject
(必需)
type:
- feat:新功能(feature)
- fix:修补bug
- docs:文档(documentation)
- style: 格式(不影响代码运行的变动)
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- test:增加测试
- chore:构建过程或辅助工具的变动
scope:
用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同
比如我修改了用户模块,那就填写:用户模块/user module
subject:
commit 的简短描述,类似 title
- 以动词开头,使用第一人称现在时,比如
change
,而不是changed
或changes
- 第一个字母小写
- 结尾不加句号(
.
)
Body
Body 部分是对本次 commit 的详细描述,可以分成多行,使用 \n
进行换行
Footer
Footer 部分只用于两种情况
不兼容改动
如果当前代码与上一个版本不兼容,则 Footer 部分以
BREAKING CHANGE
开头,后面是对变动的描述、以及变动理由和迁移方法关闭 issue
Closes #234, #235
commit 校验
参考链接
安装使用
// 安装相关的依赖
npm install -D husky commit-msg @commitlint/{cli,config-angular}
// 新建配置文件
echo "module.exports = {extends: ['@commitlint/config-angular']};" > commitlint.config.js
配置 package.json 文件
// package.json
{
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
}
}
commitlint.config.js 配置参数
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
// Place your rules here
'scope-enum': [2, 'always', ['a', 'b']] // error if scope is given but not in provided list
}
}
{
"types": ["a", "b"], // 'type-enum': [2, 'always', ['a', 'b']]
"scope": {
"required": true, // 'scope-empty': [2, 'never']
"allowed": ["a", "b"], // 'scope-enum': [2, 'always', ['a', 'b']]; specify [0] for allowed: ["*"]
"validate": false, // 'scope-enum': [0], 'scope-empty': [0]
"multiple": false // multiple scopes are not supported in commitlint
},
"warnOnFail": false, // no equivalent setting in commitlint
"maxSubjectLength": 100, // 'header-max-length': [2, 'always', 100]
"subjectPattern": ".+", // may be configured via `parser-preset`, contact us
"subjectPatternErrorMsg": "msg", // no equivalent setting in commitlint
"helpMessage": "", // no equivalent setting in commitlint
"autoFix": false // no equivalent setting in commitlint
}
commitlint 配置项链接:
配置完后,当你提交 commit 就会触发 npm hooks ,对 commit 内容进行检验
changelog 自动生成
参考链接
安装使用
npm i -D standard-version
配置 package.json
{
"scripts": {
"release": "standard-version"
}
}
// use
npm run release -- --release-as 4.0.0 // 发布版本,并生成 changelog 和相关版本的 tag
git push --follow-tags origin master // 推送代码和 tag 到仓库
使用 standard-version
,会多生成一个 commit,是提交 changelog 内容的