13
10
月
2026
还在用 FTP 传文件、手动备份"改之前的那版"?Git 能解决这些问题:完整的历史记录、随时回滚、多人协作、一键部署。
这篇讲 Git 的实际用法(不纠缠理论),以及如何用 Git 实现服务器上的自动化部署。
部署流程需要稳定的服务器。财富云计算 提供云服务器;内网服务、测试环境可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上)。
一、安装与基础配置
apt install git -y # Debian/Ubuntu
yum install git -y # CentOS
git --version配置身份:
git config --global user.name "你的名字"
git config --global user.email "you@example.com"
# 常用配置
git config --global core.editor vim
git config --global init.defaultBranch main
git config --global credential.helper store # 记住密码(注意安全)
# 查看配置
git config --list二、日常工作流(80% 场景就这几个命令)
# ① 获取代码
git clone https://github.com/user/repo.git
cd repo
# ② 改代码(用你的编辑器)
# ③ 看改了什么
git status
git diff
# ④ 加入暂存区
git add file.txt
git add . # 全部
# ⑤ 提交
git commit -m "描述这次改了什么"
# ⑥ 推送到远程
git push origin main
# ⑦ 拉取最新
git pull提交信息怎么写:
✅ 好:修复登录页在 Safari 上的样式错位
✅ 好:feat: 新增用户导出功能
❌ 差:修改
❌ 差:update三、分支管理
# 查看分支
git branch
git branch -a # 含远程
# 创建分支
git branch feature-x
git checkout -b feature-x # 创建并切换(常用)
# 切换
git checkout main
git switch main # 新命令
# 合并
git checkout main
git merge feature-x
# 删除分支
git branch -d feature-x
git branch -D feature-x # 强制删除
# 推送分支
git push -u origin feature-x推荐工作流:
main 稳定版本(线上跑的)
├── dev 开发分支
│ ├── feature-a
│ └── feature-b
└── hotfix-x 紧急修复小团队简化版:main 直接用 + 临时分支做功能。
四、撤销与回滚(救命用)
# 还没 add:放弃修改
git checkout -- file.txt
git restore file.txt # 新命令
# 已 add 未 commit
git reset HEAD file.txt
git restore --staged file.txt
# 已 commit,想改提交信息
git commit --amend -m "新的信息"
# 已 commit,想回退(保留修改)
git reset --soft HEAD~1
# 已 commit,想彻底回退(丢弃修改)⚠️
git reset --hard HEAD~1
# 回退到指定 commit
git reset --hard abc1234
# 已经 push 了,要撤销(保留历史,推荐)
git revert HEAD
git revert abc1234重要区别:
| 命令 | 效果 | 适用 |
|---|---|---|
reset --hard | 抹掉历史,回退 | 本地未推送时 |
revert | 新增一个"反向"提交 | 已推送,保留历史 |
已推送的提交用 revert,不要用 reset --hard(会破坏协作)。
# 查看历史
git log
git log --oneline
git log --oneline --graph --all # 图形化看分支
git log -p file.txt # 看某文件的修改历史
git show abc1234 # 看某次提交的内容五、.gitignore(必配)
防止把不该提交的文件传上去:
nano .gitignore常见内容:
# 依赖
node_modules/
vendor/
# 环境变量(⚠️ 绝对不能提交!)
.env
.env.local
*.key
*.pem
# 日志
*.log
logs/
# 缓存
cache/
tmp/
*.tmp
# 上传文件
uploads/
public/uploads/
# 编辑器
.vscode/
.idea/
*.swp
.DS_Store
# 构建产物
dist/
build/如果已经误提交了敏感文件:
# 从历史中彻底删除(会改写历史,谨慎)
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch .env' \
--prune-empty --tag-name-filter cat -- --all
git push --force⚠️ 密钥一旦提交到公开仓库,就认为已经泄露,立即更换密钥,删历史只是补救。
六、服务器部署:几种方式
方式一:服务器上直接 pull(最简单)
# 服务器上
cd /var/www/mysite
git clone https://github.com/user/repo.git .
# 更新时
cd /var/www/mysite
git pull
systemctl reload nginx部署脚本 /usr/local/bin/deploy.sh:
#!/bin/bash
set -euo pipefail
APP_DIR="/var/www/mysite"
cd "$APP_DIR"
echo "[$(date)] 开始部署" >> /var/log/deploy.log
git pull origin main
# 依赖安装(PHP 项目)
composer install --no-dev --optimize-autoloader 2>/dev/null || true
# 或 Node 项目
# npm ci --production && npm run build
# 权限
chown -R www-data:www-data "$APP_DIR"
# 重载服务
systemctl reload php8.2-fpm
systemctl reload nginx
echo "[$(date)] 部署完成" >> /var/log/deploy.logchmod +x /usr/local/bin/deploy.sh
deploy.sh方式二:Git Hook 自动部署(push 即上线)
在服务器上建一个裸仓库:
mkdir -p /opt/git/mysite.git
cd /opt/git/mysite.git
git init --bare配置 post-receive 钩子:
nano /opt/git/mysite.git/hooks/post-receive#!/bin/bash
TARGET="/var/www/mysite"
GIT_DIR="/opt/git/mysite.git"
echo "[$(date)] 收到推送" >> /var/log/deploy.log
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f main
# 后续操作(权限、依赖、重载)
chown -R www-data:www-data $TARGET
systemctl reload php8.2-fpm
echo "[$(date)] 部署完成" >> /var/log/deploy.logchmod +x /opt/git/mysite.git/hooks/post-receive本地添加远程仓库:
git remote add prod root@服务器:/opt/git/mysite.git
git push prod main
# 一推送,服务器自动部署方式三:CI/CD(专业方案)
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: npm ci && npm run build
- name: Deploy to server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
source: "dist/*"
target: "/var/www/mysite"适合有构建步骤的项目(前端、编译型语言)。
七、SSH 密钥配置(部署必备)
# 本地生成
ssh-keygen -t ed25519 -C "deploy"
# 复制公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@服务器
# 测试
ssh root@服务器服务器配置免密拉取私有仓库:
# 服务器上生成部署密钥
ssh-keygen -t ed25519 -C "server-deploy"
cat ~/.ssh/id_ed25519.pub
# 把公钥加到 GitHub/GitLab 的 Deploy Keys详见《SSH 密钥登录与账号安全配置》。
八、回滚:部署出问题时
# ① 查看提交历史
cd /var/www/mysite
git log --oneline -10
# ② 回退到上一个版本
git reset --hard HEAD~1
systemctl reload php8.2-fpm
# ③ 或回退到指定版本
git reset --hard abc1234
# ④ 重新拉取最新(回退错了的话)
git pull origin main生产环境建议:
- 部署前打快照(服务器层面)
- 用 tag 标记每个上线版本:
git tag v1.2.3 - 保留最近几个版本的备份
# 打标签
git tag -a v1.0.0 -m "第一个正式版"
git push origin v1.0.0
# 切换到某版本
git checkout v1.0.0
# 查看所有标签
git tag九、多台服务器的同步部署
#!/bin/bash
SERVERS=("web1.example.com" "web2.example.com" "web3.example.com")
for server in "${SERVERS[@]}"; do
echo "部署到 $server ..."
ssh root@$server "cd /var/www/mysite && git pull && systemctl reload php-fpm"
if [ $? -eq 0 ]; then
echo "$server 完成"
else
echo "$server 失败!"
exit 1
fi
done更稳妥的做法:先在灰度机部署,验证后再全量。
十、常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
Permission denied (publickey) | SSH 密钥没配对 | 检查密钥和授权 |
failed to push some refs | 远程有新提交 | 先 git pull --rebase |
Your branch is behind | 本地落后 | git pull |
| 合并冲突 | 两边改了同一处 | 手动编辑冲突文件,然后 git add + git commit |
detached HEAD | checkout 到了具体 commit | git checkout main 回来 |
| 提交了敏感文件 | — | 立即换密钥,再用 filter-branch 清历史 |
| 中文文件名乱码 | 编码配置 | git config core.quotepath false |
| 换行符问题(Windows/Linux) | CRLF vs LF | git config core.autocrlf input |
解决冲突
git pull
# 提示 CONFLICT
# 编辑冲突文件,找到
# <<<<<<< HEAD
# 你的改动
# =======
# 别人的改动
# >>>>>>> branch
# 手动保留正确的部分,删掉标记
git add 冲突文件
git commit -m "解决冲突"
git push十一、Git 使用建议
- 小步提交:一次提交只做一件事,方便回滚
- 写清楚提交信息:三个月后的你会感谢现在的你
- 勤推送:本地没推送的改动丢了就没了
- 用分支:别在 main 上直接改
- 配好 .gitignore:尤其是
.env、密钥 - 敏感信息用环境变量:不要写进代码
- 定期打 tag:方便回滚到稳定版本
- 服务器部署要能一键回滚
十二、速查表
git clone <url> 克隆
git status 查看状态
git add . 暂存全部
git commit -m "msg" 提交
git push 推送
git pull 拉取
git log --oneline 查看历史
git diff 查看改动
git checkout -- file 放弃改动
git reset --hard HEAD~1 回退上一版(危险)
git revert HEAD 撤销提交(安全)
git branch 查看分支
git checkout -b name 新建并切换
git merge name 合并分支
git stash 暂存未提交的改动
git stash pop 恢复
git tag v1.0.0 打标签
git remote -v 查看远程Git + 服务器能实现"push 即部署"。财富云计算 的云服务器提供完整 root 权限,可自由配置 Git 仓库、钩子与自动化脚本;内网服务、测试环境可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上),适合搭建内部 Git 服务与测试环境。
相关阅读:
- 《Shell 脚本编写入门》
- 《SSH 密钥登录与账号安全配置》
- 《服务器备份与快照策略》
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml磁盘涨得最快的三样:CI 每次构建的新层、没人清理的旧标签、latest 反复覆盖的层。每周一次 GC + 保留策略(只留最近 10 个版本),仓库能长期健康。七、常见问题现象原因解法push 报 http: server gave HT[...]
2026-10-15 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复
[...]→ 归档(过期文档移入归档区,别删)技术团队可以把文档目录直接挂 Git,改动走 review,Wiki.js 有 Git 存储模块支持。版本管理见Git 版本控制与服务器部署。五、资源与成本团队规模文档量推荐配置10 人以内几百篇2核2G(MrDoc)/ 2核4G(Wiki.js)50 人几千篇4核8G + 对象存储附件200 人+几万篇4核8G + Elasticsearch图片附件走对象存储[...]
2026-10-18 回复
[...]</html>注意:CDN 脚本在国内访问不稳定,建议把 docsify 的 JS/CSS 下载到自己服务器。 Docsify 适合"今晚就要上线"的场景,长期大量文档还是构建型方案(SEO 更好、首屏更快)。五、文档站的通用功课SEO:静态文档站是搜索引擎最友好的形态,但配置要对——每个页面独立 title、配 sitemap.xml、提交收录,方法见网站 SEO 基础优化指南。速度[...]
2026-10-18 回复