BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

如何审查合并的提交

| 作者 姚琪琳 关注 0 他的粉丝 发布于 2014年3月7日. 估计阅读时间: 3 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

近日,苹果公司新发布的iOS 7.0.6一度闹得沸沸扬扬,这是由于它修复了一个因goto而引起的bug。对于广大开发者来说,这个bug出现的原因以及如何避免其出现,成了热议的话题。

知名博主陈皓分享了他对于该事件的思考。他认为这可能是代码在合并过程中导致的bug,而这种bug却很难在代码审查时被发现。

前微软工程师,现就职于GithubPhil Haack在其博客中分享了他的团队是如何审查合并提交的。在此前,他们的合并流程是这样的(假设要将master分支合并到long-running-branch分支上):

  1. 在long-running-branch分支上创建一个新的分支:merge-master-into-long-running-branch。
  2. 在该分支上执行合并。
  3. 将该分支推送(push)到Github上。
  4. 根据该提交创建一个拉请求(pull request),请团队其他人进行审查。

在git中,这相当于执行下面的命令集:

git checkout long-running-branch
git checkout -b merge-master-into-long-running-branch
git merge master
# Manually do a lot of work to resolve the conflicts and commit those changes
git push origin merge-master-into-long-running-branch

然而这样的方式可能会产生问题。Phil的同事Paul Betts指出,在将一个分支合并到另一个的时候,该合并提交的diff将显示从最后一次合并之后的所有改变。这很可能是已经审查过的代码。而我们真正想要看到的,是这次提交是否有冲突,以及如何解决这些冲突。

参与LibGit2开发的Russell Belfer给出了答案。

在将一个分支合并到另一个分支时,会在这两个分支上各创建一个合并提交。以SignalR一次合并提交为例。该提交要将release分支合并到dev分支,该提交的SHA为cc5b002a5140e2d60184de42554a8737981c846c,以cc5b002a代替。

我们可以使用git diff命令,从两个父分支上分别查看这个合并。例如:

git diff cc5b002a^1 cc5b002a
git diff cc5b002a^2 cc5b002a

如果只想查看冲突的部分,可以使用git show命令:

git show --cc cc5b002a

git show所展示的内容,要比整个合并提交的diff少得多,因为--cc选项可以忽略没有冲突的部分,即只显示与该提交的所有父分支都不相同的部分。这样,审阅者就可以更加专注于冲突的部分,从而降低bug发生的概率。

Phil在文章最后介绍了他是如何发现这样一个合并冲突的示例的。他执行了git log --min-parents=2 -p --cc命令,从而找出了至少有两个父分支的提交。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

深度内容

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT