Git 使用规范[转载]

一、user.name 配置

Git 的 user.name配置一定要使用自己的中文名称。命令行操作方式如下:

git config --global user.name "自己的中文名字"

二、commit 提交规范

每个提交要保证适当的颗粒度相关性独立性

  • 以一个小功能、小改进或一个 bug fix 为单位
  • 对应的 unit test 程序在同一个 commit
  • 无相关的修改不在同一个 commit
  • 语法错误的半成品程序不能 commit

三、Git 操作流程

团队开发中,遵循一个合理、清晰的 Git 使用流程,是非常重要的。否则,每个人都提交一堆杂乱无章的 commit,项目很快就会变得难以协调和维护。

第 1 步:新建分支

首先,每次开发新功能或修复 Bug,都应该新建一个单独的分支。

# 获取主干最新代码
$ git checkout develop
$ git pull --rebase

# 新建一个开发分支 branch-name
$ git checkout -b branch-name develop

注意:
branch-name 的命名规如下:

  • 功能开发,branch-name 应为feat-nfeat 是 feature(功能)的前四个字母,n 是一个数值对应于 Redmine 上功能编号,中间用横线连接。例如:feat-30,如下图所示:
  • Bug 修复,branch-name应为 fix-n。fix 是修复的意思,n 是一个数值对应于 Redmine 上 Bug 编号,中间用横线连接。

第 2 步:提交分支 commit

分支修改后,就可以提交 commit 了。

$ git add .
$ git status
$ git commit --verbose

git add 命令的 all 参数,表示保存所有变化(包括新建、修改和删除)。从 Git 2.0 开始,all 是 git add的默认参数,所以也可以用git add .代替。

git status 命令,用来查看发生变动的文件。

git commit 命令的 verbose 参数,会列出 diff 的结果。

第 3 步:撰写提交信息

Git commit message 的撰写规范,请参考:[[kmc:Commit message 和 Change log 编写规范]]

第 4 步:与主干同步

分支的开发过程中,要经常与主干保持同步。

$ git checkout develop
$ git pull --rebase

第 5 步:合并 commit

分支开发完成后,很可能有一堆 commit,但是合并到主干的时候,往往希望只有一个(或最多两三个)commit,这样不仅清晰,也容易管理。

那么,怎样才能将多个 commit 合并呢?这就要用到 git rebase 命令。

$ git checkout branch-name
$ git rebase -i HEAD~n

git rebase 命令的 i 参数表示互动(interactive),这时 git 会打开一个互动界面,进行下一步操作。n 代表变基操作的提交数量。

下面采用 Tute Costa 的例子,来解释怎么合并 commit。

pick 07c5abd Introduce OpenPGP and teach basic usage
pick de9b1eb Fix PostChecker::Post#urls
pick 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

上面的互动界面,先列出当前分支最新的 4 个 commit(越下面越新)。每个 commit 前面有一个操作命令,默认是 pick,表示该行 commit 被选中,要进行 rebase 操作。

4 个 commit 的下面是一大堆注释,列出可以使用的命令。

  • pick:正常选中
  • reword:选中,并且修改提交信息;
  • edit:选中,rebase 时会暂停,允许你修改这个 commit
  • squash:选中,会将当前 commit 与上一个 commit 合并
  • fixup:与 squash 相同,但不会保存当前 commit 的提交信息
  • exec:执行其他 shell 命令

上面这 6 个命令当中,squash 和 fixup 可以用来合并 commit。先把需要合并的 commit 前面的动词,改成 squash(或者 s)。

pick 07c5abd Introduce OpenPGP and teach basic usage
s de9b1eb Fix PostChecker::Post#urls
s 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend

这样一改,执行后,当前分支只会剩下两个 commit。第二行和第三行的 commit,都会合并到第一行的 commit。提交信息会同时包含,这三个 commit 的提交信息。

# This is a combination of 3 commits.
# The first commit's message is:
Introduce OpenPGP and teach basic usage

# This is the 2nd commit message:
Fix PostChecker::Post#urls

# This is the 3rd commit message:
Hey kids, stop all the highlighting

如果将第三行的 squash 命令改成 fixup 命令。

pick 07c5abd Introduce OpenPGP and teach basic usage
s de9b1eb Fix PostChecker::Post#urls
f 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend

运行结果相同,还是会生成两个 commit,第二行和第三行的 commit,都合并到第一行的 commit。但是,新的提交信息里面,第三行 commit 的提交信息,会被注释掉。

# This is a combination of 3 commits.
# The first commit's message is:
Introduce OpenPGP and teach basic usage

# This is the 2nd commit message:
Fix PostChecker::Post#urls

