你应该使用的现代 Git 命令和功能

我们所有软件工程师每天都在使用 git,但大多数人只接触过最基本的命令,如 addcommitpush 或者 pull, 好像还停留在 2005 年。

不过,Git 从那时起引入了许多功能,使用它们能让你的生活变得更轻松,下面就让我们来了解一下最近添加的一些现代 Git 命令。

Switch

自 2019 年以来,或者更准确地说,自 Git 2.23 版引入以来,我们可以使用 git switch 来切换分支:

git switch other-branch
git switch -  # 切换回上一个分支,类似于 "cd -"
git switch remote-branch  # 直接切换到远程分支并开始跟踪

git checkout 是一个非常灵活的命令。它可以(除其他外)签出或恢复特定文件甚至特定提交,而新的 git switch 只能切换分支。此外,switch 还会执行额外的正确性检查,而 checkout 则不会,例如,如果会导致本地改动丢失,switch 就会中止操作。

Restore

Git 2.23 版新增的另一个子命令/功能是 git restore,我们可以用它将文件恢复到上次提交的版本:

# 取消对文件的修改,与 "git reset some-file.py" 相同
git restore --staged some-file.py

# 取消并丢弃对文件所做的更改,与 "git checkout some-file.py" 相同
git restore --staged --worktree some-file.py

# 将文件恢复到之前的某个提交,与 "git reset commit -- some-file.py" 相同
git restore --source HEAD~2 some-file.py

上述代码段中的注释解释了各种 git restore 使用。一般来说, git restore 替换和简化 git resetgit checkout 的使用场景,它们的功能过于复杂。关于 revertrestorereset 的比较,请参阅本文档。

Sparse Checkout

下一个是 git sparse-checkout,这是在 2020 年 1 月 13 日发布的 Git 2.25 中添加的一个不起眼的功能。

比方说,你有一个大的 monorepo,其中的微服务被分隔到各个目录中,由于版本库太大,checkoutstatus 等命令执行起来超级慢,但也许你真的只需要处理单个子树/目录。那么,git sparse-checkout 就能帮到你:

$ git clone --no-checkout https://github.com/derrickstolee/sparse-checkout-example
$ cd sparse-checkout-example
$ git sparse-checkout init --cone  # 配置 git, 只匹配根目录下的文件
$ git checkout main  # 只检出根目录中的文件
$ ls
bootstrap.sh  LICENSE.md  README.md

$ git sparse-checkout set service/common

$ ls
bootstrap.sh  LICENSE.md  README.md  service

$ tree .
.
├── bootstrap.sh
├── LICENSE.md
├── README.md
└── service
    ├── common
    │   ├── app.js
    │   ├── Dockerfile
    ... ...

在上面的例子中,我们首先 clone repo,但并没有 checkout 所有文件。然后使用 git sparse-checkout init --cone 配置 git 只匹配仓库根目录下的文件。这样,在运行签出后,我们只有 3 个文件,而不是整棵树。要下载/检出特定目录,我们使用 git sparse-checkout set ....

如前所述,这在本地处理庞大的版本库时非常方便,但在 CI/CD 中,当你只想构建/部署 monorepo 的一部分,而不需要检出所有内容时,这对提高流水线性能同样有用。

有关 sparse-checkout 的详细介绍,请参阅本文。

Worktree

一个人可能需要同时在单个应用程序(版本库)中开发多个功能,或者当你正在处理某个功能请求时,可能会出现一个 critical 级别的错误,这种情况并不少见。

在这种情况下,您要么需要克隆多个版本/分支的版本库,要么就需要隐藏/丢弃当时正在处理的内容。2018 年 9 月 24 日发布的 git worktree 就是解决这些情况的办法:

git branch
# * dev
# master

git worktree list
# /.../some-repo  ews5ger [dev]

git worktree add -b hotfix ./hotfix master

# 准备 worktree (new branch 'hotfix')
# HEAD 现在是 5ea9faa 已签名提交。

git worktree list
# /.../test-repo         ews5ger [dev]
# /.../test-repo/hotfix  5ea9faa [hotfix]

cd hotfix/  # 干净的 worktree, 你可以在其中进行修改并推送

