Xue Hai Wu Ya · 学 · 海 · 无 · 涯

学 海 无 涯

一份属于自己的知识合集,随时可读、随处可读
2026·持续增补·xuehai-wuya.pages.dev
Volume · 01

网 络 篇

从零开始,一览网络世界的骨骼与经络
CH · 01

序章 · 网络是什么

What is a Network

网络(Network),本质上不过是"让两台机器能说上话"的一整套约定与设施。你手中的手机、桌上的电脑、远在天边的服务器——只要它们之间能传递信息,就构成了网络。

一句话理解

把网络想象成一条条看不见的公路:路面(物理线路)、交通规则(协议)、门牌号(IP 地址)、目的地房间号(端口)、快递员(路由器)——所有这些加在一起,才让"你发一条消息,对方能收到"这件事成立。

Analogy · 譬喻

寄一封信:你在信封上写下"某市某街某号(IP)张三收(端口)",投进邮筒(发送);邮局按流程分拣、转运(路由);最终送到收信人手上(接收)。网络传输,几乎就是这整个过程的电子版。

为什么要学网络

01

看懂"日常"

WiFi 为何断线、网页为何打不开、扫码为何转圈——理解原理便不再玄学。

02

解决问题

路由器该如何配置、DNS 为什么要换、VPN 究竟是什么——都能自己判断。

03

拓展视野

从聊天软件到 AI 大模型,几乎所有互联网产品的底层都躺着这套逻辑。

CH · 02

基础概念 · 主机、协议与地址

Hosts, Protocols & Addresses

入门先要认识三个最常听到的词:主机协议地址。它们像"参与者、规则、身份证",缺一不可。

三个最基础的概念

术语英文通俗理解举例
主机Host联网的任何一台设备手机、电脑、服务器、智能音箱
协议Protocol双方约定好的说话规则HTTPTCPDNS
地址Address一台设备的身份编号192.168.1.1(IP)、a4:5e:...(MAC)
客户端Client发起请求的那一方你的浏览器
服务器Server提供服务、响应请求的那一方百度的机房
数据包Packet被拆成小块的信息一张图片可能被拆成上千个包
Note · 提示

"协议"是网络学习中最重要的一个词。凡是双方需要交换信息,就必然存在某种协议。只要理解了"协议是一份约定书",后面所有 HTTP、TCP、IP 都不难理解。

CH · 03

分层模型 · OSI 与 TCP/IP

Layered Models

网络之所以能运作,是因为把一件"从一台机器传数据到另一台机器"的复杂事,切成一层一层的小事,每一层只操心自己那一块。上层不必知道下层怎么做,下层也不必理会上层内容是什么。

OSI 七层模型(学院派参考)

1984 年国际标准化组织提出的经典模型,把网络分成七层。虽然实际很少完全按七层实现,但它是理解网络的最佳教学地图

L7
应用层Application
用户看到的东西:网页、邮件、聊天
L6
表示层Presentation
数据格式、加密、压缩
L5
会话层Session
建立/维持/结束一次会话
L4
传输层Transport
保证数据从进程到进程可靠到达(TCP/UDP)
L3
网络层Network
寻址与路由,让数据穿越千山万水(IP)
L2
数据链路层Data Link
相邻两台设备之间的可靠传输(MAC / 以太网)
L1
物理层Physical
电信号、光信号、电磁波——真实的比特

TCP/IP 四层模型(工程实用版)

互联网工程中实际使用的模型更精简:应用层 → 传输层 → 网络层 → 网络接口层。它是 OSI 七层的"合并简化版",也是你以后遇到最多的说法。

OSI 七层 与 TCP/IP 四层 的对应关系 横向对比,粗看即懂
CH · 04

常见协议 · 一览通用语言

Common Protocols

协议是"网络的语言"。日常你会反复看到这些缩写,先建立最粗略的印象即可:

协议层级作用你可能见过它
HTTP / HTTPS应用层网页内容传输浏览器地址栏 https://
DNS应用层把域名翻译成 IPbaidu.com 变成 110.242.68.66
SMTP / IMAP应用层收发邮件邮件客户端配置
SSH应用层安全远程登录程序员登录服务器
TCP传输层可靠、有序、按字节流传输网页、聊天、文件下载
UDP传输层快速、不保证到达视频通话、游戏、直播
IP网络层寻址与路由你的公网 IP
ARP链路层由 IP 找到 MAC 地址局域网内互相识别
Analogy · 譬喻

TCP vs UDP:TCP 像挂号信,逐件签收、丢了会补寄;UDP 像广播喇叭,说一次就过去,丢了就丢了。视频聊天宁可掉几帧也不能卡顿,所以偏爱 UDP;网页则要求内容完整,所以用 TCP。

日常上网中,各类协议大致的流量占比 示意数据,用于建立直观印象
CH · 05

IP 与端口 · 门牌与房间

IP & Port

如果说 IP 地址是一栋楼的门牌号,那 端口就是这栋楼里的具体房间号。数据要送达,必须知道"送到哪栋楼的哪个房间"。

IP 地址

IPv4

四段数字

192.168.1.1,共约 43 亿个地址,早已不够用。

IPv6

八段十六进制

2001:db8::1,地址空间几乎无限,正在逐步普及。

私网 IP

局域网内使用

家里的 192.168.x.x10.x.x.x——只在本地有效。

公网 IP

互联网上唯一

由运营商分配,能被外网访问到。

端口

端口是 0 – 65535 的一个数字,用来区分"同一台机器上运行的不同程序"。几个你必须眼熟的默认端口:

端口协议用途
80HTTP普通网页
443HTTPS加密网页
22SSH远程登录
53DNS域名解析
3306MySQL 数据库默认端口
CH · 06

一次访问的旅程 · 从输入网址到看到网页

The Journey of a Request

以你在浏览器输入 www.baidu.com 为例,短短几百毫秒之内,其实发生了六个关键动作。看懂这一段,等于把前面所有概念串成一条线。

域名解析(DNS)

浏览器把 www.baidu.com 交给 DNS,问:"这个名字对应哪个 IP?"很快收到答案,比如 110.242.68.66

建立 TCP 连接(三次握手)

浏览器与服务器互相确认:"我要说话(SYN)— 我收到,我也要说(SYN+ACK)— 好,我们说吧(ACK)"。此时通道建成。

TLS 加密握手(若是 HTTPS)

双方协商加密算法、交换密钥,让后续内容不被中间人偷看。

发送 HTTP 请求

浏览器发出:GET / HTTP/1.1,告诉服务器"给我首页"。

服务器响应

服务器返回 HTML、CSS、JS、图片等资源,携带状态码(200 OK 表示成功)。

浏览器渲染

浏览器把收到的代码解析、绘制成你看到的网页,完成整个旅程。

一次典型 HTTPS 请求的各阶段耗时(示意) 让你对"快慢"有直观感觉
CH · 07

网络设备 · 数据的驿站

Network Devices

数据从你到远方,中间要经过若干"驿站"。它们各自分工:

Hub

集线器

最原始,只会广播——早已被淘汰,了解即可。

Switch

交换机

工作在链路层,按 MAC 地址在局域网内精准转发。

Router

路由器

工作在网络层,按 IP 地址跨网络转发——家里那台"猫盒子"就是它。

Firewall

防火墙

按规则允许/拦截数据包,是网络的守门人。

Gateway

网关

连接两个不同网络的"桥",家用路由器同时充当网关。

AP

无线接入点

把有线信号转成 WiFi 信号,让手机、笔记本无线上网。

小结 · Recap

到此,你已完成一次从概念 → 模型 → 协议 → 地址 → 旅程 → 设备的完整巡礼。剩下的深入话题——安全、无线、云——会作为独立章节陆续加入。

CH · 08

HTTP 深读 · 请求、方法与状态码

HTTP In Depth

HTTP(HyperText Transfer Protocol,超文本传输协议)是你每天点开一个网页时,浏览器与服务器之间讲的那门语言。它简单、直白、几乎无处不在。

一次 HTTP 对话长什么样

本质上就是"客户端问 → 服务器答",两段纯文本:

# 客户端发出的请求(Request) GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Chrome/120 Accept: text/html # 空一行表示头结束 # 服务器返回的响应(Response) HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 1024 <!doctype html><html>...</html>

请求由 起始行 + 头部字段 + 空行 + 可选正文 组成;响应同样如此。看似简陋,却是撑起整个 Web 的骨架。

常用 HTTP 方法

