赞
踩
祖师爷 Linus 在创造了伟大的 Linux 之后,又创造了应用最广泛的代码管理工具 —— Git,极大地提高了程序员的生产力。 现如今大部分项目都在使用 Git 作为代码管理工具,不论是在代码管理、版本控制以及团队协作上,Git 相比其他版本控制软件都有着无可比拟的优势。
虽然 Git 是个优秀的工具,但是在项目中是否能够正确合理地使用,是否能够发挥其最大的优势,就我自己这几年的工作经历来看,对于大部分团队这个问题的答案是否定的。
大部分程序员对 Git 的使用基本上都停留在 git add、git commit、git push、git pull 这几个指令上,而且大部分团队也没有 Git 规范,提交信息充斥着大量的 “fix”、“update”,分支管理也很混乱,代码提交哪个分支上也没具体的规定,导致在团队协作过程中经常出现代码合并后谁的代码不见了,修过的 bug 在新版本又出现了……
0. 我们可能面临的问题
试想遇到以下这些问题,你会采取怎样的方式去解决:
以上这些问题在我们的项目中都是会或多或少出现的,部分问题可能涉及到的是对 Git 的功能是否熟悉的问题,大部分问题则是涉及到一个项目的 Git 使用规范问题,如果有一个很好的规范,在项目中合理地使用 Git,很多问题压根就不是问题。
1. Git 规范的必要性
既然认同需要一份 Git 规范,那么这个规范需要规范哪些内容,解决哪些问题,又带来哪些好处呢?个人认为有以下几点:
1. 分支管理
2. 提交记录的可读性
3. 团队协作
以上就是一份 Git 规范的作用和使命。
接下来结合 Git-Flow 和个人实际的项目经验,总结了一份项目中使用 Git 的规范,其中大部分内容都是对 Git-Flow 进行一个解读和扩展,告诉大家为什么这么做以及怎么做。
以下就是 Git-Flow 的经典流程图:
如果你熟悉 Git-Flow,那么你对上图中的各种分支和线应该都能够理解,如果你之前没了解过相关的知识,那你可能会有点懵,不过在读完本文之后再看这张图,应该就能够理解了。
2. 分支管理规范
2.1 分支说明和操作
以上就是在项目中应该出现的分支以及每个分支功能的说明。 其中稳定长期存在的分支只有 master 和 develop 分支,别的分支在完成对应的使命之后都会合并到这两个分支然后被删除。简单总结如下:
2.2 分支间操作注意事项
在团队开发过程中,避免不了和其他人一起协作, 同时也会遇到合并分支等一些操作,这里提交 2 个个人觉得比较好的分支操作规范。
首先看一张图:
看到这样的 提交线图,想从中看出一条清晰的提交线几乎是不可能的,充满了 Merge remote-tracking branch 'origin/xxx' into xxx 这样的提交记录,同时也将提交线弄成了交错纵横的图,没有了可读性。
这里最大的原因就是因为默认的 git pull 使用的是 merge 行为,当你更新代码时,如果本地存在未推送到远程的提交,就会产生一个这样的 merge 提交记录。因此在同一个分支上更新代码时推荐使用 git pull --rebase。
下面这张图展示了默认的 git pull 和 git pull --rebase 的结果差异,使用 git pull --rebase 目的是修整提交线图,使其形成一条直线。
默认的 git pull 行为是 merge,可以进行如下设置修改默认的 git pull 行为:
# 为某个分支单独设置,这里是设置 dev 分支git config branch.dev.rebase true# 全局设置,所有的分支 git pull 均使用 --rebasegit config --global pull.rebase truegit config --global branch.autoSetupRebase always
这里需要说明一下,在我看来使用 git pull --rebase 操作是比较好的,能够得到一条很清晰的提交直线图,方便查看提交记录和 code review,但是由于 rebase 会改变提交历史,也存在一些不好的影响。这里就不做过多的讨论了,有兴趣的话可以移步知乎上的讨论:在开发过程中使用 git rebase 还是 git merge,优缺点分别是什么?
# 例如当前在 develop 分支,需要合并 feature/xxx 分支 git merge --no-ff feature/xxx
在解释这个命令之前,先解释下 Git 中的 fast-forward: 举例来说,开发一直在 develop 分支进行,此时有个新功能需要开发,新建一个 feature/a 分支,并在其上进行一系列开发和提交。当完成功能开发时,此时回到 develop 分支,此时 develop 分支在创建 feature/a 分支之后没有产生任何的 commit,那么此时的合并就叫做 fast-forward。
fast-forward 合并的结果如下图所示,这种 merge 的结果就是一条直线了,无法明确看到切出一个新的 feature 分支,并完成了一个新的功能开发,因此此时比较推荐使用 git merge --no-ff,得到的结果就很明确知道,新的一系列提交是完成了一个新的功能,如果需要对这个功能进行 code review,那么只需要检视叉的那条线上的提交即可。
关于以上两个分支间的操作建议。
2.3 项目分支操作流程示例
这部分内容结合日常项目的开发流程,涉及到开发新功能、分支合并、发布新版本以及发布紧急修复版本等操作,展示常用的命令和操作。
git checkout developgit pull --rebase
git checkout -b feature/xxx...git add git commit -m "feat(xxx): commit a"git commit -m "feat(xxx): commit b"# 其他提交...
如果此时 develop 分支有一笔提交,影响到你的 feature 开发,可以 rebase develop 分支,前提是 该 feature 分支只有你自己一个在开发,如果多人都在该分支,需要进行协调:
# 切换到 develop 分支并更新 develop 分支代码git checkout developgit pull --rebase# 切回 feature 分支git checkout feature/xxxgit rebase develop# 如果需要提交到远端,且之前已经提交到远端,此时需要强推(强推需慎重!)git push --force
上述场景也可以通过 git cherry-pick 来实现,有兴趣的可以去了解一下这个指令。
# 切到 develop 分支,更新下代码git check developgit pull --rebase# 合并 feature 分支git merge feature/xxx --no-ff# 删除 feature 分支git branch -d feature/xxx# 推到远端git push origin develop
# 当前在 develop 分支git checkout -b release/xxx# 在 release/xxx 分支进行 bug fixgit commit -m "fix(xxx): xxxxx"...
# master 分支合并 release 分支并添加 taggit checkout mastergit merge --no-ff release/xxx --no-ff# 添加版本标记,这里可以使用版本发布日期或者具体的版本号git tag 1.0.0# develop 分支合并 release 分支git checkout developgit merge --no-ff release/xxx# 删除 release 分支git branch -d release/xxx
至此,一个新版本发布完成。
# 当前在 master 分支git checkout master# 切出 hotfix 分支git checkout -b hotfix/xxx... 进行 bug fix 提交# master 分支合并 hotfix 分支并添加 tag(紧急版本)git checkout mastergit merge --no-ff hotfix/xxx --no-ff# 添加版本标记,这里可以使用版本发布日期或者具体的版本号git tag 1.0.1# develop 分支合并 hotfix 分支(如果此时存在 release 分支的话,应当合并到 release 分支)git checkout developgit merge --no-ff hotfix/xxx# 删除 hotfix 分支git branch -d hotfix/xxx
至此,紧急版本发布完成。
3. 提交信息规范
git commit 格式 如下:
():
各个部分的说明如下:
feat(detail): 详情页修改样式fix(login): 登录页面错误处理test(list): 列表页添加测试代码
这里对提交规范加几点说明:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。