GIT命令行常用操作与COMMIT规范提交记录
GIT操作记录
结合了官方文档和一些博主的分享内容,并根据公司的GIT操作要求在这里总结了一篇比较简要的文章,希望多多少少可以帮到大家
一、COMMIT 提交规范
每次提交都应该编写提交日志,用于说明本次提交的内容,提高大家研发效率,这里总结了一些提交规范
Header部分:<type>(<scope>): <subject>
// 空行
Body部分
// 空行
Footer部分
Header部分
包括了两个必填字段,type和subject
type:必须
主要的type
feat:新增的功能(feature)
fix/to:修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。
- fix:产生diff并自动修复此问题。适合于一次提交直接修复问题
- to:只产生diff不自动修复此问题。适合于多次提交。最终修复问题提交时使用fix
特殊的type
docs:文档或者注释的编写(documentation)
style:编码规范、风格格式(不影响代码运行以及功能)
refactor:代码重构(不涉及新增功能和bug改动)
build: 构造工具的或外部依赖的改动(例如webpack,npm)
revert:回滚到上一个版本
其他的type
test:增加测试
perf:优化(比如提升性能、体验)
chore:构建过程或辅助工具的变动
merge:代码合并
sync:同步主线或分支的Bug
scope:可选
用于描述改动的范围,格式为项目名/模块名,也可以填写控制层之类的
subject:必须
本次提交的简短描述,50个字符以内即可
Body部分
用于详细描述本次的commit,对于小的修改不作要求,但是对于重大需求、更新等必须添加body来作说明
二、分支管理
1.开发阶段
-
除了master分支创建一个供所有开发人员开发的dev分支
-
开发人员在dev分支上进行工作,随时随地commit,每天push一次到服务器
-
push代码前需要进行pull操作,因为有可能在之前有别的成员先进行了push操作,如果有冲突还需要进行冲突解决
-
每天上班后所有成员对dev进行pull操作,获取所有成员push的代码,有冲突需要解决
-
团队Leader每天将dev合并一次到master
-
每周代码review
2.上线阶段
上线阶段需要定期发布版本,需要保障以下几点
-
避免未完成的功能点进入生产环境。
-
避免明显代码BUG进入生产环境
-
避免测试不充分的代码进入生产环境
此时工作流采用类似GitHub Flow模式
- 仅有一个主分支master并且是受保护分支
- 不能随意在master上提交代码
- master上的代码都是干净并随时可发布部署的代码
开发分支,包括feature(新功能分支)、hotfix(Bug修复分支)
- 这两个分支只在需同时从 master 分支创建
- 在完成之后合并到 master 分支并删除该分支
- 这几类分支的名称应该遵循一定的命名规范,以方便开发人员识别
开发人员日常操作流程
1、每周会议讨论生产环境发现的BUG和需要新增的feature
2、从master创建对应hotfix、feature分支
3、在新分支上进行代码开发,可能由多个人员完成,在分支上进行commit和测试
4、测试完成确认分支代码完成后将分支push到remote
5、在gitlab上创建merge request
6、团队Leader在gitlab上审核代码,可进行评论或提出修改意见,确认代码合理性后将代码合并入master
三、GIT命令行操作
新建与配置
# 初始化与克隆项目
$ git init
$ git init [projectName]
$ git clone [url]
# 配置信息列表
$ git config --list
# 配置用户名和邮箱
$ git config --global user.name "name"
$ git config --global user.email "email"
远程仓库
显示
# 显示所有远程仓库
$ git remote -v
# 显示指定远程仓库信息
$ git remote show [remote]
# 远程仓库重命名 origin -> pb
$ git remote rename origin pb
获取 fetch
# 下载远程仓库变动
$ git fetch [remote]
拉取 pull
# 拉取远程仓库变化与本地分支合并
$ git pull [remote] [branch]
推送 push
# 推送本地指定分支到远程仓库
$ git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
# 推送所有分支到远程仓库
$ git push [remote] --all
代码操作
代码状态与历史记录
# 代码状态
$ git status
$ git status -s
# 查看暂存前后变化,暂存区与工作区的差异
$ git diff
# 查看已暂存起来的变化
$ git diff --cached
# 显示近3次历史提交,可查看提交的差异
$ git log -p -3
# 显示某次提交原内容与变化的内容
$ git show [commit]
# 显示当前分支最近几次提交
$ git reflog
# 统计今天你写的代码字数
$ git diff --shortstat "@{0 day ago}"
暂存区
# 添加文件到暂存区,未被跟踪的会被跟踪并放入暂存区
$ git add [file1] [file2] ...
# 添加指定目录包括子目录到暂存区
$ git add [dir]
# 添加当前目录所有文件至暂存区
$ git add .
# 删除工作区文件,并将删除放入暂存区
$ git rm [file1] [file2] ...
# 停止跟踪指定文件,文件会保留在工作区
$ git rm --cached [file]
# 改名,并放入暂存区
$ git mv [file-from] [file-to]
重置操作
# 重置暂存区文件,与上次commit保持一致
$ git reset [file]
# 重置暂存区与工作区,与上次commit保持一致
$ git reset --hard
# 重置当前分支的指针为某次commit,同时重置暂存区,工作区不变
$ git reset [commit]
# 重置当前分支HEAD为某次commit,同时重置暂存区与工作区
$ git reset --hard [commit]
# 重置当前分支HEAD为某次commit,保持暂存区与工作区不变
$ git reset --keep [commit]
提交至仓库
# 提交暂存区文件到仓库区
$ git commit -m [message]
$ git commit [file1] [file2] ... -m [message]
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
分支操作
查看分支
# 列出所有本地和远程分支
$ git branch -a
# 列出本地分支
$ git branch
# 列出远程分支
$ git branch -r
增删换
# 新建分支
$ git branch [branch]
# 新建分支并切换到该分支
$ git checkout -b [branch]
# 切换到指定分支
$ git checkout [branch]
# 删除分支
$ git branch -d [branch]
# 合并指定分支到当前分支
$ git merge [branch]
忽略文件
.gitignore
的文件,列出要忽略的文件模式
$ cat .gitignore
为仓库设置好 .gitignore 文件,以免将来误提交这类无用的文件
格式规范:
- 所有空行或者以
#
开头的行都会被 Git 忽略 - 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中
- 匹配模式可以以(
/
)开头防止递归 - 匹配模式可以以(
/
)结尾指定目录 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反
glob 模式: shell 所使用的简化了的正则表达式。
- 星号(
*
)匹配零个或多个任意字符 [abc]
匹配任何一个列在方括号中的字符 (要么匹配一个 a,要么匹配一个 b,一个c)- 问号(
?
)只匹配一个任意字符 [0-9]
表示匹配所有 0 到 9 的数字,方括号中使用短划线, 表示在这两个字符范围内的都可以匹配- 两个星号(
**
)表示匹配任意中间目录,比如a/**/z
可以匹配a/z
、a/b/z
或a/b/c/z
等
狙个栗子:
# 忽略所有的 .md 文件
*.md
# 跟踪所有的 README.md,即便你刚刚忽略了 .md 文件
!README.md
# 只忽略当前目录下的 log 文件,而不忽略 其他目录/log
/log
# 忽略任何目录下名为 dist 的文件夹
dist/
# 忽略 doc 紧挨着的子目录下的 txt类型文件
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 pdf 文件
doc/**/*.pdf
总结
啊啊啊,我还是用可视化操作工具吧,Sourcetree、Tortoise、Github Desktop