GET POST PUT PATCH DELETE HEAD OPTIONS
方法语义典型场景是否幂等
GET读取资源打开网页、查询数据
POST提交新数据登录、发帖、上传
PUT整体替换资源更新用户资料
PATCH局部修改只改一个字段
DELETE删除资源删帖、注销
HEAD只取响应头,不要正文探测资源是否存在
OPTIONS询问服务器支持什么跨域预检
Note · 幂等

"幂等"意思是:同一个请求,做一次和做一百次结果一样GET 只是读、不会变;DELETE 删过就是删过,再删也是"没有"。而 POST 每一次都会新增一条数据,所以不幂等。

状态码 · 五个家族

响应的第一行有一个三位数字,用百位划分家族,看百位就能猜出七八分:

1xx
Informational · 情报
"我收到了,你继续"。日常几乎见不到。
2xx
Success · 成功
200 OK、201 Created、204 No Content。是最想看到的家族。
3xx
Redirect · 重定向
"资源搬家了,去新地址找"。301 永久、302 临时、304 缓存未变。
4xx
Client Error · 客户端错
400 请求写错了、401 没登录、403 没权限、404 找不到、429 请求太多。
5xx
Server Error · 服务器错
500 内部错误、502 网关错、503 暂不可用、504 上游超时。锅在服务器。

常见头部字段

  • Host目标网站的域名,一台服务器可挂多个网站
  • User-Agent浏览器/客户端身份标识
  • Content-Type正文数据类型,如 application/json
  • Cookie客户端存的小凭证,登录状态就靠它
  • Authorization带 Token 的身份认证
  • Cache-Control缓存策略,控制多久重新拉取

HTTP 版本演进

HTTP 协议的三代演进 · 核心指标对比 数字为示意,代表每一代性能量级变化
CH · 09

DNS 深读 · 名字如何变成地址

DNS Resolution

DNS(Domain Name System,域名系统)是互联网的"电话簿"——你只记得住 baidu.com 这样的名字,机器却只认 110.242.68.66 这样的数字,DNS 负责在二者之间来回翻译。

为什么要有 DNS

人类的记忆是"语义型"的:容易记住 zhihu.com,很难记住 103.41.167.234。而且,同一个网站背后可能有几十上百台服务器 IP,还会变来变去;DNS 让你只关心名字,把 IP 交给系统。

域名的层级结构

域名从右向左,是"越大越靠右"的树形结构:

www . baidu . com . ↑ ↑ ↑ ↑ 主机名 二级域名 顶级域名 根(通常省略)
  • 根 (Root)整棵树的起点,全球共 13 组根服务器
  • 顶级域 TLD.com / .cn / .org / .io
  • 二级域你注册来用的名字,如 baidu
  • 子域名你可以自定义的前缀,如 wwwmail

一次解析 · 递归+迭代

浏览器先查缓存

浏览器 → 操作系统 → hosts 文件;若命中就直接用。

问本地 DNS(递归解析器)

通常是运营商或公共 DNS(如 8.8.8.8223.5.5.5)。

本地 DNS 逐级问询

问根 → 问 .com → 问 baidu.com 的权威 DNS。

拿到 IP 返回给你

本地 DNS 记住结果(缓存 TTL 秒),下次直接答。

常见 DNS 记录类型

记录含义示例
A域名 → IPv4baidu.com → 110.242.68.66
AAAA域名 → IPv6google.com → 2404:6800::200e
CNAME域名 → 另一个域名(别名)www.a.com → a.com
MX邮件服务器地址企业邮箱配置
TXT任意文本,用于校验、SPF、DKIM域名归属证明
NS该域由哪些 DNS 服务器管辖切换 DNS 服务商
Analogy · 譬喻

DNS 就像"114 电话查号台":你只说"我要找北京大学",查号台一层一层帮你查到具体号码——只不过这一切在 20 毫秒内完成,且每天在全球发生数万亿次。

CH · 10

TCP 三次握手与四次挥手

TCP Handshake

TCP 建立一次连接,需要三个来回;关闭连接,需要四个。这是网络课程最经典的"必背题",理解它能一举打通传输层。

三次握手 · 建立连接

Client · 客户端Server · 服务器
① SYN, seq=x
我想和你建连接,我的初始序号是 x
② SYN + ACK, seq=y, ack=x+1
我同意,我的初始序号是 y,也确认收到你的 x
③ ACK, ack=y+1
确认收到你的 y,连接建立完成

