lizheming

新年新 GIT

lizheming · 2016-01-17翻译 · 1348阅读 原文链接

Git 社区在新年伊始时发布了 Git 2.7.0 版本,让我们来看看有什么特别的地方吧。

更灵活的命名

git bisect 是一个非常库的工具帮助我们了解项目是如何产生 BUG 的。如果你还不了解这个命令,这也没有关系,我们会为大家间断的介绍一下。如果你已经知道这个命令了,你可以跳过本小节。

git bisect 简介

假设我们现在有一个 BUG 描述是这样的:“推进器已经在后台运行了!”显然我们可以知道在当前 master 分支上,推进器已经在后台运行了:

$ git checkout master
$ ./test_hyperdrive
FAILURE: destination is getting farther away

此时你会思考:“这太扯了吧,明明 4.2 版的时候运行的好好的呀,这块我什么都没有改的说。”为了验证自己的结论,我们还特地切换到 4.2 版本测试了一下:

$ git checkout v4.2
$ ./test_hyperdrive
SUCCESS!

所以问题来了,到底为什么现在运行不了了呢?4.2 版到最新的 master 版之间的某些修改一定导致了这个 BUG 的出现。

此时我们可能会打开我们的 debugger 工具或者在推进器模块中增加 print 打印语句。但是不管怎样做都会耗费大量的事件。幸运的是,我们现在有一个非常简单的方法发现到底是什么时候引进的 BUG 了,那就是 git bisect

我们首先要分别告诉 git bisect 正常的版本和不正常的版本:

$ git bisect start
$ git bisect good v4.2
$ git bisect bad master
Bisecting: 2 revisions left to test after this (roughly 1 step)
[8cc2d9b4f02ccc208bd9f6d6b01ac6ed57fbb606] Take advantage of available wormholes

git bisect 会在设定的正常版本号和非正常版本号之前大致选一个中间的版本来检查。我们的任务就是测试这个版本然后告诉 Git 测试的结果:

$ ./test_hyperdrive
SUCCESS!
$ git bisect good
Bisecting: 0 revisions left to test after this (roughly 1 step)
[f97f670fb5303ea0097e4475ec8fcf3e2c7dde85] Hyperdrive: bypass the compressor

然后我们重复刚才的操作,每次都是在正常版本和非正常版本之间进行二分:

$ ./test_hyperdrive
SUCCESS!
$ git bisect good
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[e0cbfe825a0285e58c59cefb9b78abff2ae0c369] Implement hyperdrive parity inverter
$ ./test_hyperdrive
FAILURE: destination is getting farther away
$ git bisect bad
e0cbfe825a0285e58c59cefb9b78abff2ae0c369 is the first bad commit
commit e0cbfe825a0285e58c59cefb9b78abff2ae0c369
Author: Some Developer <me@example.com>
Date:   Thu Dec 31 14:05:09 2015 +0100

    Implement hyperdrive parity inverter

:100644 100644 a9562e3d7cea826ed52072e9b104bc9f7e870cf9 da2bc4f6d15943dcf4872641fae08d79d7696512 A  hyperdrive/parity.c

恭喜!我们现在知道了是 e0cbfe8 这次的提交引入了 BUG。通常,查看下此次提交的修改就会很快发现问题并快速修复它了。如果不行的话,至少我们已经大幅的缩小了代码调试的范围。

当我们修复这个问题之后,输入 git bisect reset 命令接触这次二分查找任务。

git bisect:不仅仅是回归测试

虽然 git bisect 命令通常都用来查找软件的回归问题,但它也可以用同样的方法来了解软件的任何改变。举个例子来说:

  • 什么时候某个功能变慢了?
  • 什么时候 images 文件夹的大小超过了 5MB?
  • 什么时候那个 BUG 被修复了?

git bisect 可以帮助我们快速定义注入此类的修改。无论你要查找何种改变,我们都必须要对修改之前的版本标记为 good,并对修改之后的版本标记为 bad。这个可能会让人晕乎,特别是当你想要找到那个修复某 BUG 的版本的时候1

为了便于使用,git bisect 现在允许我们使用不同的词组来代替 goodbad。默认情况下,我们可以使用新的词组 oldnew 来表示“旧的状态”和“新的状态”:

$ git bisect start
$ git bisect old v4.2
$ git bisect new master

