每天,美团的上百名工程师都在不断改进美团的用户体验,或是加入各种新鲜的功能。作为负责展现、交互的前端工程师,我们上线的次数可达一天数十次。

我们使用 Stash 托管项目代码。每个功能都新增一个新任务分支 (feature branch),当开发测试完成后,推送任务分支到 Stash 上,并创建 pull request 进入代码审查,直到被通过,等待上线。

为了保证开发速度,我们不断改进完善这个发布流程,让这个过程更简单、高效。

前端工作现状

前端工作是连接后台实现和视觉表现交互的桥梁,前端工作有以下特点:

  • 往往需要和后端工程师合作开发
  • 在测试时也需要 checkout 后端代码,并在此基础上进行开发
  • 双方频繁 merge/rebase 分支
  • 每个人使用 Git 的方式不太一样,我们的工作流需要较强的适应性
  • 在开发测试完成之后,我们要求每一次上线的代码都必须经过 pull request 加代码审核

多人合作开发的一般工作流可以参见 A successful Git branching model 和 Git Workflows,在一般开发阶段使用 merge 或 rebase 都能够胜任。

但在 pull request 之前我们需要把双方的提交分开,这个工作往往还不够自动化。一种常见的做法是 git reset --soft HEAD~ 将所有改动移出暂存区 (staging area),然后手工添加那些我们改了的文件。

事实上,我们可以用 rebase 来帮我们提高效率,实现自动提取、合并提交。

rebase 是什么?

首先简单介绍一下 rebase(衍合),git-scm 上有很好的介绍(中文翻译),简单的说,git rebase A B 会把在 A 分支里提交的改变移到 B 分支里重放一遍。

它的原理是回到两个分支最近的共同祖先,根据 B 的历次提交对象,生成一系列文件补丁,然后以 A 为基底分支最后一个提交对象为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象,从而改写 B 的提交历史,使它成为 A 分支的直接下游。

通过修改提交历史,我们可以更方便的准备 pull request。

用 git rebase 来提取、合并提交

比如说后端的 Alice 和前端的 Bob 合作开发一个功能,他们分别从 master 分支上 checkout,并开始工作。

他们互相 merge 对方的分支的进行开发、测试。最终,这个功能开发测试完成,Bob 合并了 Alice 的分支(图中星号的位置),可以进入代码审核和上线的流程了。

这时候 Alice 和 Bob 需要提取、合并各自的提交,并分别发送 pull request 进入代码审核。我们站在 Bob 的角度来解释一下如何使用 rebase 来方便的做到这一点。

Bob 现在处在 bob/fb 上(图中星号的位置),这时候 bob/fb 实际上包含了 alice/fb 的所有提交。首先我们从 bob/fb 上新建一个分支

// 准备一个新的分支
$ git checkout -b bob/review

然后我们通过 rebase 把自己的提交排到一起

// 把 Alice 的提交和自己的提交分别排在一起
$ git rebase alice/fb

接下来我们把 bob/review 上的提交合并

// 用 interactive rebase 合并提交
$ git rebase -i HEAD~`git rev-list --first-parent master...bob/fb --no-merges --count`

执行上面这行命令会打开终端默认的编辑器(可通过 EDITOR 环境变量设置)。

这些信息表示从在 bob/review 上找到了两个在 bob/fb 上的提交。每个提交都另起一行来表示,行格式如下:

(action) (partial SHA-1) (short commit message)

按照下面的提示,我们可以把除了第一行外的 pick 替换成 fixup (f) 或是 squash (s) 来实现合并提交。另外,上下移动一行可以对提交进行重排序。一旦你完成对提交信息的编辑,并退出编辑器,git 会按照你指定的顺序去应用提交,并且做出相应的操作(action),形成的新提交和提交信息会被保存起来。(备注:在 Git 1.7 之后,我们还可以使用 rebase --autosquash 自动合并提交,进一步提高生产效率。)

合并完之后我们的分支是这样的

然后,我们可以使用 rebase --onto 取出 bob/review 上有而 alice/fb 上没有的提交,并指定新的基底分支(也就是主干分支 master)

// 取出 Bob 的提交,并排除 alice/fb 上的提交
git rebase --onto master alice/fb bob/review

这样在 bob/review 分支上就只有 Bob 自己的提交了。

这时候就可以用 git merge master 或者 git rebase master 来更新分支,然后发送 pull request 进入代码审核环节了。

小结

以上是我们处理代码审查之前提取、合并提交的一点思考和实践。例子中命令虽然长,但可以很方便的写成一个脚本自动进行,除非遇到冲突,否则需要人工干预的情况并不多在。在美团,我们一直努力用好现有工具,降低重复操作,让工具自动化融入工作流程之中,成为我们不断提升工作效率的重要帮手。希望我们的实践能对你有帮助。

from: http://tech.meituan.com/improving-git-flow_squashing-commits.html

