案例

  1. hhhh5为例,讲解前端资源发布上线的整个流程。<br /> # clone下仓库,开始开发<br /> $ git clone git@gitlab.****.com:fe/h5.git<br /> # 切换到计划发布的分支版本,格式为 daily/x.y.z<br /> $ git checkout daily/1.0.1<br /> # 开发完成后提交修改代码<br /> $ git add *<br /> $ git commit -m 'feat: 完成了某个新功能'<br /> # 将代码push到gitlab daily环境<br /> $ git push origin daily/1.0.1<br /> # 打publish tag将代码发布到CDN<br /> $ git tag publish/1.0.1<br /> # 也可以使用 git push --tag 命令<br /> $ git push origin publish/1.0.1<br /> 以上步骤可以使用 fie 的命令替代:
  2. # 按规范的格式提交到gitlab<br /> $ fie commit<br /> # 发布到daily环境<br /> $ fie publish d<br /> # 发布到 CDN环境<br /> $ fie publish<br /> assets对应规则

前端资源发布流程说明:

  1. 前端代码均托管在gitlab上,通过打 publish tag 发布到CDN环境。<br /> 前端代码均使用非覆盖式发布方式,严禁覆盖式发布方式。<br />发布到CDN时,打的publish tag 必须与 daily分钟版本号一致。比如当前开发的分支是:daily/1.0.1,那边如果需要将该分支发布到CDN,则需要打对应的publish/1.0.1 tag。<br />CDN访问路径与gitlab路径一致。

安装Git

git下载地址:git-scm.com/download

Git的使用流程:
拉取代码 → 开发前更新代码到最新版本 → Coding → 提交代码到仓库

Git日常操作 - 图1

Git配置

设置用户名与邮箱

  1. git config --global user.name " Name"
  2. git config --global user.email "my@email.com"

上面设置命令中带了“–global”参数,是全局配置,影响本机上所有的git项目。也可以对一些单独的项目进行设置,进入要设置的项目目录进行设置:

  1. cd aliyun
  2. git config user.name "Name"
  3. git config user.email "my@email.com"

查看配置:

  1. cat .git/config

创建Git仓库及日常操作

创建git仓库

  1. mkdir project
  2. cd project
  3. git init #在当前的目录下初始化创建git仓库

检出仓库:

  1. git clone 地址

查看远程仓库:

  1. git remote -v

添加远程仓库:

  1. git remote add [name] [url]

删除远程仓库:

  1. git remote rm [name]
  2. git push origin master

修改代码操作

更新本地代码到最新版本:

  1. git fetch

合并更新后的代码到本地:

  1. git merge

更新代码2 (git pull是git fetch和git merge的组合):

  1. git pull

修改代码后,查看已修改的内容:

  1. git diff --cached

将新增加文件加入到git中:

  1. git add file1 file2 file3

所有文件全部加入到git中:

  1. git add .

从git中删除文件:

  1. git rm file1
  2. git rm -r dir1

提交修改:

  1. git commit -m 'new feature - #新功能'
  2. Commit type
  3. bug fix - 组件 bug 修复;
  4. breaking change - 不兼容的改动;
  5. new feature - 新功能
  6. Commit 类型,建议如下:
  7. feat: 新特性
  8. fix: 缺陷修复
  9. docs: 文档相关
  10. style: 样式修改、错别字修改、格式化等
  11. refactor: 重构
  12. perf: 性能提升
  13. test: 增加测试
  14. chore: 业务无关修改,如:发版、构建工具链修改等

提交修改到远程仓库,团队成员就能更新到这些功能

  1. git push <远程主机名> <本地分支名>:<远程分支名>

git分支(branch)

创建sprint分支:

  1. git branch sprint

查看仓库有几个分支:

  1. git branch
  2. //*号为当前所在分支
  3. sprint
  4. * master

切换分支:

  1. //切换到sprint分支
  2. git checkout sprint

查看master分支和sprint分支差异:

  1. git diff sprint

合并sprint分支到master分支:

  1. git merge branchname

删除分支:

  1. git branch -d sprint
  2. 如果要删除的分支没有被合并到其它分支中去,那么就不能用“git branch -d”来删除它,需要改用“git branch -D”来强制删除。

将分支推送到远端仓库:

  1. git push origin <branch>

删除远程分支:

  1. git push origin --delete <branch>

打标签(Tag)

