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.log
chmod +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.log
chmod +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

生产环境建议:

  1. 部署前打快照(服务器层面)
  2. 用 tag 标记每个上线版本:git tag v1.2.3
  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 HEADcheckout 到了具体 commitgit checkout main 回来
提交了敏感文件—立即换密钥,再用 filter-branch 清历史
中文文件名乱码编码配置git config core.quotepath false
换行符问题(Windows/Linux)CRLF vs LFgit config core.autocrlf input

解决冲突

git pull
# 提示 CONFLICT

# 编辑冲突文件,找到
# <<<<<<< HEAD
# 你的改动
# =======
# 别人的改动
# >>>>>>> branch
# 手动保留正确的部分,删掉标记

git add 冲突文件
git commit -m "解决冲突"
git push

十一、Git 使用建议

  1. 小步提交:一次提交只做一件事,方便回滚
  2. 写清楚提交信息:三个月后的你会感谢现在的你
  3. 勤推送:本地没推送的改动丢了就没了
  4. 用分支:别在 main 上直接改
  5. 配好 .gitignore:尤其是 .env、密钥
  6. 敏感信息用环境变量:不要写进代码
  7. 定期打 tag:方便回滚到稳定版本
  8. 服务器部署要能一键回滚

十二、速查表

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 密钥登录与账号安全配置》
  • 《服务器备份与快照策略》
延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:Vim 编辑器使用指南:从退不出去到改配置得心应手
  2. 下一篇:sed 与 awk 文本处理实战:命令行下的批量编辑与数据分析
发表评论 4

取消回复