学 海 无 涯
网 络 篇
序章 · 网络是什么
网络(Network),本质上不过是"让两台机器能说上话"的一整套约定与设施。你手中的手机、桌上的电脑、远在天边的服务器——只要它们之间能传递信息,就构成了网络。
一句话理解
把网络想象成一条条看不见的公路:路面(物理线路)、交通规则(协议)、门牌号(IP 地址)、目的地房间号(端口)、快递员(路由器)——所有这些加在一起,才让"你发一条消息,对方能收到"这件事成立。
寄一封信:你在信封上写下"某市某街某号(IP)张三收(端口)",投进邮筒(发送);邮局按流程分拣、转运(路由);最终送到收信人手上(接收)。网络传输,几乎就是这整个过程的电子版。
为什么要学网络
看懂"日常"
WiFi 为何断线、网页为何打不开、扫码为何转圈——理解原理便不再玄学。
解决问题
路由器该如何配置、DNS 为什么要换、VPN 究竟是什么——都能自己判断。
拓展视野
从聊天软件到 AI 大模型,几乎所有互联网产品的底层都躺着这套逻辑。
基础概念 · 主机、协议与地址
入门先要认识三个最常听到的词:主机、协议、地址。它们像"参与者、规则、身份证",缺一不可。
三个最基础的概念
| 术语 | 英文 | 通俗理解 | 举例 |
|---|---|---|---|
| 主机 | Host | 联网的任何一台设备 | 手机、电脑、服务器、智能音箱 |
| 协议 | Protocol | 双方约定好的说话规则 | HTTP、TCP、DNS |
| 地址 | Address | 一台设备的身份编号 | 192.168.1.1(IP)、a4:5e:...(MAC) |
| 客户端 | Client | 发起请求的那一方 | 你的浏览器 |
| 服务器 | Server | 提供服务、响应请求的那一方 | 百度的机房 |
| 数据包 | Packet | 被拆成小块的信息 | 一张图片可能被拆成上千个包 |
"协议"是网络学习中最重要的一个词。凡是双方需要交换信息,就必然存在某种协议。只要理解了"协议是一份约定书",后面所有 HTTP、TCP、IP 都不难理解。
分层模型 · OSI 与 TCP/IP
网络之所以能运作,是因为把一件"从一台机器传数据到另一台机器"的复杂事,切成一层一层的小事,每一层只操心自己那一块。上层不必知道下层怎么做,下层也不必理会上层内容是什么。
OSI 七层模型(学院派参考)
1984 年国际标准化组织提出的经典模型,把网络分成七层。虽然实际很少完全按七层实现,但它是理解网络的最佳教学地图。
TCP/IP 四层模型(工程实用版)
互联网工程中实际使用的模型更精简:应用层 → 传输层 → 网络层 → 网络接口层。它是 OSI 七层的"合并简化版",也是你以后遇到最多的说法。
常见协议 · 一览通用语言
协议是"网络的语言"。日常你会反复看到这些缩写,先建立最粗略的印象即可:
| 协议 | 层级 | 作用 | 你可能见过它 |
|---|---|---|---|
HTTP / HTTPS | 应用层 | 网页内容传输 | 浏览器地址栏 https:// |
DNS | 应用层 | 把域名翻译成 IP | 把 baidu.com 变成 110.242.68.66 |
SMTP / IMAP | 应用层 | 收发邮件 | 邮件客户端配置 |
SSH | 应用层 | 安全远程登录 | 程序员登录服务器 |
TCP | 传输层 | 可靠、有序、按字节流传输 | 网页、聊天、文件下载 |
UDP | 传输层 | 快速、不保证到达 | 视频通话、游戏、直播 |
IP | 网络层 | 寻址与路由 | 你的公网 IP |
ARP | 链路层 | 由 IP 找到 MAC 地址 | 局域网内互相识别 |
TCP vs UDP:TCP 像挂号信,逐件签收、丢了会补寄;UDP 像广播喇叭,说一次就过去,丢了就丢了。视频聊天宁可掉几帧也不能卡顿,所以偏爱 UDP;网页则要求内容完整,所以用 TCP。
IP 与端口 · 门牌与房间
如果说 IP 地址是一栋楼的门牌号,那 端口就是这栋楼里的具体房间号。数据要送达,必须知道"送到哪栋楼的哪个房间"。
IP 地址
四段数字
如 192.168.1.1,共约 43 亿个地址,早已不够用。
八段十六进制
如 2001:db8::1,地址空间几乎无限,正在逐步普及。
局域网内使用
家里的 192.168.x.x、10.x.x.x——只在本地有效。
互联网上唯一
由运营商分配,能被外网访问到。
端口
端口是 0 – 65535 的一个数字,用来区分"同一台机器上运行的不同程序"。几个你必须眼熟的默认端口:
| 端口 | 协议 | 用途 |
|---|---|---|
80 | HTTP | 普通网页 |
443 | HTTPS | 加密网页 |
22 | SSH | 远程登录 |
53 | DNS | 域名解析 |
3306 | — | MySQL 数据库默认端口 |
一次访问的旅程 · 从输入网址到看到网页
以你在浏览器输入 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 表示成功)。
浏览器渲染
浏览器把收到的代码解析、绘制成你看到的网页,完成整个旅程。
网络设备 · 数据的驿站
数据从你到远方,中间要经过若干"驿站"。它们各自分工:
集线器
最原始,只会广播——早已被淘汰,了解即可。
交换机
工作在链路层,按 MAC 地址在局域网内精准转发。
路由器
工作在网络层,按 IP 地址跨网络转发——家里那台"猫盒子"就是它。
防火墙
按规则允许/拦截数据包,是网络的守门人。
网关
连接两个不同网络的"桥",家用路由器同时充当网关。
无线接入点
把有线信号转成 WiFi 信号,让手机、笔记本无线上网。
到此,你已完成一次从概念 → 模型 → 协议 → 地址 → 旅程 → 设备的完整巡礼。剩下的深入话题——安全、无线、云——会作为独立章节陆续加入。
HTTP 深读 · 请求、方法与状态码
HTTP(HyperText Transfer Protocol,超文本传输协议)是你每天点开一个网页时,浏览器与服务器之间讲的那门语言。它简单、直白、几乎无处不在。
一次 HTTP 对话长什么样
本质上就是"客户端问 → 服务器答",两段纯文本:
请求由 起始行 + 头部字段 + 空行 + 可选正文 组成;响应同样如此。看似简陋,却是撑起整个 Web 的骨架。
常用 HTTP 方法
| 方法 | 语义 | 典型场景 | 是否幂等 |
|---|---|---|---|
GET | 读取资源 | 打开网页、查询数据 | 是 |
POST | 提交新数据 | 登录、发帖、上传 | 否 |
PUT | 整体替换资源 | 更新用户资料 | 是 |
PATCH | 局部修改 | 只改一个字段 | 否 |
DELETE | 删除资源 | 删帖、注销 | 是 |
HEAD | 只取响应头,不要正文 | 探测资源是否存在 | 是 |
OPTIONS | 询问服务器支持什么 | 跨域预检 | 是 |
"幂等"意思是:同一个请求,做一次和做一百次结果一样。GET 只是读、不会变;DELETE 删过就是删过,再删也是"没有"。而 POST 每一次都会新增一条数据,所以不幂等。
状态码 · 五个家族
响应的第一行有一个三位数字,用百位划分家族,看百位就能猜出七八分:
常见头部字段
- Host目标网站的域名,一台服务器可挂多个网站
- User-Agent浏览器/客户端身份标识
- Content-Type正文数据类型,如
application/json - Cookie客户端存的小凭证,登录状态就靠它
- Authorization带 Token 的身份认证
- Cache-Control缓存策略,控制多久重新拉取
HTTP 版本演进
DNS 深读 · 名字如何变成地址
DNS(Domain Name System,域名系统)是互联网的"电话簿"——你只记得住 baidu.com 这样的名字,机器却只认 110.242.68.66 这样的数字,DNS 负责在二者之间来回翻译。
为什么要有 DNS
人类的记忆是"语义型"的:容易记住 zhihu.com,很难记住 103.41.167.234。而且,同一个网站背后可能有几十上百台服务器 IP,还会变来变去;DNS 让你只关心名字,把 IP 交给系统。
域名的层级结构
域名从右向左,是"越大越靠右"的树形结构:
- 根 (Root)整棵树的起点,全球共 13 组根服务器
- 顶级域 TLD如
.com/.cn/.org/.io - 二级域你注册来用的名字,如
baidu - 子域名你可以自定义的前缀,如
www、mail
一次解析 · 递归+迭代
浏览器先查缓存
浏览器 → 操作系统 → hosts 文件;若命中就直接用。
问本地 DNS(递归解析器)
通常是运营商或公共 DNS(如 8.8.8.8、223.5.5.5)。
本地 DNS 逐级问询
问根 → 问 .com → 问 baidu.com 的权威 DNS。
拿到 IP 返回给你
本地 DNS 记住结果(缓存 TTL 秒),下次直接答。
常见 DNS 记录类型
| 记录 | 含义 | 示例 |
|---|---|---|
A | 域名 → IPv4 | baidu.com → 110.242.68.66 |
AAAA | 域名 → IPv6 | google.com → 2404:6800::200e |
CNAME | 域名 → 另一个域名(别名) | www.a.com → a.com |
MX | 邮件服务器地址 | 企业邮箱配置 |
TXT | 任意文本,用于校验、SPF、DKIM | 域名归属证明 |
NS | 该域由哪些 DNS 服务器管辖 | 切换 DNS 服务商 |
DNS 就像"114 电话查号台":你只说"我要找北京大学",查号台一层一层帮你查到具体号码——只不过这一切在 20 毫秒内完成,且每天在全球发生数万亿次。
TCP 三次握手与四次挥手
TCP 建立一次连接,需要三个来回;关闭连接,需要四个。这是网络课程最经典的"必背题",理解它能一举打通传输层。
三次握手 · 建立连接
为什么是 三次而不是两次?因为要让双方都确认对方能收、能发。少一次,服务器就无法确认自己发的包客户端能收到。
四次挥手 · 断开连接
之所以要四次,是因为 TCP 是全双工——每一方"我说完了"要单独确认。中间那"两次"看似分开,其实是服务器"我收到你要关"与"我这边也关了"两条独立信号。
主动关闭方在 ④ 之后会进入 TIME_WAIT 状态等待 2×MSL(大约 60 秒),确保最后那个 ACK 真的送达。你如果做服务端开发遇到"端口占用"报错,多半就是它。
子网与 CIDR · 把 IP 划成小院子
一个 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/8 | 10.0.0.0 – 10.255.255.255 | 大型企业内网 |
172.16.0.0/12 | 172.16.0.0 – 172.31.255.255 | 中型企业内网、Docker 默认 |
192.168.0.0/16 | 192.168.0.0 – 192.168.255.255 | 家用路由器、小型办公 |
把 IP 想象成"小区门牌号":192.168.1.0/24 是"1 号院共 254 户";/16 就是把小区扩到 6 万多户。子网掩码就是那道"哪几位算院子、哪几位算门牌"的隔离墙。
NAT 与端口转发 · 一屋多户如何上网
你家里明明有十几个设备联网,运营商却只分给你一个公网 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。路由器查表 → 发回给内网原来那台设备。
端口转发 · 让外网访问家里的机器
反向操作:你有一台家庭服务器想让外部访问?在路由器上做端口映射:
NAT 是 IPv4 地址不够用的"缓兵之计":它拯救了整个互联网,也破坏了原本"每台设备可直连"的对等网络。这也是 IPv6 想彻底解决的问题。
网络安全 · 加密、认证与常见威胁
网络安全的三大目标可以浓缩成 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。
无线与移动网络 · WiFi、蓝牙与 5G
把线拔掉、让数据通过电磁波传输,就是无线网络。它们靠频段、信道、协议三件事区分。
WiFi 各代速览
| 标准 | 俗名 | 频段 | 理论速率 |
|---|---|---|---|
| 802.11n | WiFi 4 | 2.4 / 5 GHz | 600 Mbps |
| 802.11ac | WiFi 5 | 5 GHz | 3.5 Gbps |
| 802.11ax | WiFi 6 / 6E | 2.4 / 5 / 6 GHz | 9.6 Gbps |
| 802.11be | WiFi 7 | 2.4 / 5 / 6 GHz | 46 Gbps |
2.4GHz 像低频广播——传得远、穿墙好,但速度慢、干扰多;
5GHz 像高频广播——速度快、干扰少,但传不远、穿墙差。所以现代路由器"双频合一",让手机自动选。
蓝牙、NFC、Zigbee
- 蓝牙 (BT)短距、点对点,用于耳机、鼠标、传文件
- BLE蓝牙低功耗,用于手环、门锁、iBeacon
- NFC数厘米,用于支付、门禁、公交卡
- Zigbee低功耗自组网,智能家居设备常用
蜂窝网络 2G → 5G
5G 的意义不只是"更快",还有 低时延(1ms 级)和 海量连接(每平方公里 100 万设备)——这是自动驾驶、工业互联网、AR/VR 的地基。
云与边缘 · CDN、云网络与容器
过去的网络世界是"我搭机房、我买带宽、我配路由器";今天大部分服务都跑在云上,用户和服务之间还夹着边缘节点。
CDN · 内容分发网络
CDN 是"把内容提前搬到离你最近的机房"的技术。你在深圳打开某网站,其实是访问了深圳的缓存节点,而不是远在美国的源站。
请求先命中 CDN 边缘节点
DNS 会根据你的位置返回最近节点的 IP。
节点若有缓存 → 直接返回
毫秒级响应,源站毫无负担。
没有缓存 → 回源
从源站拉一次,缓存下来,之后同一区域的人都受益。
云网络三件套
虚拟私有云
你在云上"圈出的一块独立网络",就像自己的机房。
负载均衡
一个公网 IP 分发到多台后端服务器,避免单点。
安全组
云上的防火墙规则,决定谁能连你的机器。
容器网络
Docker、Kubernetes 让每个应用装进一个"集装箱",容器之间通过虚拟网络互通。Service、Ingress、Pod IP 是你以后会反复看到的词——但本质仍是本文前面讲过的 IP、端口、DNS。
无论多么复杂的云原生架构,拆开都是 IP + 端口 + 协议 + 路由 + DNS。只是数量更多、层级更深,运行在别人的机房里而已。
排错工具箱 · 五个救急命令
当"上不了网"时,怎样一步步定位?以下五个命令是终端里的"急救包",Windows 和 macOS/Linux 略有差异,写法我一并给你:
① ping · 测通不通
发送 ICMP 包,看对方能不能回。是最基础的"我能到吗?"
② traceroute · 走了哪条路
逐跳追踪数据包路径,看在哪一站出问题。
③ nslookup / dig · 域名解析
怀疑域名解析出错时用它。
④ curl · 手动发一次 HTTP 请求
不打开浏览器就能看服务器返回。
⑤ netstat / ss · 谁占了端口
本机端口被谁占用、有哪些连接开着。
① ping 网关能通吗?→ 不能就是本地网络问题。
② ping 8.8.8.8 能通吗?→ 不能就是运营商问题。
③ ping baidu.com 能通吗?→ 不能但 ② 通,就是 DNS 问题。
未完待续 · 更多板块
下方为预留占位,后续章节将按同样的排版规则加入。
IPv6 与下一代互联网
为何 IPv4 不够用、IPv6 长什么样、如何过渡。
网络性能优化
为什么慢?TTFB、RTT、丢包与拥塞控制。
网络编程入门
Socket、Web 请求、简单服务器代码实战。
Git 篇
序章 · Git 是什么
Git 是一部时间机器,也是一份分身术——它记住你每一次修改,让你可以随时回到过去;也让你同时活在多条时间线里,做完实验再决定要不要保留。
一句话理解
Git 是一个分布式版本控制系统:它把你的整个项目历史存在一个 .git 文件夹里,让你可以查看、比较、回退任何一次改动。它由 Linux 之父 Linus Torvalds 于 2005 年为管理 Linux 内核而写。
如果说"网盘"是保存最新一份文件,Git 就是保存所有版本的私人史官——从你项目诞生那一秒起的每一次改动都被记录,且可以用一条命令回到任意时刻。
为什么要学 Git
不再"final_v3_真的最终版"
每一次改动自动有版本号,随时可回退,不再靠文件名区分。
多设备无缝同步
推到 GitHub,家里公司随时接着写。
多人协作不打架
用分支把每个人的改动隔离,最后再合并。
时光机自救
"糟糕,代码删多了" —— 一条命令回到 30 分钟前。
概念地图 · 仓库、工作区、暂存区
入门 Git 最重要的一步:建立"三个区"的心智模型。所有 Git 命令都是在这三个区之间搬运东西。
三个区 · The Three Trees
- 工作区Working Directory —— 你当前看得见、能编辑的文件夹
- 暂存区Staging Area / Index —— 一个"待打包"的清单,决定这次提交带走哪些改动
- 仓库Repository ——
.git文件夹,保存所有历史版本
寄快递:工作区是你桌面上散落的东西;暂存区是你挑好、放进纸箱的东西;仓库是快递公司的档案库,收下后就永久登记。git add = 把东西放进纸箱;git commit = 封箱送走。
三条常用命令的定位
| 命令 | 做什么 | 影响哪个区 |
|---|---|---|
git add 文件 | 把改动加入暂存区 | 工作区 → 暂存区 |
git commit -m "说明" | 把暂存区打包为一次提交 | 暂存区 → 仓库 |
git checkout 文件 | 放弃工作区改动,回到上一版 | 仓库 → 工作区 |
git reset 文件 | 把改动从暂存区退回工作区 | 暂存区 → 工作区 |
初次上手 · 从零建立一个仓库
你已经用 Git 部署过 xuehai-wuya,我们复盘一下每一步的意义。
四步建立一个 Git 项目
初始化仓库
在项目文件夹里执行 git init——Git 会新建一个隐藏的 .git 目录,作为整个仓库的大脑。
配置身份
git config user.name "你的名字"、git config user.email "你的邮箱"——决定这次提交的作者是谁。
加入所有文件
git add .——把当前目录里的所有变化放入暂存区。
提交
git commit -m "初次提交"——把暂存区打包成一次带说明的历史记录。
完整命令示例
项目里总有一些"不想被跟踪"的文件(临时缓存、密码、大二进制)。在根目录建一个 .gitignore 文件,写上不想上传的内容,Git 就会自动忽略:
日常命令 · 十条最常用
日常 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 | 合并另一条分支 | ★★★☆☆ |
典型的一天
一条好的提交信息应该一句话说清"这次改了什么、为什么"。业界流行的规范叫 Conventional Commits:feat: 新增登录功能、fix: 修复分页错误、docs: 更新 README。
分支 · 平行世界的开关
分支(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。
分支像写小说时的多个存档:主线剧情一直存着,你另开一个 slot 尝试"如果主角选另一条路会怎样"。写不下去就删掉存档,写好了就把它并回主线。
合并与冲突 · 两条河汇入一条
merge 与 rebase
合并式
把两条分支的提交都保留下来,多一个"合并提交"节点。历史真实但可能显得杂乱。
变基式
把你的提交"复制粘贴"到目标分支尾部,历史看起来是一条直线。整洁但改写了历史。
刚学 Git 时只用 merge 就够了,安全、直观。rebase 是熟练之后再学的进阶技巧。
冲突长什么样
当两条分支改了同一个文件的同一处,Git 无法自动判断该用谁的,就会产生冲突。文件里会出现这样的标记:
三步解冲突
打开冲突文件
手动决定保留哪一边(或两边都要),删掉那些 <<</===/>>> 标记。
标记冲突已解决
git add 文件
完成合并
git commit(无需 -m,Git 会自动写一条合并说明)
远程 · 与 GitHub 对话
本地仓库和远程仓库(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,配好密钥后一劳永逸
从 2021 年起 GitHub 不再支持密码登录,必须用 Personal Access Token(PAT)。在 Settings → Developer settings → Personal access tokens 里生成,第一次 push 弹窗时把它当密码填即可。Windows 会用凭据管理器帮你记住。
时光机 · 回退、撤销与拯救
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 |
| 想彻底丢掉最近一次 commit | git reset --hard HEAD~1(危险) |
| 想不改历史、追加一条"反悔"commit | git revert 提交号 |
如果你误 reset --hard 把提交搞没了 —— 别慌!git reflog 会列出你所有"HEAD 曾经指向过的位置",找到那个提交号,git reset --hard 提交号 就能救回。Git 通常要 30 天后才真正删除。
协作流 · PR、Fork 与团队工作流
Pull Request(PR)· 请求合并
在 GitHub 上,你不能直接把改动推到别人的仓库。标准动作是:
Fork
在别人的仓库右上角点 Fork,得到一个属于你自己的副本。
Clone 你的 Fork
git clone https://github.com/你/xxx.git,本地开始改。
开分支 + 改 + 提交 + 推
把改动推到你自己的 Fork。
发起 Pull Request
在原仓库页面点 "New pull request",说明你改了什么。等原作者审核合并。
三种主流团队工作流
Git Flow
有 master / develop / feature / release / hotfix 多种分支。经典但重。
GitHub Flow
只有 main + feature 分支。GitHub 官方推荐,轻量高效。
Trunk Based
大家都往 main 提交,短命分支即开即合。Google、Facebook 在用。
小团队/个人项目 → GitHub Flow 就够了;大型持续发布产品 → Git Flow;追求速度的顶尖工程团队 → Trunk Based。
锦囊 · 高频问答与私藏技巧
十个高频问答
- 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
三条私藏技巧
写有意义的 commit 信息。一年后你翻历史,能不能一眼看懂当时改了什么,全看当时那句 -m。
小步提交,频繁 push。一次改 1000 行难以复审也难以回退;一次改 100 行,回退极其精准。
先建 .gitignore 再 git add .。否则一旦把 node_modules 之类的大目录传上去,之后想清很麻烦。
Git 的世界看似浩瀚,其实日常 90% 只用五个动作:status → add → commit → push → pull。剩下的都是"救命"和"进阶",遇到时再查即可。
未完待续 · 更多板块
Git 内部原理
对象、SHA-1、pack 文件、HEAD 指针背后的世界。
GitHub Actions · CI/CD
推送时自动测试、自动部署,让代码自己会跑起来。