为什么是 三次而不是两次?因为要让双方都确认对方能收、能发。少一次,服务器就无法确认自己发的包客户端能收到。

四次挥手 · 断开连接

Client · 客户端Server · 服务器
① FIN, seq=u
我说完了,想关
② ACK, ack=u+1
收到,但我可能还有话没说完
③ FIN, seq=v
我也说完了,可以关
④ ACK, ack=v+1
收到,正式关闭

之所以要四次,是因为 TCP 是全双工——每一方"我说完了"要单独确认。中间那"两次"看似分开,其实是服务器"我收到你要关"与"我这边也关了"两条独立信号。

TIME_WAIT

主动关闭方在 ④ 之后会进入 TIME_WAIT 状态等待 2×MSL(大约 60 秒),确保最后那个 ACK 真的送达。你如果做服务端开发遇到"端口占用"报错,多半就是它。

CH · 11

子网与 CIDR · 把 IP 划成小院子

Subnetting & CIDR

一个 IP 地址实际上分成两半:网络号(哪个院子)+ 主机号(院子里的第几户)。子网掩码(Subnet Mask)就是那条"分割线"。

CIDR 记法

今天最常用的是 CIDR(Classless Inter-Domain Routing)写法,把掩码写成斜杠加数字:

  • 192.168.1.0/24前 24 位是网络号,后 8 位是主机号 → 254 台可用主机
  • 10.0.0.0/16前 16 位是网络号 → 65,534 台可用主机(大型公司内网)
  • 172.16.0.0/12前 12 位固定 → 约 100 万台可用主机
  • /32只有一台主机(常用于路由规则)

三段私有 IP 段(家用/公司内网专用)

网段范围典型用途
10.0.0.0/810.0.0.0 – 10.255.255.255大型企业内网
172.16.0.0/12172.16.0.0 – 172.31.255.255中型企业内网、Docker 默认
192.168.0.0/16192.168.0.0 – 192.168.255.255家用路由器、小型办公
Analogy · 譬喻

把 IP 想象成"小区门牌号":192.168.1.0/24 是"1 号院共 254 户";/16 就是把小区扩到 6 万多户。子网掩码就是那道"哪几位算院子、哪几位算门牌"的隔离墙。

CH · 12

NAT 与端口转发 · 一屋多户如何上网

NAT & Port Forwarding

你家里明明有十几个设备联网,运营商却只分给你一个公网 IP——它们是怎么共用的?答案是 NAT(Network Address Translation,网络地址转换)

NAT 做了什么

你发出请求

手机 192.168.1.10:53211 → 想访问 baidu.com:443

路由器改写"发件人"

把源地址改成路由器的公网 IP 1.2.3.4:60001,并在自己的映射表里记住"这条 60001 对应内网 192.168.1.10:53211"。

百度回复

回复送到 1.2.3.4:60001。路由器查表 → 发回给内网原来那台设备。

端口转发 · 让外网访问家里的机器

反向操作:你有一台家庭服务器想让外部访问?在路由器上做端口映射

# 例:把外网 8080 转到内网 NAS 的 80 端口 Public 1.2.3.4:8080 → Private 192.168.1.100:80
Note · 后果

NAT 是 IPv4 地址不够用的"缓兵之计":它拯救了整个互联网,也破坏了原本"每台设备可直连"的对等网络。这也是 IPv6 想彻底解决的问题。

CH · 13

网络安全 · 加密、认证与常见威胁

Networking Security

网络安全的三大目标可以浓缩成 CIA——机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)。不能被偷看、不能被篡改、随时可访问。

加密的两种基本套路

对称加密

Symmetric

加密解密用同一把钥匙。快,但麻烦在于"钥匙怎么安全地交给对方"。代表:AES。

非对称加密

Asymmetric

一把公钥公开、一把私钥保密。公钥加密的东西只有私钥能解。代表:RSA、ECC。

哈希

Hash

把任意数据变成固定长度指纹(不可逆)。用于校验完整性、存密码。代表:SHA-256。

数字签名

Signature

用私钥对数据摘要签名,对方用公钥验证——证明"这确实是我发的且没被改"。

HTTPS = HTTP + TLS

你在地址栏看到的小锁,背后是 TLS(Transport Layer Security):客户端和服务器先用非对称加密协商出一把临时对称密钥,之后所有内容都用对称密钥加密传输——既安全又快

