git是我的好友:作为独奏开发人员的有效git

2021-02-24 21:46:48

此时,大多数开发人员使用Git作为协作的工具。我们有欧洲学习的命令来拉,提交和推动。当然,那里的同事在那里知道有关Git的那个同事比别人更加了解Git,这是帮助我们在当地的回购最终ina陌生状态时回到轨道。

但如果我告诉过你,如果Git可以成为一个有价值的工具我不只是谈论拥有一个工作版本的你的码基础,如果你搞砸了一些东西,虽然它也是如此。使用了,Git可以帮助构建你的工作,识别你最大的空白覆盖并最大限度地减少死亡代码。

有两个主题I' m将避免避免此博客文章:其他开发人员,是最引人注目但最有趣的争论,使您的提交历史清洁和Git Botect,这会将视为我的工作流程,但值得注意它自己的博客文章。

与任何无处不在的开发人员工具一样,Git用户基数有很多关于一个"正确的"使用它的方法。我的目标只是倾向于introduce我' ve一直在使用和炼制我的职业生涯的工作流程;从你兴奋地夺取它。而且,重要的是,它的工作流程是一项工作流程,它不仅仅成为我的协作过程,而且我写代码的方式。

最终,这些原则提供了两种目的:他们将我的工作集中在一个公寓错误修正,功能或目标上,他们确保我的git历史isn' tset在石头上。通过适当的卫生,可以轻松地丢弃,重新排列,重新排列,并拆分和拆分进入其他分支,而不会合并冲突。

当我管理自己的项目时,我有很多我想要Seehappen的想法。如果我' m只是把一个又一次地扔进了一个主要的,我' ll gethalfway通过实施一个功能,然后跳到骚扰onanother。如果任何功能都完成,它将牺牲AWASTELALD的AWASTELELAL,现在正在占用Codebase中的空间。

在一个全新的项目,当然,我' ll扔了一堆垃圾犯规到main.my的拇指规则,何时停止这是我可以编写我的第一个有效的测试。如果有什么可用于测试的东西,现在已经有足够的项目,我可以在GO上有不同的任务。早起,尝试分支机构刚刚导致我扔掉我的垃圾委员会而不是主要的分支。

在项目的早期阶段,阐明分支的目的可能很简单,只需为其赋予一个描述性名称即可。如果提交没有沿该方向移动代码库,则始终可以将其精选到另一个分支中。

随着项目的成熟,我将开始使用某种问题或错误跟踪软件来充实我试图更详细地完成的工作,并协调分支机构以处理多个相关的有用事情。

我发现描述性分支名称还有助于将我的注意力重新集中在我要完成的事情上。例如,我的命令提示符当前如下所示:

对于分支机构而言,如此之多,让我们放大到一个提交级别。我已经明确表达了我要添加分支的具体内容,现在该如何添加?通常,在弄清楚我的代码库时有些涉及。有时我走错了路,有时我只是分心。没关系,这是过程的一部分。

但是,这并不意味着我现在所做的每一次提交都将最终合并到该分支中。通过确保我的提交彼此独立,如果我发现它们确实与我现在正在工作的内容无关,那么我可以确保将它们重新排列或挑选到新的分支中。

如果我的提交不是独立的,那么我本质上就是坚持写的确切历史。尝试将提交提交到另一个分支或移动到我的分支历史的开始将变得充满合并冲突,因为后来的提交(该提交中引入的修改后的代码就像多米诺骨牌一样)。

显然,我仍然可以从以后的提交中调用一次提交中编写的代码。毕竟,这就是我在此特定分支中从事这项特定工作的原因。但是我从来不会多次触摸相同的代码。如果我必须返回并修复某些问题,也许添加一个我没有想到的验证检查或字段,我将回到创建它的提交,而不是在以后的提交中进行修改。

显然,这可能永远持续下去,这就是为什么存在一个有用的原则的原因。一旦确定了我希望该分支的代码看起来像什么,我就合并,然后在下一个分支中开始新的提交,以进一步更改该分支。

在这里,小的保证金开始带来红利。如果每个提交中的代码都足够我进行推理,那么它也足够我凭视觉确保其测试覆盖范围良好。

当然,如果我最终重新布置了该提交或将其拆分到另一个分支,则我希望它的测试能够随之进行。

集成和功能/行为测试是一个例外,可以并且应该具有自己的提交。在这种情况下,测试实际上是与分支级别联系在一起的,而不是与提交级别联系在一起的,因为原则1暗示应该有一个新的测试要作为该分支的结果添加。

同样,在提交中破坏某些内容(即使我确实确实打算在以后的提交中进行修复)也将我锁定在git历史记录中。为了以后解决问题而引入重大更改总是会冒这样的风险,即我会分心,最终合并重大更改。

如果存在进行此更改以通过测试的一些先决条件-例如,一个已经存在的漏洞会通过我的测试覆盖范围的一个洞潜入-则将其提交。