我们甚至可以自定义词组,仅需要在我们开始查找的时候指定一下他们:

$ git bisect start --term-old yucky --term-new yummy
$ git bisect yucky v4.2
$ git bisect yummy master

[引源]

新参数 --recurse-submodules

如果大家使用 Git submodules 的话,我们通常会在提交代码到注明模块的时候忘记要先提交修改到子模块中。现在我们只需要使用 --recurse-submodules 参数,例如:

$ git push --recurse-submodules=on-demand origin

同时我们也增加了一个新的配置项让我们避免这些额外的输入(以及忘记提交到子模块的尴尬):

$ git config push.recurseSubmodules on-demand

如果我们只需要 Git 给我们予以提示,仅需要设置为

$ git config push .recurseSubmodules check

我们可以在命令中使用 --no-recurse-submodules 覆盖默认的配置。[引源]

worktree 增强

不知道大家还记不记得 Git 2.5.0 简介 中提到的 git worktree命令?它允许我们对单个本地 Git 仓库创建多个拷贝。

在 Git 2.7.0 中,git corktree 变的更好了:

  • 使用新的 git corktree list 命令,我们可以列出当前仓库所有关联的引用项目及其当前的分支。[引源]
  • git bisect 现在可以运行在任意引用项目内,甚至可以同时对两个引用项目进行二分查找。[引源]
  • 我们可以从一个引用项目上进行克隆。[引源]
  • Submodules 也支持 worktree 模式了。[引源]

git p4 支持 Git LFS

git p4 是 Git 和 Perforce 的桥接命令。它可以帮助我们从 Perforce 上拉去提交到 Git 中,并且从 Git 推送提交到 Perforce 服务器上。它允许我们在本地使用 Git 服务,然后推送代码到 Perforce 服务器上。(同样 Git 还有类似的工具来桥接 Subversion, Mercurial, Bazaar, TFS等版本控制工具。)

git p4 现在已经支持在 Git LFS(Git Large File Storage) 上存储大文件了。它允许我们在我们的 Git 仓库之外使用 Perforce 存储大文件(例如音频文件)。这样能够避免本地仓库的硕大。(注意这个新特性目前还不支持 git p4 submit 命令。)[引源]

统一列表显示命令

Git 有三个主要的列表显示方法:git branch,用户列表显示分支名;git tag,用于列表显示标签;以及 git for-each-ref,用来显示所有的引用。虽然这三个命令大致的功能是一样的,但是它们却各自有个字的参数和选项。

现在,感谢 Google 代码夏令营的 Karthik Nayak 同学,这些命令拥有了统一的接口,并且增加了一些特性。现在这三个命令都支持一下选项:

  • --points-at <object>:练出某个对象下所有的引用
  • --mergeed [<commit>]:仅列出所有合并到 commit 中的引用(默认是 HEAD
  • --no-merged [<commit>]:仅列出所有未合并到 commit 中的引用(默认是 HEAD
  • --contains [<commit>]:进列出包含指定 commit 的引用(默认是 HEAD

它们还有心的格式和排序选项。[引源][引源]

其它变化

  • git stash show 现在支持两个配置 stash.showPatchstash.showDiff 了,可以帮助我们定义默认情况下如何显示隐藏项。[引源]
  • git blame 现在支持添加 --first-parent 参数了,并且可以配合 --reverse 一块使用。[引源][引源]
  • gitk 在高清屏下的显示有显著的提升。[引源]
  • 安全漏洞修复:

    • 在计算 diff 文件时,避免整数溢出。[引源]
    • 限制子模块递归获取安全协议。[引源]

    我们推荐每个人都升级 Git 到该问题已修复版本,包括 Git 2.3.10+, 2.4.10+, 2.5.4+, 2.6.1+,以及 2.7.0+。

其它

如果你想要知道更多 Git 2.7.0 的新特性的话,可以查看完整的发布记录

Git 项目已经有来自 81 位贡献值超过 800 次的提交了。希望在 2016 年里变的更加优秀!


[1] git bisect 并不关系你要查找的更改是由坏变好还是由好变坏的。事实上,如果最开始我们标记的两次提交相互没有直接的集成关系的话,git bisect 会测试这些提交中共同的祖先。在示例中,根据我们需要寻找的东西,我们的查询裸机是不同的。

相关文章