常见威胁一览

攻击手法典型防御
中间人 (MITM)在你和服务器之间偷偷插一脚HTTPS + 证书验证
钓鱼 (Phishing)伪装成正规网站骗你输密码看清域名、启用 MFA
DDoS海量流量把服务器打瘫CDN、WAF、流量清洗
SQL 注入在输入框里塞恶意 SQL参数化查询、ORM
XSS在网页里注入恶意脚本输入转义、CSP
暴力破解穷举密码强密码、频次限制、锁定
日常习惯 · 三条

1. 密码不复用,用密码管理器。
2. 尽量开启二步验证(MFA)。
3. 公共 WiFi 上做敏感操作前,先确认是 HTTPS。

CH · 14

无线与移动网络 · WiFi、蓝牙与 5G

Wireless & Mobile

把线拔掉、让数据通过电磁波传输,就是无线网络。它们靠频段信道协议三件事区分。

WiFi 各代速览

标准俗名频段理论速率
802.11nWiFi 42.4 / 5 GHz600 Mbps
802.11acWiFi 55 GHz3.5 Gbps
802.11axWiFi 6 / 6E2.4 / 5 / 6 GHz9.6 Gbps
802.11beWiFi 72.4 / 5 / 6 GHz46 Gbps
2.4G vs 5G WiFi

2.4GHz 像低频广播——传得远、穿墙好,但速度慢、干扰多;
5GHz 像高频广播——速度快、干扰少,但传不远、穿墙差。所以现代路由器"双频合一",让手机自动选。

蓝牙、NFC、Zigbee

  • 蓝牙 (BT)短距、点对点,用于耳机、鼠标、传文件
  • BLE蓝牙低功耗,用于手环、门锁、iBeacon
  • NFC数厘米,用于支付、门禁、公交卡
  • Zigbee低功耗自组网,智能家居设备常用

蜂窝网络 2G → 5G

蜂窝网络代际演进 · 峰值下行速率 数值为常见理论峰值,实际体感取决于基站与频段

5G 的意义不只是"更快",还有 低时延(1ms 级)海量连接(每平方公里 100 万设备)——这是自动驾驶、工业互联网、AR/VR 的地基。

CH · 15

云与边缘 · CDN、云网络与容器

Cloud & Edge

过去的网络世界是"我搭机房、我买带宽、我配路由器";今天大部分服务都跑在上,用户和服务之间还夹着边缘节点

CDN · 内容分发网络

CDN 是"把内容提前搬到离你最近的机房"的技术。你在深圳打开某网站,其实是访问了深圳的缓存节点,而不是远在美国的源站。

请求先命中 CDN 边缘节点

DNS 会根据你的位置返回最近节点的 IP。

节点若有缓存 → 直接返回

毫秒级响应,源站毫无负担。

没有缓存 → 回源

从源站拉一次,缓存下来,之后同一区域的人都受益。

云网络三件套

VPC

虚拟私有云

你在云上"圈出的一块独立网络",就像自己的机房。

SLB

负载均衡

一个公网 IP 分发到多台后端服务器,避免单点。

SG

安全组

云上的防火墙规则,决定谁能连你的机器。

容器网络

Docker、Kubernetes 让每个应用装进一个"集装箱",容器之间通过虚拟网络互通。ServiceIngressPod IP 是你以后会反复看到的词——但本质仍是本文前面讲过的 IP、端口、DNS。

思路 · Recap

无论多么复杂的云原生架构,拆开都是 IP + 端口 + 协议 + 路由 + DNS。只是数量更多、层级更深,运行在别人的机房里而已。

CH · 16

排错工具箱 · 五个救急命令

Troubleshooting Toolkit

当"上不了网"时,怎样一步步定位?以下五个命令是终端里的"急救包",Windows 和 macOS/Linux 略有差异,写法我一并给你:

① ping · 测通不通

发送 ICMP 包,看对方能不能回。是最基础的"我能到吗?"

$ ping baidu.com # 若一直丢包 → 对方或链路有问题

② traceroute · 走了哪条路

逐跳追踪数据包路径,看在哪一站出问题。

Linux/mac $ traceroute baidu.com Windows > tracert baidu.com

③ nslookup / dig · 域名解析

怀疑域名解析出错时用它。

$ nslookup baidu.com $ dig +short baidu.com # 更漂亮的输出