说到测试覆盖率方面的漏洞,这里还有另一个(临时)异常。我通常不练习严格的测试驱动开发,但是如果我修复了一个长期存在的错误,通常我会暂时将其测试放入单独提交。然后我将重新设置基准,以使测试出现在修复程序之前,确保没有修复程序的测试失败,然后完成重新设置基准并验证测试现在可以通过。一旦完成了验证我的测试的尽职调查,我就可以继续通过该测试修正错误修正。

如果我知道以后会再进行更改,那么我会更轻松地将其设置为下一部分,然后继续进行粗加工,而不是精加工,抛光和单元测试代码在合并我的分支之前可能需要更改。

实际上,我发现我花在编写测试上的时间要比在我变得懒惰时要花的时间少,这些事情后来在我遵循此工作流程进行时会更改。并开始将所有内容转储为大型的所有提交。

某些人喜欢代码中的TODO注释,有时会通过自动检查来支持,以防止代码中包含" TODO"。从合并。我更喜欢注释我的提交消息,并保持代码干净。通常,这看起来像是"添加控制器类-TODO测试我"。 (我总是将我的TODO放在提交消息的第一行,这样即使在简短的日志视图中也可以显示它们。)

我经常通过整理周围的代码来开始任务,就像在开始工作之前整理办公桌一样。 (我没有,但是我可以。)有时候,清理工作被证明是进行此更改的基础工作的宝贵组成部分,但有时这只是沉重的负担。保持我的提交独立,可以很容易地丢弃或废除不必要的代码,以及随之而来的任何单元测试。

(我仍然认为整理是该过程的重要组成部分。在深入研究更复杂的问题之前,它使我头脑清醒,并通过一些简单的轮转任务刷新了我对问题空间的了解。有时会产生更简洁的代码。)

我并不完美。 [需要引用]显然,通过依次进行每个更改来保持这种提交卫生的水平是不切实际的。相反,我一直在跳来跳去。这样做需要我习惯浏览自己的提交历史。 (相反,这也是使浏览历史变得舒适的一种好方法。)

因此,除了标准的checkout / branch / pull / commit / push工作流程之外,这里还有一些工具非常有用。

git comput --fixup [哈希] - 当历史记录时,我曾经发现自己用邮件&#34致力于与xyz&#34合并我;如果我需要重新审视最近于最近于的。事实证明,Git Commit有标志来帮助解决问题:--fixup和--Squash将自动建议使用另一个ComputCing Rebase,如果为该命令提供--AutoSquash标志,则会自动建议使用upducing rebase。 (默认情况下,运行Git Config-Global Rebase.autosquash true。它赢得了'如果没有在athistory中没有编辑"南瓜!"或"修复!"。)一个惊喜奖金:由于修复操作继承了先前提交的消息,因此提示输入新的奖励。

Git Rebase - Interactive Main - 我可以使用git rebase - interactive head〜5编辑最后5个提交,但Ifind rechasing直接在主(或掌握,或者上游的brankis)用一块石头杀死两只鸟。它将向我展示自从Memon的Ibranched以来的所有提交,并将同时将我的分支带到我最新的主要当地主要副本。

git stash - 有时候我没有想到的,我现在不想提交。 git stash是一种让他们走开的一种自由的方式,而git stash pop会再次恢复它们。谨慎使用它,因为找到了困难后来的更改是猿。如果我没有计划在不久的将来再次突破它,我的进步提交了。

git责备 - 好的,这是在合作中的更值。当它'我的代码库时,我已经知道谁的错位。尽管如此,我仍然存在,我使用Git责备不要找出谁是谁,而是为了了解为什么做某事。六个月前,它同样适用。最常见的是,我'当我看到看起来像一个虫子的东西时,我想知道:a)如果它成功地确保了该目的,那么这件事就应该服务的目的是什么?无论是否有关代码仍处于Thecode基础中。它和#39;找到真正将yourproject' s致力于测试的相关代码的任务。

通常的git / vim免责声明适用于我的列表:如果您获得五个电源用户Ina房间并要求他们做一个复杂的任务,他们会通过七种不同的方式完成快速,有效地完成。我使用的命令不是唯一实现相同结果的道路,可能不是最好的方式。

虽然我认为我的工作流程独立就像一个构建你的方法,确保你的测试覆盖是好的,这当然也是Aworkflow,让你从同事或合作者那里得到很多爱。威尔制作的拉出请求是一个令人痛苦的痛苦越来越多的审查,并转回了一个写作的提交人,因为Git Chinkend造成了责任,使你或另一个开发人员试图通过变革来实现的东西很多,并评估它是否成功)。

当然,那里的git bot。 TheShort版本,适用于那些vit' t使用它,是git bisect在手动或使用历史上的所有历史记录时都可以弥补,所有在O(log n)时间。确保您的提交普遍存在普通人使他们能够友好地友好地友好,并确保它们是小的只有的动意意味着当Bisect告诉您哪个提交引入错误时,其中可以出现很少的代码。