# This is the 3rd commit message:
# Hey kids, stop all the highlighting

第 6 步:推送到远程仓库

合并 commit 后,就可以推送当前分支到远程仓库了。

$ git push --force origin branch-name

git push 命令要加上 force 参数,因为 rebase 以后,分支历史改变了,跟远程分支不一定兼容,有可能要强行推送。

第 7 步:发出 Pull Request

提交到远程仓库以后,就可以发出 Pull Request 将分支合并到 develop 分支,发起 Pull Ruquest 之后,可以做两件事情:Bug 回归测试和 Code Review。

  • Bug 回归测试。这是可选的,当分支是 Bug 修复分支(fix-m)时,需要做回归测试,回归测试通过,才能 Merge
  • 但是,当分支是功能开发分支(feat-n)时,不需要做 Bug 回归测试,但是开发人员需要自己保证代码是经过测试的
  • Code Review。不管分支是 Bug 修复分支还是功能开发分支,都需要利用开发规范对提交的代码进行静态检查。
  • 在 Pull Request 页面,项目组的其他开发人员对程序代码Git commit 注释,进行检查和审核
  • 如果有问题,需要在相应分支上做修改代码或者 Git 变基操作
  • 注意,在合并代码之前,开发人员如果收到 develop 分支上其他分支的 Merge 事件,应该主动在本地仓库的分支上执行如下命令:
git rebase develop
git push -f branch-name

第 8 步:合并 Pull Request

一旦检查完毕,没有问题,则进行合并操作。注意,合并操作,不应该由提交代码的开发人员本人进行合并,而是应该由其他人进行合并。而且,在合并之前,应该在 Pull Request 备注文字,例如:本次提交的代码,经检查没有问题,可以合并。

四、如何提高 PR 流程的效率

PR(Pull Request)的意义重大,因为有了 PR 这个缓冲,代码在合并到主干之前可以进行 Code Review,有了 Code Review,开发人员的技术能力就有了提升的空间。否则,不管代码是否规范,直接提交到版本仓库中,没有任何回旋的余地。有了 PR,也可以有效的减少冲突代码的互相覆盖。虽然 PR 有诸多好处,但是很多开发人员的了解 PR 的第一反应就是降低了开发流程的效率。其实 PR 没有真正降低效率,想象一下,如果没有 PR,开发人员提交代码导致了代码的覆盖和丢失,寻找丢失和覆盖的代码是不是效率更低呢?至于如何开展 PR,见上面的 Git 流程介绍。下面谈几点提高 PR 流程效率的技巧:

  1. 尽早解决冲突
    当发出 PR 后,GitHub 会立刻检查当前分支和长期分支是否有代码冲突(如下图所示)。一旦有冲突发生,是无法完成代码合并的。这个冲突状态是 GitHub 很快能够提示出来的,所以,开发人员在发起 PR 之后,应该在 PR 的页面上等待页面提示是否有冲突的信息出现,如果发现有代码冲突,应该第一时间去解决代码冲突。在确保 PR 中没有冲突的情况下,再继续 PR 的后续流程。
  1. 主动要求 Code Review
    当发出 PR 后,一般情况下,项目所有参与者都会收到邮件提醒,但是邮件提醒是有时间间隔的。所以,如果发出 PR 后,可以主动把 PR 页面的 URL 地址,通过企业微信或者 QQ 发送给项目组成员。或者直接发送给高杨、王树贤或者王顶,要求 Code Review。当然,如果 PR 是 bug 修复,应该同时把 PR 页面的 URL 链接发送给测试人员,要求测试人员进行测试,测试通过后,测试人员应该在 PR 页面上备注测试是否通过的信息。测试和 Code Review 可以同时开展,这样可以提高流程的效率。
    总结一下:在企业的任何工作流程中,提高效率的关键要点无非三个:一是减少流程中间的等待时间,二是尽量提高任务并行的程度,减少任务串行的程度,三是尽量减少不必要的重复或者任务。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,866评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,910评论 0 11
  • 团队开发中,遵循一个合理、清晰的Git使用流程,是非常重要的。 否则,每个人都提交一堆杂乱无章的commit,项目...
    西门淋雨阅读 263评论 0 1
  • 30多年以前,有多少人知道我们身边谁谁谁有癌症,那时候癌症是个稀有名词,今天癌症变成了一种常态!大多数的癌症...
    莫逸语阅读 382评论 0 1
  • 虫蛀的钱 文/林嘉梓 我卖过一批对讲机给一家外地检察院指定的某国际著名品牌送货上门到客户下榻的宾馆面对面验货,收现...
    林嘉梓阅读 461评论 4 30