Git 最佳实践


根据 Git Commit Best Practices 翻译整理。

Git 提交最佳实践

基本规则

提交相关的更改

一次提交应该是相关更改的包装。例如,修复两个不同的错误应该产生两个单独的提交。小的提交使得其他开发人员更容易理解这些更改,并在出现问题时回滚它们。

经常提交

经常提交可以使您的提交变得更小,并且再次帮助您仅提交相关更改。此外,它允许您更频繁地与他人共享代码。这样,每个人都可以更容易地定期集成更改并避免合并冲突。相比之下,拥有大的提交并且不经常共享它们会使解决冲突变得困难。

不要提交未完成的工作

你应该只在完成逻辑组件时才提交代码。 将功能的实现拆分为可以快速完成的逻辑块,以便您可以经常提交。如果你想提交只是因为你需要一个干净的工作副本(检出一个分支,拉取更改等),请考虑使用Git的“Stash”功能。

在提交之前测试您的代码

抵抗提交你“认为”完成的东西的诱惑。彻底测试它,以确保它确实已经完成并且没有副作用(就我们所知)。当在本地存储库中提交半烤的东西时,只需要原谅自己,但是在将代码推送/共享给其他人时,对代码进行测试更加重要。

编写良好的提交消息

以一个简短的更改摘要开始您的消息(最多50个字符作为指南)。通过包含空行将其与以下正文分开。您的消息正文应提供对以下问题的详细答案:

  • 更改的动机是什么?
  • 它与以前的实现有何不同? 使用祈使语气,现在时态(“change”,而不是“changed”或“changes”)与诸如git merge之类的命令生成的消息保持一致。

使用分支

分支是Git最强大的功能之一,这不是偶然的:快速简便的分支是从第一天开始的一个核心要求。分支是帮助您避免混淆不同开发线的完美工具。您应该在开发工作流程中广泛使用分支:用于新功能,错误修复,想法…

同意工作流程

Git允许您从许多不同的工作流中进行选择:长期运行的分支,主题分支,合并或rebase,git-flow…您选择哪个取决于几个因素:您的项目,您的整体开发和部署工作流以及(也许最重要的是)您和您的队友的个人偏好。无论您选择哪种工作方式,只要确保达成共识,每个人都会遵循共同的工作流程。

下面的文档基于使用GIT的一些项目(包括libvirt,QEMU和OpenStack Nova)进行代码开发,故障排除和代码审查的经验。对其他开源项目(如Kernel,CoreUtils,GNULIB等)的研究表明,它们都遵循着相当普遍的做法。它的动机是希望提高Nova GIT历史的质量。质量是一个很难定义的计算术语;一个人的“美丽之物”是另一个人的“邪恶黑客”。然而,我们可以提出一些一般性的指导方针,用于发布与项目合并的GIT提交,本例中为OpenStack,或者反过来,不要这样做。

这个主题可以分为两个关注领域

  • 代码更改的结构化集/分割
  • 提供的提交消息中的信息

格式化规则

  • 大写,简短(50个字符或更少)的摘要
  • 合并的更详细的解释性文本(如果需要)。将其包装到大约72个字符。在某些情况下,第一行被视为电子邮件的主题,其余文本被视为正文。分隔摘要和正文的空行至关重要(除非您完全省略正文);如果您将两者结合在一起,rebase等工具可能会混淆。
  • 总是留下第二行空白。
  • 用祈使语气写你的提交消息:“修复错误”而不是“修复错误”或“修复错误”。这个约定与git merge和git revert等命令生成的提交消息相匹配。
  • 进一步的段落在空行之后。
    • 项目符号也可以
    • 通常使用连字符或星号作为项目符号,前面有一个空格,在两者之间有空行,但是约定在这里有所不同
    • 使用悬挂缩进

良好实践的例子

例子1(没有描述,只有摘要)

  commit 5c6bce2d0d1c1e0c0b8d9e4e8b8f6e0b1e7e4b1e
  Author: [removed]
  Date:   Mon Jun 11 17:16:10 2012 +0100

    Update default policies for KVM guest PIT & RTC timers

例子2(描述为项目符号)

  commit ae878fc8b9761d099a4145617e4a48cbeb390623
  Author: [removed]
  Date:   Fri Jun 1 01:44:02 2012 +0000

    Refactor libvirt create calls

     - Minimize duplicated code for create

     - Make wait_for_destroy happen on shutdown instead of undefine

     - Allow for destruction of an instance while leaving the domain

例子3(描述为纯文本)

  commit 31336b35b4604f70150d0073d77dbf63b9bf7598
  Author: [removed]
  Date:   Wed Jun 6 22:45:25 2012 -0400

    Add CPU arch filter scheduler support

    In a mixed environment of running different CPU architectures,
    one would not want to run an ARM instance on a X86_64 host and
    vice versa.

    This scheduler filter option will prevent instances running
    on a host that it is not intended for.

    The libvirt driver queries the guest capabilities of the
    host and stores the guest arches in the permitted_instances_types
    list in the cpu_info dict of the host.

    The Xen equivalent will be done later in another commit.

    The arch filter will compare the instance arch against
    the permitted_instances_types of a host
    and filter out invalid hosts.

    Also adds ARM as a valid arch to the filter.

    The ArchFilter is not turned on by default.