作为开发人员,我们定期推送代码提交--一段时间后,这几乎成为我们的第二天性。
但这是否意味着我们做的事情是正确的?熟悉往往会导致马虎和忽视基本的东西。
在这篇文章中,我们将探讨:
- 如何编写有意义的 Git 提交信息
- 如何创建高效的拉取请求(PR)
- 如何在代码审查过程中获得真正的好处,以及一些需要遵循的最佳实践
前提条件。
我喜欢用VS Code作为我的代码编辑器。我也用这个作为我的Git编辑器。我发现在我写代码的时候,在同一个地方写提交信息更容易。它也给了我更多的空间来写提交信息和描述。
如果你还没有这样做,请按照以下步骤使 VS Code 成为你的默认 git 编辑器。
- 打开VS Code,在命令调色板中搜索:
外壳命令。在PATH中安装'code'命令
2.然后在你的终端运行以下命令:
git config --global core.editor "code --wait"
现在当你运行git commit 或git -config --global -e 时,它将在 VS Code 的文件中打开 Git 编辑器。
注意:所有给定的命令都要在终端中运行(无论是你选择的终端,还是VS Code中的集成终端)。
如何编写有意义的提交信息
在提交代码时,写一些有用的提交信息是很有帮助的。这里有一些提示和最佳实践,可以帮助你做到这一点。
使用指令性命令
在提交信息前加上命令式命令,例如。fix,refactor,add, 和remove
这是因为你应该能够在提交信息中加入以下短语的后缀
"如果应用,这段代码将..."
并告知其他开发者它将做什么,例如。
如果应用,这段代码将修复登录按钮不显示的问题
保持简短
你不是在写独白,所以要简短。一般来说,一条提交信息不应超过50个字符。
设身处地为开发者或评审员着想。试着想一想,如果你在看这个 repo 的 Git 记录,你会想知道什么。
- 你完成了什么工作?
- 你为什么要这么做?
- 它对代码库有什么影响?
下面是一个简明扼要但内容丰富的提交消息的例子:
fix issue with login button not showing
如何使提交信息简短而有帮助
在你的提交中,你可以包含一个提交描述,让我们对你所做的事情添加更多细节/背景。
在提交信息下面加一个空行,然后在第三行开始写描述。它看起来像这样:
fix issue with login buttton not showing
- update login form validation
- update login styling for showing the button
现在,当其他开发人员在审查Git日志、提交或需要恢复代码时,他们可以更好地了解会发生什么效果,以及是否会导致任何破坏性的变化:

无益的提交信息的例子
另一方面,这里有一些无效的提交信息的例子:
fixed bug- 没有提到具体修复了什么bug,所以对git历史/日志没有任何价值。这将使回顾以前的提交变得非常困难,而且很费力。作为一个开发者,你必须打开每个这样的提交来了解它到底在做什么。refactored due to PR comments- 这条消息没有给我们任何关于修改内容的信息。我们不得不去寻找拉动请求,以收集关于所做修改的任何背景,或者再次打开提交。fixing previous commit- 又是缺乏上下文made tests pass- 哪个测试文件被更新了?你至少应该给出被修复的测试文件的名称或区域。
所有这些都是提交信息的糟糕例子,因为它们含糊不清,缺乏信息,也缺乏上下文。它们迫使团队成员做更多的工作,以便了解发生了什么,这在任何团队中都是不可接受的。
如何制定一个提交策略
你可能认为提交代码就像直接提交和推送代码一样简单。但是,这里面还有一些内容。
让我们来谈谈如何制定一个有用的提交策略,以保持一致性并做出有用的提交。
做出小而具体的提交
较小的提交可以让你在出现问题时更容易将代码恢复到之前的状态。如果你的提交影响了太多的领域,恢复可能意味着失去大量的代码。
如果代码只与一个目的相关,评审员也更容易理解代码在做什么。
让我们看一个现实生活中的例子,这将如何工作。首先,我们需要添加我们的相关文件的变化。我们可以通过运行以下命令来查看我们的分支中哪些文件被修改了git status

git status的输出示例
正如你所看到的,有各种文件已经被修改/添加到项目中。不过,它们都是针对项目的不同区域。遵循 "保持提交量小且有关联 "的黄金法则,让我们看看如何将其付诸实践。
使用git add 后面的文件名,我们可以只提交相关的文件。我们通过使用git add 命令,加上我们想添加的文件名,像这样一个接一个的添加。
git add login.test.ts login.ts
如果我们现在检查git status ,我们会看到两个暂存的文件:

文件暂存后的 Git 状态输出示例
我们有了这些文件,现在要创建我们的提交。像往常一样,我们将利用git commit ,它将在VS Code中打开git编辑器(因为我们之前是这样设置的)。如果你跳过这一步,提交将在你喜欢的编辑器中打开。
我们将添加一个修改的提交信息:
Fix issue with login buttton not showing
就这样,一个小小的相关文件提交。提交信息告诉我们到底做了什么,问题在哪里,以及问题的一些小背景。
提交的坏例子
既然我们已经做得很成功了,让我们来看看一个坏的例子。
想象一下,我们已经完成了所有这些工作,而开发者使用git add -A 命令将所有更改/添加的文件一次性归档:

