thumbnail
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.开发阶段

  1. 除了master分支创建一个供所有开发人员开发的dev分支

  2. 开发人员在dev分支上进行工作,随时随地commit,每天push一次到服务器

  3. push代码前需要进行pull操作,因为有可能在之前有别的成员先进行了push操作,如果有冲突还需要进行冲突解决

  4. 每天上班后所有成员对dev进行pull操作,获取所有成员push的代码,有冲突需要解决

  5. 团队Leader每天将dev合并一次到master

  6. 每周代码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/za/b/za/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

上一篇
下一篇