改进合作 Git 工作流:自动提取、合并提交相关推荐

  1. Git进阶:合并提交记录 git merge --squash

    一.说明 开发分支dev会有很多的commit log,因此如果你在将dev合并到主分支master的时候,在master只想展示一条dev的commit log,让主分支的log看起来很简洁,那么可 ...

  2. Git使用 从入门到入土 收藏吃灰系列 (十四) 清除git仓库的所有提交记录

    文章目录 一.前言 二.清除git仓库的所有提交记录 本节速览 清除git仓库的所有提交记录 一.前言 参考安装Git 详细安装教程 参考视频B站 Git最新教程通俗易懂,这个有点长,感觉讲的精华不多 ...

  3. Git 提交规范之GIt工作流规范(Husky+eslint+stylelint+pretty+Commitlint+ lint-staged)

    1.ESLint 1.1 ESLint 安装 (1)脚手架自动安装 如果是采用脚手架如Vue-Cli创建项目,在创建项目时就可以选择安装ESLint,安装完成后,会自动在项目根目录生成一个.eslin ...

  4. git回滚远程合并提交

    一.问题描述 在一次生产发布中,不能把合并到master的新功能发出去,但是生产又有bug要修复,所以master代码要回滚,将develop合并到master的合并提交回滚到master的上一次提交 ...

  5. git只提交一张图片_Git 图形化操作之合并提交记录

    Git 图形化操作之合并提交记录 Git 图形化操作之合并提交记录 目录1.显示日志2.合并提交记录3.推送合并的提交 独立观察员 2020 年 9 月 24 日 前言:当我们使用 Git 时,有时会 ...

  6. Git命令,合并分支到master,并提交远程仓库,将本地分支推送到远程仓库

    一.我们已经知道如何从远程仓库clone到本地项目中,接下来我们在开发项目中会为每一个单独的功能建立一个分支,并进入分支, git branch login //创建分支 git checkout l ...

  7. Git 图形化操作之合并提交记录

    Git 图形化操作之合并提交记录 独立观察员 2020 年 9 月 24 日 目录 1.显示日志 2.合并提交记录 3.推送合并的提交 前言:当我们使用 Git 时,有时会遇到刚提交推送完一次修改,发 ...

  8. git 合并提交 error: cannot ‘squash‘ without a previous commit

    我想合并将3/3 3/2 2/26 2/26的四次提交合并为一次 如何进行呢 1.执行git log 查看历史提交 找到想要合并的所有提交之前的那一次commit id 注意这里的历史记录越往下越旧 ...

  9. 别总用git merge了,Git高级操作之选择合并,git将一个分支的提交合并到另一个分支,git cherry-pick

    当前需求:我现在有两个分支 A和B,这两个分支都同属于是一个项目,一个是新版本,一个是旧版本.而且差异化比较大 现在产品下发了一个需求,需要在两个版本上同时发布进行,那么只能在一个版本上开发,并且由于 ...

最新文章

  1. 拿来就能用! CTO 创业技术栈指南!
  2. VarGFaceNet
  3. docker删除本地所有镜像
  4. win7开机按F8后,为什么没有修复计算机的选项
  5. 无尽列表_8号无尽征途强势来袭,碎片商店列表更新,有136皮肤碎片的笑了
  6. 夯实Java基础(二十一)——Java反射机制
  7. wordpress登录账号之后才能查看页面,实例
  8. vb连接mysql数据库报错_vb6连接mysql数据库
  9. 锐捷校园网环境下设置统信UOS(Linux)自动连接网络
  10. java 针式打印_JAVA针式打印机打印整理
  11. 如何快速融入一个研发团队?
  12. HTTP POST GET
  13. 设计模式1(策略模式)
  14. 安卓开发 投屏安卓设备到电脑端 scrcpy
  15. 啃碎并发(一):Java线程总述与概念
  16. 评估指标——均方误差(MSE)、平均绝对误差(MAE)
  17. xml生成xsd文件的方法
  18. 王道2021版计算机考研书勘误表
  19. html怎么制作图片滚动文字效果,新手请看:网店店铺里的滚动文字效果代码是如何制作的...
  20. 润迈德医疗开启招股:未有基石投资者参与,亏损金额翻倍增长

热门文章

  1. 2018智能反欺诈洞察报告:黑中介、黑产智能化趋势明显
  2. 用gdb调试core文件
  3. elasticsearch实战三部曲之三:搜索操作
  4. 实战并发编程 - 01多线程读写同一共享变量的线程安全问题深入剖析
  5. Java8 - 使用工厂方法 supplyAsync创建 CompletableFuture
  6. 小工匠聊架构 - 分布式缓存技术
  7. 实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现
  8. 项目实战-解决AES(java.security.InvalidKeyException: Illegal key size)
  9. java越权发送邮件_已登录用户 越权 访问action方法怎么解决?
  10. 把Spring Boot项目打为可执行jar包