多个不相关的文件被暂存提交的例子
现在他们利用单行的 Git 命令创建了一个提交信息:
git commit -m 'Updated various areas such as validation, registration and products pages'
为什么会这样呢?
- 首先,这个提交中发生了太多的事情。太多的文件意味着,如果我们需要恢复验证的变化,只是我们无法做到。我们必须恢复整个提交,否则就会失去产品和注册的变化。
- 提交信息很冗长。我们可以去掉一些不必要的词,比如 "各个领域,如"。 它没有给提交信息带来任何价值,而且占用了可以用来表达更多内容的字符。
- 我们没有使用前面提到的命令式语气。我们应该把 "Update "改为 "Update"。
如果应用,这段代码将解决提交按钮在登录时不显示的问题
中途总结
所以在这一点上,我们已经学到了:
- 如何制定一个有用的提交信息
- 如何制定一个有效的提交策略,使我们能够轻松地跟踪相关的修改,以及一个更可维护的代码库。
- 什么是糟糕的提交
如何创建高效的拉动请求
决定何时推送
推送是指将你的提交提交到服务器/远程源码上,准备创建一个拉取请求(PR)。我建议在当前功能或错误完成后立即推送。
另外,保持你的 PR 小而精,只包含相关的提交,也是一个好主意。举个例子,如果你有以下的提交:
Add new product search componentAdd unit tests for product search componentAdd documentation for product search component
因为所有这些提交都与同一个组件有关,所以建议将它们拉到一个 PR 中。
而像这样的情况
Fix bug within login screenRefactor registration page for performanceUpdate validation tests for login formUpdate login tests for forgotten passwordUpdate unit tests for product search component
不应该放在同一个 PR 中,因为发生的事情太多了。这些提交应该被归入当时包含相关提交的几个PR。
如果这是一个分支的 Git 日志,由于提交的顺序问题,你将无法创建一个只有相关文件的拉动请求,因为你不能简单地告诉 Git 你想把提交 1、3 和 4 放到这个 PR 中。
保持小规模
记住--就像你的提交一样,保持你的 PR 的规模。没有人愿意在50多个文件的拉动请求中涉险。这样做的结果是,你的审查会受到 "对我来说很好 "的困扰。
当你创建一个大的PR时,它被翻译成*"我* 懒得看所有这些文件,但略微看了一下,看起来还不错"。另一方面,对于一个较小的PR,它的意思正是它所说的。
有时,大的拉动请求是不可避免的,比如在更新基础函数和类似的时候。但是,你应该尽量注意如何限制对其他开发者的影响。
如何让你的分支准备好接受代码审查
创建Pull Request的具体过程会因你所使用的版本控制托管平台而不同,但概念是相同的。
首先,你应该从你的 repo 中检查出main 分支。然后运行git pull ,这将把main 的所有最新代码放到你的本地开发系统中。
一旦你完成了这项工作,你就可以使用git checkout 和你的分支名称,例如git checkout login-fixes ,回到你自己的分支。
现在我们需要把main 分支的代码放到我们的分支中。我们可以利用git merge 命令来做这件事:
git merge main
如果有变化,也就是说,从主干线拉过来的文件有变化,你就需要创建一个 "合并提交"。这只是对你自己的分支的另一个提交,包含了合并后的变化。
只需创建另一个提交,并说明你已经从主干线合并了,就像这样。
git commit -m 'Merge main into login-fixes'
将你的修改推送到远程服务器上,使用git
如何创建拉取请求
最简单的方法是通过你喜欢的版本控制平台的网页界面来完成。在这个例子中,我们将使用GitHub。
只需导航到你的 repo,然后点击 Pull Requests 标签:

拉动请求标签 - GitHub
选择 "新的拉动请求"

新的拉动请求 - Github

当你创建一个拉动请求时,使用一个描述PR的标题,就像你在提交时那样:
PR - Fix login button not showing.
它可以为审查者提供一些背景信息,说明为什么这个PR是必要的,或者PR描述中的任何额外信息。
正如你在上面看到的,我选择了包括修复的内容,可能会使审查更顺利。我还包括了一些重要的信息,即在另一个PR被合并之前,这个PR不应该被合并。
当为一些公司工作时,他们可能会要求你在PR标题中加入一个票据参考,但我已经讨论过为什么我认为不需要这样做。
PR标签
如果你想让它更清晰,你可以利用PR标签。这些标签可以应用于PR,以说明PR的状态,或向其他人提供简单的信息。你可以在拉动请求页面的右边找到它们:

你可以从预定义的标签中选择,或者添加你自己的标签:
- 点击标签
- 输入你希望使用的标签。在我们的方案中,我们要添加一个叫做
Do Not Merge的标签。 - 输入数值后按回车键,你可以配置标签的颜色和名称。保存后,你现在可以再次输入它,它将显示在列表中。
- 选择你的新标签,然后就可以了。

点击创建拉动请求