④ curl · 手动发一次 HTTP 请求

不打开浏览器就能看服务器返回。

$ curl -I https://baidu.com # 只看响应头 $ curl -v https://baidu.com # 显示握手细节

⑤ netstat / ss · 谁占了端口

本机端口被谁占用、有哪些连接开着。

Linux $ ss -tunlp macOS $ lsof -i -P -n | grep LISTEN Windows > netstat -ano | findstr :443
排错三步法

ping 网关能通吗?→ 不能就是本地网络问题。
ping 8.8.8.8 能通吗?→ 不能就是运营商问题。
ping baidu.com 能通吗?→ 不能但 ② 通,就是 DNS 问题。

CH · ??

未完待续 · 更多板块

Coming Chapters

下方为预留占位,后续章节将按同样的排版规则加入。

◇ ◇ ◇

IPv6 与下一代互联网

为何 IPv4 不够用、IPv6 长什么样、如何过渡。

◇ ◇ ◇

网络性能优化

为什么慢?TTFB、RTT、丢包与拥塞控制。

◇ ◇ ◇

网络编程入门

Socket、Web 请求、简单服务器代码实战。

Volume · 02

Git 篇

用一部时间机器,管理你所有的代码与文字
CH · 01

序章 · Git 是什么

What is Git

Git 是一部时间机器,也是一份分身术——它记住你每一次修改,让你可以随时回到过去;也让你同时活在多条时间线里,做完实验再决定要不要保留。

一句话理解

Git 是一个分布式版本控制系统:它把你的整个项目历史存在一个 .git 文件夹里,让你可以查看、比较、回退任何一次改动。它由 Linux 之父 Linus Torvalds 于 2005 年为管理 Linux 内核而写。

Analogy · 譬喻

如果说"网盘"是保存最新一份文件,Git 就是保存所有版本的私人史官——从你项目诞生那一秒起的每一次改动都被记录,且可以用一条命令回到任意时刻。

为什么要学 Git

01

不再"final_v3_真的最终版"

每一次改动自动有版本号,随时可回退,不再靠文件名区分。

02

多设备无缝同步

推到 GitHub,家里公司随时接着写。

03

多人协作不打架

用分支把每个人的改动隔离,最后再合并。

04

时光机自救

"糟糕,代码删多了" —— 一条命令回到 30 分钟前。

CH · 02

概念地图 · 仓库、工作区、暂存区

Core Concepts

入门 Git 最重要的一步:建立"三个区"的心智模型。所有 Git 命令都是在这三个区之间搬运东西。

三个区 · The Three Trees

  • 工作区Working Directory —— 你当前看得见、能编辑的文件夹
  • 暂存区Staging Area / Index —— 一个"待打包"的清单,决定这次提交带走哪些改动
  • 仓库Repository —— .git 文件夹,保存所有历史版本
Analogy · 譬喻

寄快递:工作区是你桌面上散落的东西;暂存区是你挑好、放进纸箱的东西;仓库是快递公司的档案库,收下后就永久登记。
git add = 把东西放进纸箱;git commit = 封箱送走。

三条常用命令的定位

命令做什么影响哪个区
git add 文件把改动加入暂存区工作区 → 暂存区
git commit -m "说明"把暂存区打包为一次提交暂存区 → 仓库
git checkout 文件放弃工作区改动,回到上一版仓库 → 工作区
git reset 文件把改动从暂存区退回工作区暂存区 → 工作区
三个区之间的流动 · Git 命令的搬运方向 看懂这张图,Git 就入门一半
CH · 03

初次上手 · 从零建立一个仓库

First Repo

你已经用 Git 部署过 xuehai-wuya,我们复盘一下每一步的意义。

四步建立一个 Git 项目

初始化仓库

在项目文件夹里执行 git init——Git 会新建一个隐藏的 .git 目录,作为整个仓库的大脑。

配置身份

git config user.name "你的名字"git config user.email "你的邮箱"——决定这次提交的作者是谁。

加入所有文件

git add .——把当前目录里的所有变化放入暂存区。

提交

git commit -m "初次提交"——把暂存区打包成一次带说明的历史记录。

完整命令示例

PS> cd 'd:\我的项目' PS> git init PS> git config user.name "wang" PS> git config user.email "wang@example.com" PS> git add . PS> git commit -m "初次提交"
.gitignore