该命令允许我们同时签出同一版本库的多个分支。在上面的例子中,我们有两个分支 dev 和 master。假设我们正在开发分支中开发功能,但有人告诉我们要进行紧急错误修复。与其将更改存储起来并重置分支,不如在主分支的 ./hotfix 子目录下创建一个新的 worktree。然后,我们就可以移动到该目录,进行修改、推送并返回到原始 worktree。

更多详细内容,请参阅本文。

Bisect

最后但并非最不重要的是 git bisect,它并不新鲜(Git 1.7.14,2012 年 5 月 13 日发布),但大多数人只使用 2005 年左右的 git 功能,所以我觉得还是值得展示一下。

正如文档页面所描述的:git bisect,使用二进制搜索查找引入错误的提交:

git bisect start
git bisect bad HEAD  # 提供出问题的提交
git bisect good 479420e  # 提供你知道正常运行的提交
# Bisecting: 2 revisions left to test after this (roughly 1 step)
# [3258487215718444a6148439fa8476e8e7bd49c8] Refactoring.

# 测试当前提交...
git bisect bad  # If the commit doesn't work
git bisect good # If the commit works

# 根据最后一条命令,Git 在 bad 与 good 之间进行二分查找
# 继续测试直到找原因

git bisect reset  # 重置为初始提交

我们先用 git bisect start 显式启动分段会话,然后提供不工作的提交(bad 的提交,很可能是 HEAD)和最后一次已知的正常运行提交或标记。有了这些信息,git 就会检查出介于 badgood 提交之间的一个提交。这时,我们需要测试该版本是否存在漏洞,然后用 git bisect good 告诉 git 它能正常工作,或用 git bisect bad 告诉 git 它不能正常工作。我们不断重复这个过程,直到没有提交,git 就会告诉我们哪个提交引入了问题。

我建议你去文档页面看看,那里有更多关于 git bisect 的选项,包括可视化、重放或跳过提交。

如果你搜索一些与 git 相关的问题,你很可能会在 StackOverflow 上找到有几千个向上投票的答案的问题。虽然这个答案很可能仍然有效,但很可能已经过时,因为它是 10 年前写的。因此,可能还有更好、更简单、更容易的方法。因此,当遇到一些 git 问题时,我建议查看 git 文档,了解最新的命令,这些命令都有很多很好的示例,或者浏览 man 页面,了解多年来添加到老命令中的很多标记(flags)和选项(options)。


我不再使用 React.setState 的 3 个理由

Michel Weststrate

CloudBoost

Michel Weststrate published in CloudBoost · Jun 15, 2016

自几个月前,我已在所有我新写的 React 组件弃用 React 的 setState 。别误会我,我没有弃用本地组件状态,我只是不再用 React 去管理它,并且令人愉快!

使用 setState 对初学者来说很棘手。即使经验丰富的 React 程序员在使用 React 自有状态机制时,也很容易引入微妙的 bug,例如:

忘记 React 状态是异步的而引入了 bug,日志输出总是在后面一项。

这篇优秀的 React 文档总结了错误使用 setState 的各种情况:


Web scraping experiment with AI (Parsing HTML with GPT-4)

从网络搜索结果中解析数据往往是一件麻烦事。但如果有一种方法能让这一艰苦的过程变得轻而易举呢?让我们尝试一下 OpenAI 的新人工智能模型吧。

Hilman Ramadhan

Hilman Ramadhan


水歌的开源实验

2020 中国开源年会」官网开发及成都站总结

官网开发 —— 骑马造车

展厅需求与日程难题

COSCon’20 筹备伊始,组委会分派给我的首要任务是合作伙伴云展厅的开发,以便在疫情尚未平息之时的线上大会给各大合作伙伴一个集中宣传的窗口。

但云展厅的设计图并非一般线下大会在官网贴一屏 logo 那么简单,还有文字简介宣传视频加群二维码入选的议题与讲师等等。面对这样的需求,必然难以用近年技术站流行的 MarkDown 网站生成器来规范而高效地实现,因为去年用 YAML 文件维护前两年的 logo 墙已经很繁琐了。

