手里有一件要做的事、却不知道该用哪个工具时查这里。先找任务所属的部分,再在表里找最接近的一行。命令照抄正文,<…> 里的换成自己的值;bash(Linux、macOS)和 PowerShell 写法不同时两种都列,先 bash,后“PowerShell:…”。“详见”指向讲这件事的小节,前后步骤、要改的配置和常见的坑都在那里。
| 我想…… |
命令或操作 |
详见 |
| 执行一个记不住快捷键的命令 |
Ctrl+Shift+P,输入命令名 |
第 1 章 1.3 |
| 在整个项目里搜一段文字 |
Ctrl+Shift+F |
第 1 章 1.3 |
| 用 VS Code 打开终端所在的项目 |
code . |
第 1 章 1.4 |
| 给脚本下断点调试 |
在那一行按 F9,再按 F5 |
第 1 章 1.4 |
| 核对本机装了哪些扩展 |
code --list-extensions |
第 2 章 2.4 |
| 在 VS Code 里直接改服务器上的代码 |
命令面板运行“Remote-SSH: Connect to Host…” |
第 2 章 2.4 |
| 给 Python 项目建虚拟环境 |
python -m venv .venv |
第 3 章 3.4 |
| 让 VS Code 用项目的虚拟环境 |
点状态栏右下角的 Python 版本,选 .venv |
第 3 章 3.4 |
| 按 PID 结束一个进程 |
kill <PID>;PowerShell:Stop-Process -Id <PID> |
第 4 章 4.3 |
| 实时跟踪日志 |
tail -f app.log;PowerShell:Get-Content app.log -Wait -Tail 20 |
第 4 章 4.3 |
| 把 Windows Terminal 的默认 Shell 换成 PowerShell 7 |
winget install Microsoft.PowerShell,再在设置里改“默认配置文件” |
第 4 章 4.4 |
| 把一个目录永久加进 PATH(bash) |
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc |
第 4 章 4.4 |
| 找出调用某个函数的所有文件 |
rg -l -t py <函数名> |
第 5 章 5.4 |
| 模糊搜索历史命令 |
装好 fzf 的 Shell 集成后按 Ctrl+R |
第 5 章 5.3 |
| 生成 SSH 密钥 |
ssh-keygen -t ed25519 -C "<邮箱>" |
第 6 章 6.3 |
| 配置免密登录服务器 |
ssh-copy-id <用户>@<主机> |
第 6 章 6.4 |
| 给服务器起个别名,以后不用记地址 |
在 ~/.ssh/config 里写别名(写法见 6.5),再 ssh <别名> |
第 6 章 6.4 |
| 把文件传到服务器 |
scp <本地文件> <别名>:<远程目录>/ |
第 6 章 6.3 |
| 在本机连服务器上只听 127.0.0.1 的数据库 |
ssh -N -L 5433:127.0.0.1:5432 <别名> |
第 6 章 6.4 |
| 在服务器上跑长任务,断线也不停 |
tmux new -s job,回来时 tmux attach -t job |
第 6 章 6.4 |
| 我想…… |
命令或操作 |
详见 |
| 装完 Git 设置名字和邮箱 |
git config --global user.name "<名字>",git config --global user.email "<邮箱>" |
第 7 章 7.4 |
| 下载一个仓库 |
git clone <url> |
第 7 章 7.3 |
| 把本地项目推到新建的远程仓库 |
git remote add origin <url>,再 git push -u origin main |
第 7 章 7.4 |
| 新建分支并切过去 |
git switch -c <名> |
第 7 章 7.3 |
| 拉取远程的新提交 |
git pull |
第 7 章 7.3 |
| 看提交历史和分支走向 |
git log --oneline --graph --all |
第 7 章 7.3 |
| 只提交一部分改动 |
git add -p |
第 7 章 7.3 |
| 先收起改动去切分支,回来再放回 |
git stash,回来后 git stash pop |
第 7 章 7.3 |
| 解决合并冲突 |
改好冲突文件后 git add <文件>,再 git commit;不想合了 git merge --abort |
第 7 章 7.4 |
| 丢掉还没 add 的改动 |
git restore <文件>(改动找不回) |
第 8 章 8.4 |
| 取消暂存,改动留着 |
git restore --staged <文件> |
第 8 章 8.4 |
| 改上一次提交的说明(还没 push) |
git commit --amend -m "<新说明>" |
第 8 章 8.4 |
| 撤销还没 push 的提交,保留改动 |
git reset --soft HEAD~1 |
第 8 章 8.4 |
| 撤销已经 push 的提交 |
git revert <提交> |
第 8 章 8.4 |
reset --hard 之后后悔 |
git reflog 找到位置,git reset --hard HEAD@{1}(没提交的改动会丢) |
第 8 章 8.4 |
| 提 PR 前把零碎提交合并整理 |
git rebase -i HEAD~5,整理后推送用 git push --force-with-lease |
第 8 章 8.4 |
| 找出哪个提交引入了 bug |
git bisect start,git bisect bad,git bisect good v1.0 |
第 8 章 8.4 |
| 把本地已有项目建成 GitHub 仓库并推送 |
gh repo create <名> --private --source=. --push |
第 9 章 9.3 |
| 用提交说明建 PR |
gh pr create --fill |
第 9 章 9.3 |
| 把别人的 PR 拉到本地试 |
gh pr checkout <编号> |
第 9 章 9.3 |
只在推送到 main 时跑 CI |
on: { push: { branches: [main] } } |
第 10 章 10.3 |
| 在工作流里读机密 |
env: { API_KEY: '${{ secrets.API_KEY }}' } |
第 10 章 10.3 |
| 只看 CI 失败步骤的日志 |
gh run view <运行编号> --log-failed |
第 10 章 10.3 |
| 格式化 Python 代码 |
ruff format . |
第 11 章 11.3 |
| lint JS、TS 并自动修 |
npx eslint . --fix |
第 11 章 11.3 |
| 提交前自动检查 |
pre-commit install |
第 11 章 11.4 |
| 我想…… |
命令或操作 |
详见 |
| 跑别人的镜像,只让本机访问 |
docker run -d --name web -p 127.0.0.1:8088:80 nginx:stable-alpine |
第 12 章 12.4 |
| 看有哪些容器在跑 |
docker ps |
第 12 章 12.3 |
| 进运行中的容器看一眼 |
docker exec -it <容器> sh |
第 12 章 12.3 |
| 看容器日志 |
docker logs -f <容器> |
第 12 章 12.3 |
| 构建自己的镜像 |
docker build -t myapp:1.0 . |
第 12 章 12.3 |
| 查 Docker 占了多少磁盘并清理 |
docker system df,再 docker system prune(会删已停止的容器) |
第 12 章 12.3 |
| 用随书 compose 起数据库 |
docker compose --profile db up -d |
第 13 章 13.4 |
| 停掉全部服务,数据留着 |
docker compose --profile all down |
第 13 章 13.3 |
| 看随书 compose 起的服务状态和端口 |
docker compose ps |
第 13 章 13.3 |
| 跟踪一个服务的日志 |
docker compose logs -f redis |
第 13 章 13.3 |
| 改了代码后重新构建并启动 |
docker compose up -d --build |
第 13 章 13.3 |
| 拿到别人的项目,按锁文件装依赖 |
npm ci(Node)、uv sync --locked(Python)、dotnet restore --locked-mode(.NET)、go mod download(Go) |
第 14 章 14.3 |
| 列出可升级的包 |
npm outdated(Node)、uv tree --outdated --depth 1(Python) |
第 14 章 14.3 |
| 给项目固定一个 Python 版本 |
uv python install 3.14,再 uv python pin 3.14 |
第 14 章 14.4 |
让 .env 不进仓库 |
echo ".env" >> .gitignore,再 git check-ignore -v .env 确认 |
第 15 章 15.4 |
让 Node 程序启动时读 .env |
node --env-file=.env app.js |
第 15 章 15.3 |
| 永久设一个环境变量 |
echo 'export FOO=1' >> ~/.bashrc;PowerShell:[Environment]::SetEnvironmentVariable('FOO', '1', 'User') |
第 15 章 15.3 |
| 我想…… |
命令或操作 |
详见 |
| 改完 Nginx 配置后检查并重载 |
sudo nginx -t,再 sudo nginx -s reload |
第 16 章 16.3 |
| 给本机 3000 端口的应用加反向代理 |
在 server 块里加 location /api/,再 docker compose exec nginx nginx -s reload |
第 16 章 16.4 |
| 用 Certbot 给站点配 HTTPS |
sudo certbot --nginx -d example.com -d www.example.com |
第 16 章 16.4 |
| 一行命令开反向代理 |
caddy reverse-proxy --from :8090 --to :3000 |
第 17 章 17.3 |
| 改完 Caddyfile 后检查并重载 |
caddy validate,再 caddy reload |
第 17 章 17.3 |
| 看一次请求完整的来回 |
curl -v <url> |
第 18 章 18.3 |
| 发一个 JSON 请求 |
curl --json '{"name":"a"}' <url> |
第 18 章 18.3 |
| 把本机开发的网页临时给别人看 |
ngrok http 3000 |
第 18 章 18.3 |
| 把浏览器里的请求复制到终端重放 |
Network 里右键请求,Copy,Copy as cURL (bash) |
第 19 章 19.3 |
| 跳过缓存刷新页面 |
Ctrl+Shift+R 或 Ctrl+F5 |
第 19 章 19.3 |
| 我想…… |
命令或操作 |
详见 |
| 看一条查询走没走索引 |
EXPLAIN QUERY PLAN SELECT * FROM orders WHERE user_id = 1;;PostgreSQL、MySQL 用 EXPLAIN |
第 20 章 20.3 |
| 在四种客户端里列出表 |
\dt、SHOW TABLES;、.tables、show collections |
第 20 章 20.3 |
| 给应用建 PostgreSQL 专用的库和用户 |
CREATE ROLE app LOGIN PASSWORD 'app_pw';,再 CREATE DATABASE app OWNER app; |
第 21 章 21.4 |
| 进随书容器里的 PostgreSQL |
docker compose exec postgres psql -U postgres |
第 21 章 21.4 |
| 备份一个 PostgreSQL 库 |
pg_dump -U postgres -Fc -f app.dump app |
第 21 章 21.3 |
| 把备份恢复成另一个库 |
pg_restore -U postgres -d app_copy app.dump(目标库要先建好) |
第 21 章 21.3 |
| 给应用建 MySQL 用户并授权 |
CREATE USER 'app'@'%' IDENTIFIED BY 'app_pw';,再 GRANT ALL PRIVILEGES ON app.* TO 'app'@'%'; |
第 22 章 22.4 |
| 导出一个 MySQL 库 |
mysqldump -uroot -p --single-transaction app > app.sql |
第 22 章 22.3 |
| 把导出的 SQL 恢复进 MySQL |
mysql -uroot -p app_copy < app.sql(目标库要先建好) |
第 22 章 22.3 |
| 排查 MySQL 中文乱码 |
SHOW VARIABLES LIKE 'character_set%';,再 SHOW CREATE TABLE notes\G |
第 22 章 22.4 |
| 把 CSV 导入 SQLite |
.import --csv --skip 1 orders.csv orders |
第 23 章 23.3 |
| 备份一个正在用的 SQLite 库 |
sqlite3 app.db ".backup app-2026-10-08.db" |
第 23 章 23.4 |
| 在 MongoDB 里按条件查并只取几个字段 |
db.orders.find({ amount: { $gte: 50 } }, { _id: 0, name: 1, amount: 1 }) |
第 24 章 24.3 |
| 备份和恢复一个 MongoDB 库 |
mongodump --db=shop --archive=/tmp/shop.archive --gzip,mongorestore --archive=/tmp/shop.archive --gzip |
第 24 章 24.3 |
| 我想…… |
命令或操作 |
详见 |
| 写一个会自动过期的缓存 |
SET k v EX 60 |
第 25 章 25.3 |
| 做一把分布式锁 |
SET lock:job1 8f14e45f NX PX 30000 |
第 25 章 25.4 |
| 取排行榜前十名 |
ZRANGE board 0 9 REV WITHSCORES |
第 25 章 25.3 |
| 选一个消息队列 |
看 26.4 的选型表:任务队列用 RabbitMQ,事件流与回放用 Kafka,已有 Redis 且量不大用 Redis Streams |
第 26 章 26.4 |
| 消息重投时不重复处理 |
INSERT INTO processed VALUES ('1001', CURRENT_TIMESTAMP) ON CONFLICT DO NOTHING; |
第 26 章 26.4 |
| 看 RabbitMQ 队列积压和消费者数 |
rabbitmqctl list_queues name messages consumers |
第 27 章 27.3 |
| 处理失败的消息转进死信队列 |
建队列时在 Arguments 里加 x-dead-letter-exchange |
第 27 章 27.4 |
| 建 Kafka 主题 |
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic orders --partitions 3 |
第 28 章 28.3 |
| 看 Kafka 消费者组的积压 |
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group g1 |
第 28 章 28.3 |
| 让 Kafka 消费者组从头重新消费 |
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group g1 --topic orders --reset-offsets --to-earliest --execute,组内消费者先全部停掉 |
第 28 章 28.3 |
| 我想…… |
命令或操作 |
详见 |
| 改文件权限 |
chmod 750 deploy.sh |
第 29 章 29.3 |
| 看磁盘还剩多少、目录占多少 |
df -h,du -sh /var/log |
第 29 章 29.3 |
| 看某个服务的日志 |
journalctl -u nginx -n 50 |
第 29 章 29.3 |
| 每天凌晨跑一次备份 |
crontab -e,加一行 30 3 * * * /home/deploy/bin/backup.sh |
第 29 章 29.3 |
| 防火墙放行网站端口 |
sudo ufw allow 80,443/tcp |
第 29 章 29.3 |
| 把程序做成开机自启的服务 |
sudo systemctl daemon-reload,再 sudo systemctl enable --now myapp |
第 30 章 30.4 |
| 发版后重启服务 |
sudo systemctl restart <服务> |
第 30 章 30.3 |
| 服务起不来,看状态和日志 |
systemctl status <服务>,journalctl -u <服务> -f |
第 30 章 30.3 |
| 用 pm2 管 Node 程序并开机自启 |
pm2 start server.js --name web,再 pm2 startup 然后 pm2 save |
第 30 章 30.3 |
| 启动报端口被占用,找出占用的进程 |
sudo lsof -i :8080;PowerShell:netstat -ano | findstr :8080 |
第 31 章 31.2 |
| 确认是自己的程序后结束它,释放端口 |
kill <PID>;PowerShell:Stop-Process -Id <PID> |
第 31 章 31.2 |
| 连不上服务,先测端口通不通 |
nc -zv -w 3 <主机> <端口>;PowerShell:Test-NetConnection <主机> -Port <端口> |
第 31 章 31.3 |
| 磁盘满了,找最大的目录 |
du -xh --max-depth=1 <目录> | sort -h |
第 31 章 31.5 |
| 找出最占内存的进程 |
ps aux --sort=-%mem | head;PowerShell:Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 Id,ProcessName,WorkingSet64 |
第 31 章 31.6 |