深入理解和运用 Git

深入理解和运用 Git

Git 本质上只是一个版本管理的工具,但当我们更了解这个工具的底层实现时,我们可以更好的去使用它并理解它的行为。

在工作中经常会遇到一些小伙伴对 Git 不够熟悉,比如不知道如何规避冲突,处理不可避免的冲突等。

本文适合有一定 Git 基础的读者阅读,我会在其中分享一些我对 Git 的了解和使用经验,并默认读者已经了解了基础的概念,如 add、commit、pull、push、remote、fetch 等。

Git 对象

该章节主要是简略的讲述下 10.2 Git 内部原理 - Git 对象 中的内容。

Git 的核心部分是一个简单的键值对数据库(key-value data store),你可以向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键(sha1),通过该键可以在任意时刻再次取回该内容。

Git 的 commit、我们存储的文件、文件夹都是不同类型的 Git 对象,分别对应着 commit objectblob objecttree object

这些不同类型的 Git 对象在写入 Git 后,都存储于仓库(下文将简称 repo)的 repo/.git/objects 目录下,详细介绍见下文。

阅读更多
在 RemaxJs 中实现 useShowFromNavigateBack

在 RemaxJs 中实现 useShowFromNavigateBack

需求

在 pageA 跳转到 pageB 后,用户在 pageB 中一顿操作,navigateBack 回来后我们需要发起请求验证操作状态。

实现

那么我们如何知道用户返回了 pageA 呢,直接使用 useShow 会有一些问题,因为这个 api 在其他情况下也会触发(比如用户进入 app)。

所以我们需要增加一些判断,在用户跳转到 pageB 后,pageA 显示了,那就说明 pageB 销毁了。

以下代码是完整的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import { useRef } from 'react'
import { nextTick, useHide, useShow } from 'remax/wechat'

export function useShowFromBack(callback: () => void) {
// 当前页面的索引
const pageIdx = useMemo(() => getCurrentPages().length, [])
// 是否已跳转
const navigated = useRef(false)

useHide(() => {
// 此时新页面还未建立,需要 nextTick 后再获取
nextTick(() => {
if (getCurrentPages().length > pageIdx) {
// 新增了页面,说明跳转到新页面了
navigated.current = true
}
})
})

useShow(() => {
if (!navigated.current) return
// 已经跳转了但当前页面显示了,说明返回到此页面了
navigated.current = false
callback()
})
}
使用NodeJs爬取英雄联盟帐号所有区的资产

使用NodeJs爬取英雄联盟帐号所有区的资产

起因

我应该也称得上是一名英雄联盟的老玩家了, S3 赛季就被同学拉入坑, 期间断断续续在多个大区创建了账号.

因为不固定玩某个大区, 所以我并没有一个大区达到了满英雄, 这使得我每次想练英雄时, 都得通过英雄联盟社区或 WeGame 去查找我已购买那个英雄的大区.

经历了多次这样的情况后, 我决定写这么一个爬虫来帮助我统计指定英雄联盟账号上所有大区的资产.

阅读更多