git提交最佳实践 < >我使用Git管理C++项目。当我在项目中工作时,我发现在更改与许多地方相关的内容时,很难将更改组织成提交

git提交最佳实践 < >我使用Git管理C++项目。当我在项目中工作时,我发现在更改与许多地方相关的内容时,很难将更改组织成提交,git,Git,例如,我可能会更改.h文件中的类接口,这将影响相应的.cpp文件以及使用它的其他文件。我不确定把所有的东西放在一个大的承诺中是否合理 直觉上,我认为提交应该是模块化的,每一个提交都对应一个功能更新/更改,以便协作者可以相应地选择内容。但有时似乎不可避免地要包含大量文件和更改,以使功能更改真正起作用 搜索并没有给我任何好的建议或提示。因此,我想知道是否有人能给我一些在做提交时的最佳实践 另外,我已经使用git一段时间了,我知道如何以交互方式添加/rebase/split/amend/。。。我要问的

例如,我可能会更改
.h
文件中的类接口,这将影响相应的
.cpp
文件以及使用它的其他文件。我不确定把所有的东西放在一个大的承诺中是否合理


直觉上,我认为提交应该是模块化的,每一个提交都对应一个功能更新/更改,以便协作者可以相应地选择内容。但有时似乎不可避免地要包含大量文件和更改,以使功能更改真正起作用

搜索并没有给我任何好的建议或提示。因此,我想知道是否有人能给我一些在做提交时的最佳实践

另外,我已经使用git一段时间了,我知道如何以交互方式添加/rebase/split/amend/。。。我要问的是哲学部分


更新:谢谢你的建议。也许这应该从实践中学习。我将把这个问题保留一段时间,看看是否有更多的建议。

我倾向于按照您的建议提交:提交是一个逻辑连接的更改集。我的提交可以是任何内容,从一行到所有文件中的更改(例如,在源文件中添加/更改版权声明)。改变的原因不一定是我正在执行的全部任务,但它通常是任务中的一个里程碑

如果我修改了与当前提交无关的内容,我也倾向于进行交互式添加,以分离出不相关的更改,即使这是一个空白整理

我发现,简单地将工作状态转储到存储库的提交会使它们变得不那么有用:如果提交到处都是,我无法将错误修复向后移植到早期版本,或者在另一个分支中轻松地包含实用程序功能


这种方法的一种替代方法是在一个功能分支中使用大量微小的提交,一旦整个功能完成,就进行大量的历史重写,将提交整理成一个逻辑结构。但是我发现这种方法是一种浪费时间的方法。

这正是git中引入临时区域的用例

您可以自由地进行尽可能多的互不相关的更改。然后您选择所有相关的内容,然后在一个快照中进行几个原子提交


我总是这样做。如果您使用的是
git gui
或任何其他gui客户端,那么您不仅可以选择要提交的文件,还可以选择文件中的
块,这样您的提交就尽可能原子化了。

我试着按顺序遵循这些实践

  • 提交不能使生成失败。最重要的

  • 它应该由一个变化的逻辑单元组成——无论是一行/字符还是一个完整的文件/类,在代码的其他部分都有相应的变化,仍然遵循#1

    什么是变化的逻辑单位?对于git
  • ,如果您可以在一句话(当然没有and)中以最少的字符数指定提交消息中的更改,并且您不能将该描述进一步分解为更小的单元,我称之为一个单元

  • 提交消息应该清楚地指定提交的本质

  • 提交消息应该很小,通常不超过80个字符。任何进一步的细化都应该是
    说明的一部分


  • 有一件事非常有助于我弄清楚我在承诺什么以及为什么要这样做,那就是将我们的存储库组织转移到“功能分支”模型上,这一点在


    通过使用分支描述正在处理的每个功能(或更新、错误修复等),提交将减少对该功能的关注,而更多地关注如何实现该功能。例如,我最近在自己的bugfix分支(例如bugfixes/gh-87)中修复了一个时区错误,提交被分为已完成的工作、服务器端和前端以及测试中。因为所有这些都发生在一个专门针对该bug的分支上,(),所以我的提交被视为解决该问题的增量步骤,因此不需要太多解释为什么我要这样做。

    有时候当您进行大型重构时,不可避免地会在一次提交中更改多个文件。当您更改一个类的接口时,必须在一次提交中更改头、实现和所有使用该接口的位置,因为没有中间状态可以工作

    但是,建议的做法是在不实际引入任何新功能的情况下更改接口,首先测试并确认没有破坏现有功能,然后提交。而不是实现需要更新接口的实际功能并单独提交。在使用交互式重基压缩到第一次提交的过程中,您可能会对重构进行一些调整


    这样就有了一个大的提交,但它不做任何困难的事情,只是随意地修改代码,所以它应该很容易理解,即使它是大的,而不是第二次提交(或者更多,如果功能是大的话),也不太大。

    免责声明:我也在尝试确定提交应该是什么,以及最终的历史将如何结束。然而,我想分享一些我在自己的研究中遇到的资源

    首先,Linux内核项目有一个很好的页面,可以让您的代码合并到上游。他们谈论做出微小的承诺;执行一个或多个重构提交,然后再实际添加您想要的内容(当然,重构应该使您的功能更干净)和其他事情

    我最喜欢的另一页是塞思·罗伯逊。这不仅仅是一个页面上的很多内容