Skip to Content
《使用 Git 进行版本控制》第三版
book

《使用 Git 进行版本控制》第三版

by Prem Kumar Ponuthorai, Jon Loeliger
May 2025
Beginner to intermediate
548 pages
7h 40m
Chinese
O'Reilly Media, Inc.
Content preview from 《使用 Git 进行版本控制》第三版

第 8 章 查找提交 查找提交

本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com

一个好的版本控制系统应支持 "考古学 "和 调查版本库。Git 提供了多种机制来帮助你查找符合特定条件的提交。

在本章中,我们将向你传授查找特定提交及其元数据的技巧。我们将重点介绍三种可以用来搜索版本库提交历史的方法。第一种方法非常强大,有助于找到符合搜索条件的单个提交。第二种方法可提供对文件进行修改的提交信息,第三种方法则使用常规git log 命令的特定搜索变体。

本章除了让你掌握 Git 搜索提交的技巧外,还为第九章做了铺垫,在第九章中,我们将深入探讨如何修改找到的提交。

使用 Git bisect

git bisect 命令是一个功能强大的 工具,用于根据任意搜索条件隔离特定提交。它非常适合当你发现 "错误 "或 "糟糕 "的东西正在影响你的版本库,而你知道代码一直都很好的情况。例如,假设你正在开发 Linux 内核,测试启动失败了,但你确信启动在更早的某个时候成功了,也许是在上周或之前的某个版本标签上。在这种情况下,您的版本库已经从已知的 "好 "状态过渡到了已知的 "坏 "状态。

但这种转变是何时发生的?是哪个提交导致了它的中断?git bisect 正是用来帮助您回答这个问题的。

唯一真正的搜索要求是,在给定版本库的签出状态时,你能够确定它是否满足搜索要求。在这种情况下,你必须能够回答 "已签出内核的版本是否能构建和启动?在开始之前,你还必须知道提交的好版本和坏版本,这样搜索才会有界限。简而言之,你不应该在搜索需求中提供不正确的提交范围。

git bisect 命令在执行时会在内部应用二进制搜索算法;该命令会系统地在一个不断缩小的范围内选择新的提交,该范围的一端是良好行为,另一端是不良行为。最终,这个不断缩小的范围将精确定位引入错误行为的提交。图 8-1提供了这一概念的总体视图。

vcg3 0801
图 8-1. Git 分段范围修订概念

bisect 模式下,您只需提供初始好坏提交,然后反复回答 "此版本是否有效 "的问题即可。

首先,您需要确定一个好的提交和一个坏的提交。在实践中,坏版本通常是您当前的HEAD ,因为当您突然发现有问题或被分配了一个要修复的 bug 时,您就是在这个版本上工作的。

要找到一个初始的好版本可能有点困难,因为它通常埋藏在历史记录的某个地方。你也许能说出或猜出版本库历史中某个你知道能正确运行的版本。这可能是一个有标签的发布版本,如v2.6.25 ,也可能是main 分支上 100 次修订前的某个提交,如main~100 。理想情况下,它应与你的错误提交相近(main~25main~100 好),而且不要埋藏得太深。无论如何,您都需要知道或能够验证它实际上是一个好的提交。

您必须从一个干净的工作目录启动git bisect 进程 ,而且您的工作目录必须指向项目的顶级目录。进程必然会调整工作目录,以包含不同版本的版本库。从一个不干净的工作空间开始是自找麻烦;你的工作目录很容易丢失。如果你有任何工作变更,可以暂时将其隐藏起来。我们将在第 10 章讨论暂存问题。

以克隆 Linux 内核为例,让我们告诉 Git 开始搜索:

    $ cd linux-2.6
    $ git bisect ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.

Read now

Unlock full access

More than 5,000 organizations count on O’Reilly

AirBnbBlueOriginElectronic ArtsHomeDepotNasdaqRakutenTata Consultancy Services

QuotationMarkO’Reilly covers everything we've got, with content to help us build a world-class technology community, upgrade the capabilities and competencies of our teams, and improve overall team performance as well as their engagement.
Julian F.
Head of Cybersecurity
QuotationMarkI wanted to learn C and C++, but it didn't click for me until I picked up an O'Reilly book. When I went on the O’Reilly platform, I was astonished to find all the books there, plus live events and sandboxes so you could play around with the technology.
Addison B.
Field Engineer
QuotationMarkI’ve been on the O’Reilly platform for more than eight years. I use a couple of learning platforms, but I'm on O'Reilly more than anybody else. When you're there, you start learning. I'm never disappointed.
Amir M.
Data Platform Tech Lead
QuotationMarkI'm always learning. So when I got on to O'Reilly, I was like a kid in a candy store. There are playlists. There are answers. There's on-demand training. It's worth its weight in gold, in terms of what it allows me to do.
Mark W.
Embedded Software Engineer

You might also like

学习 GitHub Actions

学习 GitHub Actions

Brent Laster
《Kubernetes 最佳实践》第二版

《Kubernetes 最佳实践》第二版

Brendan Burns, Eddie Villalba, Dave Strebel, Lachlan Evenson
GraphQL 学习指南

GraphQL 学习指南

Eve Porcello, Alex Banks

Publisher Resources

ISBN: 9798341657922