提到合作伙伴关联的议题、讲师,又让我想起参加 COSCon 2018、2019 时手拿一张尺寸巨大、文字特小的日程表找会场时的痛苦,与参加台湾 COSCUP 2019 手持会议 App 畅游时的体验形成鲜明对比。

OPass logo - 台湾开源会议通用 App

与我一同经历上述 3 场大会的庄表伟老师(开源社 2020 年度理事长),在 COSCon’19 现场曾和我不约而同地提出“要做个开源会议系统”,大会结束后便以产品配开发的搭档火速开干,但又因团队缺乏精力而停摆……


星星之火,可以燎原

大家好,我是牛牛,我来自 FCC 成都社区

如果你问我为什么要在开篇自我介绍,因为我对 FCC 以及 FCC 的每一个人感到骄傲和自豪!

💫 故事从这里开始

10 月 24 号在这个对计算机行业来说很特殊的日子,FCC 成都社区承办了 2020 年中国开源年会成都分会场。大会主题是开源向善,开源一词看似是程序员专属,可成都分会场的志愿者大部分却不是计算机专业,有森林保护专业、国际贸易专业、外语专业等。当我问她们为什么会来时,她们答道“看到了,就想来了解一下”。

或许有时就是不经意间听到的某个观点或某句话,就会在自己心中种下了一颗种子,一颗永远不会枯死的种子。


GitHub 在线 IDE 初体验

之前就有听说 GitHub 将推出在线 IDE,一搜索发现很多结果。

现在 GitHub 的在线 IDE 发布一段时间了,官方命名为:GitHub Codespaces(点击可以申请),今天我们就来体验一下。


【公益】高考志愿填报助手

2020 年高考是一场非常不容易的高考,毕业生和社会各界都历经艰辛,希望我们的拼搏都能有更加美好的明天。

说起填志愿,回想起我高考时正值汶川大地震。那时我们获取可靠、有效、全面的志愿参考信息,基本只能通过学校发的一本大部头参考书,里面汇集了全国招生的院校、专业和往年录取数据。但这样一本像过去每个城市的电话黄页一样的书,反复查阅它的“低效”痛苦就不用多说了。

进入大学 IT 技术社团之后,就一直想用自己学到的编程技术,来为学弟学妹解决我当年那般的痛苦。但彼时,我国政府部门信息公开政策的保守和技术的落后,让我们很难获得好用的数据,商业平台又有巨大的封闭壁垒,遂作罢……

直到前一阵子,FCC 一位城市社区组织者在群里分享了黄希彤老师的填教授公益项目,看到他把多年收集的公开数据用统计学方法进一步处理,免费为广大考生做参考,内心十分激动!于是想尽自己现在的专长所能,帮黄老师优化一下前端界面,让广大的考生和家长用起来更方便。


GraphQL + Koa + React 项目实践

项目背景

源于 2019 年 11 月 16 日 FCC 成都社区主办的 Web 全栈大会上尹吉峰老师的 GraphQL 的分享,让我产生了浓厚的兴趣。GraphQL 是一个用于 API 的查询语言,是使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。一个 GraphQL 服务是通过定义类型和类型上的字段来创建的,然后给每个类型上的每个字段提供解析函数。

参考学习资料:

基于以上的一番学习,做了个实践的小项目,就代码做以下分析。

(附上项目地址:react-graphql-project


JavaScript 效率工具

每当看到发在 FCC 成都社区群里的技术文章,水歌都忍不住去指出它的不足。

今天评注的文章题为《一批提升你工作效率的 JS 工具方法》,文中的 60 个方法与上次评注的“24 个 ES 方法”类似,不够简洁优雅,与最新 ECMAScript、DOM 标准有些差距,有些“复制粘贴老文章片段”的感觉。

接下来,我就按功能类别来对一些有必要优化的工具方法一一重构。


【青铜三人行】每周一题之验证栈序列

先说一个消息,为了方便互相交流学习,青铜三人行建了个微信群,感兴趣的伙伴可以扫码加下面的小助手抱你入群哦!

青铜三人行小助手(其实是 Helen)

每周一题,代码无敌~ 这次的主题是 「贪心算法」


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×