就这样,你已经创建了你的第一个拉动请求。
如何审查一个PR - 最佳实践
审查PR时应注意的事项
总是退一步想一想一个好的代码审查的关键因素。以下是一些需要考虑的要点:
- 代码是否遵循你的团队的编码准则?
- 代码是否符合其目标/验收标准?
- 代码是否清晰易读,是否很容易理解它在做什么,而不需要大量的注释/文档?(这一点对我来说是最重要的,因为我是一个描述性函数和变量名称的超级粉丝)。
- 考虑到安全、性能或简单的易读性,代码是否需要任何重构?
- 代码是否遵循简单的设计模式/原则,如单一责任、抽象、封装等等?如果没有,你可以就如何实现这一目标提出建议,或者告诉那些不熟悉的人这意味着什么,以及它的好处。
- 是否有任何 "神奇的数字/字符串 "可以更好地作为一个常量或命名的变量?
及时审查PR
虽然你不一定觉得有义务立即查看一个PR,但也不要让作者悬空。这个PR可能会阻碍未来的工作,或者它可能很重要(如果是这样,作者应该明确说明)。
尽量保持讨论和公关意见的畅通。如果这样做更容易,你可以跳上电话(如果是远程)或在办公室拉上椅子,一起讨论公关。这可能会加快进程,并减少来回的等待。
综上所述,不要急于进行代码审查。要一丝不苟,仔细阅读每个文件和改动。我建议你把修改的分支拉下来,让自己看一下整个项目,而不仅仅是修改的那几行。
很多时候,如果你只看一两行代码的修改,你就不会知道代码到底应该怎么做。但如果你看的是整个文件,你就可以遵循流程。
如果你使用VS Code和GitHub,你可以利用他们自己的扩展来查看拉动请求和查看评论,同时在VS Code本身中查看PR分支。
我们都是人
请记住,我们都是人,人们在编码时经常会犯错误,可能会忽略一些事情。
不是每个人的编码方式都和你一样,所以不要因为他们的方式和你的方式不同就简单地要求修改。这并不意味着他们做错了,也不意味着你的方法是最好的。
清楚地描述修改,谨慎地表达你的意见
拉取请求不是考试,也不是让你严厉批评别人工作的机会。它是一个学习的机会,也是一个确保最好的代码进入主分支的机会。这是关于代码质量和代码是否符合验收标准的问题。
想想你在提出建议时使用的语言。PR评论与git提交信息是相反的。我们不再使用命令式的语气。不要命令他们进行修改,而是用从句的语气来提出柔和的建议。
当你在批评一个人很可能投入了大量精力的工作时,使用这样的句子。
如果是我,我会把这个if语句改成switch case语句,因为这样更容易阅读。
或者
也许可以考虑把这个变量重新命名为一个更直观的名字,比如{替代},以便从最初的阅读中更容易理解它在做什么。
如上所述,试着加入你的理由,说明你为什么要提出这个修改请求。这将使请求更有影响力,并允许作者思考是否最好进行修改,或者也许引发讨论以达成妥协。
提供改进建议
大多数Git系统都允许你点击你希望修改的那一行,然后添加注释,这样就可以更简单地指定你希望修改的确切代码行。
像GitHub这样的主机供应商有一个 "建议 "功能,允许你在注释中直接添加代码建议,这些建议可以立即被接受并在PR中提交。
如果没有这个功能,一定要确保你所要求的东西是清楚和简洁的。甚至可以改写,或者在评论中写出你的建议,比如。
也许可以考虑把这个if/else语句改成一个三元语句,就像这样。
var backgroundColor = isError ? 'red' : 'blue'
这使建议变得清晰,甚至加快了重写的过程(使用复制和粘贴)。
不要害怕为你的代码辩护
记住PR是一种讨论。这是一个双向的过程,让你有机会为你的代码辩护,并以更多的背景解释你的想法。
仅仅因为代码可能看起来不完美,可能有一个原因。可能有一些你无法控制的事情,迫使你不得不以某种方式来写代码。
不要害怕提出反驳,但是要准备好有效的理由,如果你真的相信你的解决方案。
告知PR已被批准
现在很多人都会把GitHub或版本控制的邮件通知过滤到一个文件夹里,由于仓库、提交、分支等的更新量很大,这个文件夹很少被查看。
为了加快这个过程,让作者更有乐趣,只需给他们发个消息。现在许多公司都提供某种形式的即时通讯服务,为什么不使用它呢?
在你的即时通讯平台上为公关设置一个特定的频道。在频道/聊天室中发布你的公关链接,并允许评论员通过在主题中回复来更新他们的进展。添加一个表情符号,使其更加轻松(因为我们都知道公关可能很无聊,所以为什么不把它们弄得更生动一点)。
总结
在这篇文章中,我们已经学会了:
- 如何设置VS Code与Git的集成
- 如何编写有用的 Git 提交信息
- 何时提交才能让团队更轻松
- 如何有效地对PR进行代码审查
- 如何以帮助所有团队的方式来处理PR。
希望你能学到一些新东西,感谢你阅读我的文章