项目里总有一些"不想被跟踪"的文件(临时缓存、密码、大二进制)。在根目录建一个 .gitignore 文件,写上不想上传的内容,Git 就会自动忽略:

# .gitignore 示例 node_modules/ *.log .env .DS_Store *.zip
CH · 04

日常命令 · 十条最常用

Daily Commands

日常 95% 的 Git 使用,就是这十条命令的组合。背下它们,你就能自如工作。

命令作用使用频率
git status看当前哪些文件改动了、哪些进了暂存区★★★★★
git add .把所有改动加入暂存区★★★★★
git commit -m "说明"提交暂存区★★★★★
git push把提交推到远程(GitHub)★★★★★
git pull从远程拉取别人的更新★★★★☆
git log看历史记录★★★★☆
git diff看具体改动了什么★★★☆☆
git branch查看/新建分支★★★★☆
git checkout / switch切换分支★★★★☆
git merge合并另一条分支★★★☆☆

典型的一天

PS> git status # 看看有什么变化 PS> git add . # 全部纳入暂存 PS> git commit -m "新增登录页" # 提交 PS> git push # 推到远程
Note · Commit 说明的写法

一条好的提交信息应该一句话说清"这次改了什么、为什么"。业界流行的规范叫 Conventional Commits:feat: 新增登录功能fix: 修复分页错误docs: 更新 README

CH · 05

分支 · 平行世界的开关

Branching

分支(Branch)是 Git 最重要的特性:它让你可以在不影响主线的前提下尝试任何改动。做完满意就合并,不满意就抛弃。

分支是什么

分支不是"复制一份代码",而是一个指向某次提交的可移动指针。默认分支叫 main(旧版叫 master)。

分支常用命令

  • git branch列出所有本地分支,当前所在分支前面有 *
  • git branch feat-login新建一个叫 feat-login 的分支
  • git switch feat-login切换到该分支(新版命令)
  • git switch -c feat-login一步到位:新建 + 切换
  • git branch -d feat-login删除该分支(已合并的)
  • git branch -D feat-login强制删除(未合并也删)

分支的典型工作流

从 main 开一个新分支

git switch -c feat-search,开始搞"搜索功能"。

在分支上改代码、提交

正常 add / commit,改坏也不影响 main。

切回 main

git switch main,此时你看到的代码回到未加搜索功能的状态。

合并 or 抛弃

满意就 git merge feat-search;不满意就 git branch -D feat-search

Analogy · 譬喻

分支像写小说时的多个存档:主线剧情一直存着,你另开一个 slot 尝试"如果主角选另一条路会怎样"。写不下去就删掉存档,写好了就把它并回主线。

CH · 06

合并与冲突 · 两条河汇入一条

Merge & Conflicts

merge 与 rebase

merge

合并式

把两条分支的提交都保留下来,多一个"合并提交"节点。历史真实但可能显得杂乱。

rebase

变基式

把你的提交"复制粘贴"到目标分支尾部,历史看起来是一条直线。整洁但改写了历史。

建议

刚学 Git 时只用 merge 就够了,安全、直观。rebase 是熟练之后再学的进阶技巧。

冲突长什么样

当两条分支改了同一个文件的同一处,Git 无法自动判断该用谁的,就会产生冲突。文件里会出现这样的标记:

<<<<<<< HEAD 我这边的版本 ======= 另一分支的版本 >>>>>>> feat-search

三步解冲突

打开冲突文件

手动决定保留哪一边(或两边都要),删掉那些 <<</===/>>> 标记。

标记冲突已解决

git add 文件

完成合并

git commit(无需 -m,Git 会自动写一条合并说明)

CH · 07

远程 · 与 GitHub 对话

Remotes

本地仓库和远程仓库(GitHub 上那份)通过"远程地址"关联。默认远程别名叫 origin

常用远程命令

命令作用
git remote -v看已配置的远程地址
git remote add origin URL添加一个叫 origin 的远程
git remote remove origin移除远程
git push -u origin main首次推送并绑定跟踪关系(-u 只需要一次)
git push之后直接推
git pull拉取并合并远程更新
git fetch只拉取,不自动合并
git clone URL克隆一个远程仓库到本地

HTTPS vs SSH

  • HTTPS形如 https://github.com/xxx/yyy.git,每次推送要密码/Token
  • SSH形如 git@github.com:xxx/yyy.git,配好密钥后一劳永逸