git可以对某一时间点上的版本打上标签。如在发布某个软件版本(比如 v0.0.1等),可以打版本标签。

列出已有的标签:

  1. git tag

打标签:

  1. git tag -a v0.0.1 -m 'tag version 0.0.1'

把本地tag推送到远程:

  1. git push --tags

删除tag:

  1. git push origin --delete tag <tagname>

Git 默认大小写不敏感问题:

Git 默认大小写不敏感,现在你本地和远程文件名不一样,Git 能工作,但云构建是 Linux 的,它是大小写敏感的,所以在 liunx 上找不到包了。

  1. git config core.ignorecase false

其它常用命令

显示commit内容:

  1. git log

不仅显示commit内容,同时显示每次commit的代码改变:

  1. git log -p

查看当前仓库的状态:

  1. git status

查看当前分支所有提交者及其次数:

  1. git log | grep "^Author: " | awk '{print $2}' | sort | uniq -c | sort -k1,1nr


挑拣提交:

  1. git cherry-pick 它会获取某一个分支的单笔提交(比如 fix bug),并作为一个新的提交引入到你当前分支上。

代码回滚:

  1. git revert HEAD
  2. 你也可以revert更早的commit,例如:
  3. git revert HEAD^
  4. git revert 是生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留
  5. git reset 是回到某次提交,提交及之前的commit都会被保留,但是此次之后的修改都会被退回到暂存区
  6. $ git reset --hard HEAD^ 回退到上个版本
  7. $ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前
  8. $ git reset --hard commit_id 退到/进到 指定commitsha
  9. 抛弃本地所有的修改,回到远程仓库的状态。
  10. git fetch --all && git reset --hard origin/master
  11. 解决修改同一个文件的冲突
  12. rm .git/MERGE_HEAD

重置修改的内容

  1. git reset --hard

查看某一个文件的修改历史:

  1. git blame -L4,4 src/pages/Account/List/components/index.js

查看最新版本和上一个版本的差异(一个^表示向前推进一个版本)

  1. git diff HEAD HEAD^

git取消已经缓存的文件(慎用):

  1. git reset

git恢复删除了的文件

git pull 从git服务器取出,并且和本地修改merge, 类似于SVN up,但是对删除的文件不管用,恢复删除文件用

  1. git checkout -f

Git发布

Gitlab工作流:
Git仓库中master分支(受保护)没有权限直接push。所有的开发都在daily分支上进行。daily分支的命名为daily/x.y.z,其中x.y.z是以数字或者点符号组成的字符串,用来标记版本,如1.2.1 、20180401。
每当开始一个项目,本地启动一个daily/x.y.z分支,在本地分支上进行开发。
本地分支开发完成,需要发布到日常环境测试或者联调时,推送 dayly/x.y.z分支到gitlab。gitlab将通过hook将代码实时发布至日常环境。
联调完成,通过测试,需要最终发布上线时,给 daily/x.y.z分支打标签(又叫做tag或者里程碑) publish/x.y.z。推送该标签到gitlab服务器,做一系列检查后,最后部署文件到CDN。一旦一个daily分支被发布。服务端将删除远程daily分支,并且拒绝再次被推送此版本号。这样做的目的是保证版本号不会重复发布。
修改线上Bug时,需要重新拉出daily分支,并且以新的版本号发布。

将代码clone到本地

  1. git clone {{giturl}}

通过git branch -a查看远程分支。

如果已经有的话,假如是daily/1.0.0

通过:

  1. git checkout daily/1.0.0

将远程的分支拉到本地

更新分支:

  1. git pull origin daily/1.0.0
  1. daily发布push 一个形如 daily/x.y.z 的分支。如

    1. git push -u origin daily/1.0.0
  2. daily 验证build 目录中的文件将发布到 //g-assets.daily.taobao.net/{group}/{app}/{tag}/。如可重复 push 此预发分支,每 push 一次则发布 daily 一次,路径不变,版本不变。

    1. http://g.assets.daily.taobao.net/git-group/project/x.y.z/***.js
  3. 线上发布,push 一个形如 publish/x.y.z 的 tag。如

    1. git tag publish/1.0.0
    2. git push origin publish/1.0.0
  4. 线上验证,build 目录中的文件将发布到 http://g.alicdn.com/git-group/git-project/x.y.z/[pageName].j。如

    1. http://g.alicdn.com/git-group/git-project/x.y.z/[pageName].js

版本号尽量遵守Semantic Versioning