当前位置: 首页 > 后端技术 > PHP

为什么?您还能如何保持Git提交历史的清洁?

时间:2023-03-29 20:53:48 PHP

文章转自专业的Laravel开发者社区,原文链接:https://learnku.com/laravel/t...Commitment是Git仓库的重要组成部分之一,不仅如此,提交信息贯穿Git仓库的整个生命周期。随着项目/仓库的发展(添加新功能、修复错误、重构架构),提交信息可以让我们看到更改了什么以及如何更改。因此,此信息以简短、准确的方式反映潜在变化非常重要。为什么有意义的提交历史很重要Git提交消息就像您在触摸的代码上留下的指纹。你今天提交的任何代码,当你在一年后看到这段代码的变化时,你会感谢自己留下了清晰而有意义的提交信息,同时也会让你的开发变得更轻松。当提交与上下文无关时,将更快地发现提交引入的错误,并且更容易恢复到导致错误的提交之前的代码。当您处理大型项目时,我们经常会更新、添加或移动文件。确保在这种情况下维护提交消息将很棘手,尤其是在开发周期跨越数天、数周甚至数月的情况下。因此,为了简化维护干净提交历史的工作,本文将使用开发人员在使用Git存储库时可能遇到的一些常见情况。情况1:我需要修改最近的提交2:我需要修改特定的提交3:我需要添加、删除或合并提交4:我的提交历史没有意义,我需要重新开始!在我们深入研究之前,让我们快速了解一下我们假设的Ruby应用程序中典型的开发工作流是什么样子的。注意:这篇文章假设你具备Git的基本知识,分支是如何工作的,如何分阶段添加未提交的分支更改,以及如何提交更改。如果您不知道这些过程,我们的文档是一个很好的起点。日常开发生活中的一天现在,我们正在处理一个小型Rub??yonRails项目。我们需要在主页上添加一个导航视图,这涉及更新和添加几个文件。以下是整个过程的分步分解:首先,您从更新某个文件开始,以开发新功能;我们就叫它application_controller.rb这个功能还需要你更新一个视图文件:index.html.haml你添加一个partialview,首页会用到:_navigation.html.haml页面样式也需要更新,让它应用到我们的视图:styles.css.scss新函数已经准备好所有需要的修改,是时候更新测试文件了;要更新的文件如下:application_controller_spec.rbnavigation_spec.rb测试文件已按预期更新并通过,现在是提交所有更改的时候了!因为所有文件都属于架构的不同区域,所以我们提交这些更改时彼此隔离,确保每次提交都代表一个特定的上下文并按顺序提交。我通常喜欢后端->前端的顺序。大多数以后端为中心的更改首先提交,然后是中间层,最后是提交列表中的以前端为中心的更改。application_controller.rb&application_controller_spec.rb;添加导航路线。_navigation.html.haml&navigation_spec.rb;页面导航视图。index.html.haml;呈现部分导航。样式.css.scss;添加导航样式。现在我们已经提交了我们的更改,我们使用分支来创建合并请求。一旦创建了合并请求,在将更改合并到master分支之前,通常由原始存储库的所有者对其进行审查。现在让我们了解在代码审查期间可能遇到的不同情况。情况1:我需要更改最近的提交想象一下审阅者查看styles.css。scss文件并提出修改建议。在这种情况下,进行更改非常容易,因为对样式的更改是您分支上最近提交的一部分。以下是我们处理此更改的方式:您可以直接在您的分支上对styles.css.scss文件进行必要的更改。完成这些更改后,将它们添加到暂存区;运行gitaddstyles.css.scss。当更改暂存时,我们需要将它们添加到最后一次提交;运行gitcommit--amend。命令分解:这里,我们请求gitcommit命令修改暂存区最新的commit。这将使用您定义的Git文本编辑器打开最后一次提交,提交消息将是添加导航样式。由于我们只更新了CSS声明,因此无需修改提交消息。此时,你只需要保存并退出Git为你打开的文本编辑器,所有的更改都会反映在这次提交中。由于您修改了现有提交,因此您必须使用gitpush--force-with-lease将这些更改强制推送到您的远程存储库。此命令将使用我们在此仓库更新后的提交,以消息Addstylesfornavigationontheremotewarehouse覆盖提交。强制推送分支时需要注意的一件事是,如果您与其他同事在同一分支上工作,当其他人试图将他们的更改正常推送到刚刚被强制推送的远程分支时,您可能会遇到麻烦-推。所以,明智地使用力量推动。您可以在此处了解有关Git强制推送选项的更多信息。案例2:我需要更正一个特定的提交在之前的案例中,由于我们只能修改最后一次提交,所以这个修复相当容易,但想象一下如果审阅者建议对_navigation.html.haml进行更改。在这种情况下,因为它是从顶部开始的第二次提交,所以尝试更改它不会像第一种情况那样简单。让我们看看如何处理这个问题:每次在分支中进行提交时,它都由唯一的SHA1哈希字符串标识。将其视为将一个提交与另一个提交分开的唯一ID。通过运行gitlog,你可以看到分支中的所有提交及其SHA1哈希值。通过它,您将看到类似于以下内容的输出,最近的提交位于顶部;commitaa0a35a867ed2094da60042062e8f3d6000e3952(HEAD->add-page-navigation)Author:KushalPandyaDate:WedMay215:24:022018+0530Addstylesfornavigationcommitc22a3fa0c5cdc175f2b8232b9704079d27c619d0Author:KushalPandya日期:2018年5月2日星期三08:42:52+0000渲染导航部分提交4155df1cdc7be01c98b0773497ff65c22ba1549f作者:KushalPandya日期:2018年5月2日星期三08:42:51+0000页面导航Viewcommit8d74af102941aa0b51e1a35b8ad731284e4b5a20作者:KushalPandya日期:2018年5月2日星期三08:12:20Git+0ro0Base为此执行命令的地方玩。每当我们希望使用gitReBase编辑一个特定的提交时,我们需要首先将我们的分支变基到我们希望编辑的提交之前,将我们的头向右移动。在我们的用例中,我们需要更改读取的已提交页面导航视图。这里注意正确的commithash是我们要修改的commit的前一个commithash;复制该散列,然后执行以下步骤:重新设置分支,移动到目标提交的上一个提交;运行gitrebase-i8d74af102941aa0b51e1a35b8ad731284e4b5a20命令分解:这里我们运行rebase命令的交互模式,并提供要变基的提交哈希。这将在Git交互模式下运行变基命令,并打开文本编辑器,显示变基后的所有提交(8d74af)。看起来像这样:pick4155df1cdc7PageNavigationViewpickc22a3fa0c5cRendernavigationpartialpickaa0a35a867eAddstylesfornavigation#Rebaseon8d74af102948d74af10294..aa0a35a867eRange(3commits)##command=:#p,pick#r,reword=keepthiscommit,但修改提交消息#e,edit=保留此提交,但暂停以进行更改(不仅仅是修改提交消息)#s,squash=保留此提交,但将其合并到先前的A提交中#f,fixup=similar以“压扁”,但丢弃此提交消息#x,exec=runshellcommand(restofthisline)#d,drop=deletethiscommit##这些行可以重新排列顺序,并从上到下顺序执行。##如果删除一行,该提交将丢失。##如果删除所有行,rebase将中止。##请注意,空提交已被注释掉。请注意,每个提交前面都有单词pick,下面的注释是我们可能会使用的关键字。由于我们要编辑某个提交(4155df),我们需要将pick4155df1cdc7PageNavigationView更改为edit4155df1cdc7PageNavigationView。保存更改并退出编辑器。您的分支现已重置为所做更改包括_navigation.html.haml的位置。打开文件并根据审阅反馈执行所需的修改。完成更改后,通过运行gitadd_navigation.html.haml命令暂存它们。现在我们已经上演了这些更改,是时候将HEAD分支移回我们的原始提交(使用我们添加的最新更改),运行gitrebase--continue,这将在终端中打开默认编辑器并显示提交消息在变基期间;页面导航视图。您可以根据需要更改此提交消息,但我们暂时保留它,保存并退出编辑器。此时,Git会重播你编辑的那个之后的所有提交,当前的HEAD分支回到我们原来的顶层提交。由于我们再次修改了远程仓库中已有的commit,所以需要使用gitpush--force-with-lease强制推送分支。场景3:我需要添加、删除或合并提交一个非常常见的场景是修复以前提交的内容,你已经提交了几次。现在让我们尽可能地减少提交的数量,并将它们与原始提交合并。您需要做的就是像在任何其他情况下一样启动交互式变基。pick4155df1cdc7PageNavigationViewpickc22a3fa0c5cRendernavigationpartialpickaa0a35a867eAddstylesfornavigationpick62e858a322Fixatypopick5c25eb48c8Opsanotherfixpick7f0718efe9Fix2pickf0ffc19ef7ArghAnotherfix!假设你现在想要把这些提交记录都合并到?c22a3fa0c5cRendernavigationpartial。Allyouhave要做的是:将修复向上移动,直到它们低于您要保留的最后一次提交,并将每个修复的选择更改为压缩或修复。注意:squash保留了描述中的提交注释。你会得到这样的结果:pick4155df1cdc7PageNavigationViewpickc22a3fa0c5cRendernavigationpartialfixup62e858a322Fixatypofixup5c25eb48c8Opsanotherfixfixup7f0718efe9Fix2fixupf0ffc19ef7Fix2fixupaghe7aghe7styles!5navigation保存更改,退出编辑,你就完成了!这里是生成的历史记录:pick4155df1cdc7PageNavigationViewpick96373c0bcfRendernavigationpartialpickaa0a35a867e为导航添加样式和以前一样,你所要做的就是gitpush--force-with-lease并且更改将生效。如果您想完全删除提交,请将squash或fixup替换为drop或完全删除该行。避免冲突为避免冲突,请确保您移动到的目标不是在编辑同一文件。pick4155df1cdc7PageNavigationViewpickc22a3fa0c5cRendernavigationpartialfixup62e858a322修复拼写错误#thischangesstyles.cssfixup5c25eb48c8Opsanotherfix#thischangesimage/logo.svgfixup7f0718efe9Fix2#thischangesstyles.cssfixupf0ffc19ef7啊另一个修复!#这会改变样式。csspickaa0a35a867e添加导航样式#这会更改index.html(无冲突)1”,“修复2”,...,“修复42”。可以使用以下方法:第一步:开始使用--fixup当你在你的阶段并修复你想要的东西时,使用以下命令:gitcommit--fixupc22a3fa0c5c(注意这个hash信息对应的是c22a3fa0c5cRendernavigationpartial)上面的命令会生成一个commit::fixup!呈现部分导航。第二步:调用你的好朋友--autosquashsimpleinteractiverebase,下面的命令会让git在正确的位置设置fixup:gitrebase-i4155df1cdc7--autosquash现在你的历史是:pick4155df1cdc7PageNavigationViewpickc22a3fa0c5cRendernavigationpartialfixup62e858a322Fixatypofixup5c25eb48c8Opsanotherfixfixup7f0718efe9Fix2fixupf0ffc19ef7ArghAnotherfix!pickaa0a35a867eAddstylesfornavigation你还可以使用gitrebase--autosquash命令直接跳过审查阶段,但一般建议谨慎使用除非你觉得特别安全,因为你没有机会审查具体的变化。场景4:我的提交信息太乱了,我需要重新开始如果你在开发一个大功能,有时候你在分支中留下了很多commit(比如:add-page-navigation),你又不喜欢让这些commit进入主分支,那我来教你a方法:在开始之前,请确保你的分支是最新的,不会和master分支冲突;在add-page-navigation分支下结帐时,可以使用gitrebasemaster或gitmergemaster命令与master保持更新;然后接下来,使用命令创建补丁文件gitdiffmasteradd-page-navigation>~/add_page_navigation.patch命令分解:我们使用Git的diff功能对master分支和add-page-进行diff操作navigation分支,并将结果输出到~/add_page_navigation.patch文件。可以随意设置文件路径;如果命令执行成功后没有报错,说明补丁文件创建成功;现在我们运行gitcheckoutmaster切换到master分支;使用命令gitbranch-Dadd-page-navigation删除本地分支add-page-navigation(我们已经有补丁文件了,不用怕);然后使用命令gitcheckout-badd-page-navigation创建一个新的分支;此时我们在新的add-page-navigation分支上,这个分支没有变化;最后,使用命令gitapply~/add_page_navigation.patch应用补丁中的更改;所有更改将被应用并显示为未提交;此时你可以选择一次性提交所有修改,或者提交单个文件,随心所欲。就像之前遇到的场景,我们修改了整个分支,需要强制推送。总结虽然我们已经涵盖了在使用Git的日常工作流程中出现的大多数常见情况,但是重写Git历史是一个很大的话题,虽然您熟悉上面的技巧,但您可以在官方Git文档。更高级的主题概念。祝你学习Git愉快。