Token 认证

从 2021 年起 GitHub 不再支持密码登录,必须用 Personal Access Token(PAT)。在 Settings → Developer settings → Personal access tokens 里生成,第一次 push 弹窗时把它当密码填即可。Windows 会用凭据管理器帮你记住。

CH · 08

时光机 · 回退、撤销与拯救

Undo & Recovery

Git 最迷人的地方,是几乎所有操作都可撤销。你以为删没了?只要提交过一次,就能捞回来。

不同场景对应不同"撤销"

情况命令
改错了,还没 add,想还原git checkout -- 文件git restore 文件
已经 add 了,想退回工作区git reset HEAD 文件git restore --staged 文件
已经 commit 了,想改上一条 commit 说明git commit --amend -m "新说明"
想撤销最近一次 commit(保留改动)git reset --soft HEAD~1
想彻底丢掉最近一次 commitgit reset --hard HEAD~1(危险)
想不改历史、追加一条"反悔"commitgit revert 提交号
终极救命 · reflog

如果你误 reset --hard 把提交搞没了 —— 别慌!git reflog 会列出你所有"HEAD 曾经指向过的位置",找到那个提交号,git reset --hard 提交号 就能救回。Git 通常要 30 天后才真正删除。

CH · 09

协作流 · PR、Fork 与团队工作流

Collaboration

Pull Request(PR)· 请求合并

在 GitHub 上,你不能直接把改动推到别人的仓库。标准动作是:

Fork

在别人的仓库右上角点 Fork,得到一个属于你自己的副本。

Clone 你的 Fork

git clone https://github.com/你/xxx.git,本地开始改。

开分支 + 改 + 提交 + 推

把改动推到你自己的 Fork。

发起 Pull Request

在原仓库页面点 "New pull request",说明你改了什么。等原作者审核合并。

三种主流团队工作流

01

Git Flow

有 master / develop / feature / release / hotfix 多种分支。经典但重。

02

GitHub Flow

只有 main + feature 分支。GitHub 官方推荐,轻量高效。

03

Trunk Based

大家都往 main 提交,短命分支即开即合。Google、Facebook 在用。

建议

小团队/个人项目 → GitHub Flow 就够了;大型持续发布产品 → Git Flow;追求速度的顶尖工程团队 → Trunk Based。

CH · 10

锦囊 · 高频问答与私藏技巧

Tips & Q&A

十个高频问答

  • Q · 忘了 -m 写说明?默认会弹出编辑器(vim/nano),按 i 编辑,写完 Esc:wq 保存退出
  • Q · 想少打 git status?配置别名:git config --global alias.s status,之后 git s 即可
  • Q · 提交历史像坨面条?git log --oneline --graph --all,一览无余
  • Q · 改动只想推一部分?git add -p 逐块选择要加什么
  • Q · 临时切走但不想 commit?git stash 暂存,回来后 git stash pop 还原
  • Q · 想看某文件的历史?git log -p 文件名
  • Q · 谁写的这一行代码?git blame 文件
  • Q · 想同步别人最新更新?git pull --rebase,比默认 pull 历史更整洁
  • Q · 上传了敏感信息怎么办?立即改密码 + 用 git filter-repo 清历史 + 强推。血泪教训是永远不要直接推 .env
  • Q · GUI 工具推荐?VS Code 自带 Source Control 面板;进阶用 GitKraken、SourceTree、Fork

三条私藏技巧

Tip · 1

写有意义的 commit 信息。一年后你翻历史,能不能一眼看懂当时改了什么,全看当时那句 -m。

Tip · 2

小步提交,频繁 push。一次改 1000 行难以复审也难以回退;一次改 100 行,回退极其精准。

Tip · 3

先建 .gitignore 再 git add .。否则一旦把 node_modules 之类的大目录传上去,之后想清很麻烦。

收束 · Recap

Git 的世界看似浩瀚,其实日常 90% 只用五个动作statusaddcommitpushpull。剩下的都是"救命"和"进阶",遇到时再查即可。

CH · ??

未完待续 · 更多板块

Coming Chapters
◇ ◇ ◇

Git 内部原理

对象、SHA-1、pack 文件、HEAD 指针背后的世界。

◇ ◇ ◇

GitHub Actions · CI/CD

推送时自动测试、自动部署,让代码自己会跑起来。