最后更新于:2026年7月

Git 版本控制指南
Git:开发者的时间机器

不会 Git,寸步难行。 Git 已经是软件开发的绝对标准——95% 以上的项目使用 Git 进行版本控制。无论是个人项目、开源协作还是企业开发,Git 都是必备技能。

但很多人对 Git 的理解还停留在 addcommitpush 三板斧,遇到冲突就慌,分支管理一团糟,团队协作全靠口头沟通。

本文从核心原理到企业级工作流,带你全面掌握 Git。


一、Git 核心概念

1.1 什么是版本控制?

版本控制系统(VCS)的作用:

1.2 Git vs 其他 VCS

特性GitSVNMercurial
类型分布式集中式分布式
离线工作
分支轻量级重量级中等
速度⚡ 快🐢 慢⚡ 快
生态最丰富衰退中较小
普及度95%+< 3%< 1%

1.3 Git 的核心架构

PLAINTEXT
工作区 (Working Directory)
    ↓ git add
暂存区 (Staging Area / Index)
    ↓ git commit
本地仓库 (Local Repository)
    ↓ git push
远程仓库 (Remote Repository)

四个区域详解:

区域说明对应文件
工作区你能看到和编辑的文件项目目录
暂存区准备提交的修改快照.git/index
本地仓库所有提交的历史记录.git/objects
远程仓库团队共享的仓库GitHub/GitLab 服务器

1.4 Git 的数据模型

Git 的本质是一个内容寻址的文件系统。

PLAINTEXT
每次 commit = 一个快照(Snapshot),不是差异(Diff)

Commit 对象包含:
├── tree(目录结构)
│   ├── blob(文件内容)
│   ├── blob(文件内容)
│   └── tree(子目录)
│       └── blob(文件内容)
├── parent(父提交)
├── author(作者)
├── committer(提交者)
└── message(提交信息)

关键理解:


二、Git 安装与配置

2.1 安装 Git

macOS:

BASH
# 方式1:Xcode Command Line Tools
xcode-select --install

# 方式2:Homebrew
brew install git

Windows:

BASH
# 下载安装包
# https://git-scm.com/download/win

# 或使用 winget
winget install Git.Git

# 或使用 Scoop
scoop install git

Linux:

BASH
# Debian/Ubuntu
sudo apt install git

# CentOS/RHEL
sudo yum install git

# Arch
sudo pacman -S git

2.2 全局配置

BASH
# 设置用户名和邮箱(必须配置)
git config --global user.name "Your Name"
git config --global user.email "your@email.com"

# 设置默认编辑器
git config --global core.editor "code --wait"  # VS Code
git config --global core.editor vim             # Vim
git config --global core.editor nano            # Nano

# 设置默认分支名
git config --global init.defaultBranch main

# 设置行尾符处理
# Windows
git config --global core.autocrlf true
# macOS/Linux
git config --global core.autocrlf input

# 设置中文文件名正常显示
git config --global core.quotepath false

# 设置默认拉取策略
git config --global pull.rebase true

# 设置推送默认行为
git config --global push.default current

2.3 SSH 密钥配置

BASH
# 生成 SSH 密钥
ssh-keygen -t ed25519 -C "your@email.com"

# 或使用 RSA(兼容性更好)
ssh-keygen -t rsa -b 4096 -C "your@email.com"

# 启动 SSH Agent
eval "$(ssh-agent -s)"

# 添加密钥
ssh-add ~/.ssh/id_ed25519

# 复制公钥
cat ~/.ssh/id_ed25519.pub
# macOS:
pbcopy < ~/.ssh/id_ed25519.pub
# Windows:
clip < ~/.ssh/id_ed25519.pub

将公钥添加到 GitHub/GitLab:

PLAINTEXT
GitHub → Settings → SSH and GPG keys → New SSH key → 粘贴公钥

测试连接:

BASH
ssh -T git@github.com
# Hi username! You've successfully authenticated...

2.4 .gitconfig 推荐配置

INI
# ~/.gitconfig

[user]
    name = Your Name
    email = your@email.com

[core]
    editor = code --wait
    autocrlf = input
    quotepath = false
    excludeglobal = ~/.gitignore_global

[init]
    defaultBranch = main

[pull]
    rebase = true

[push]
    default = current
    autoSetupRemote = true

[alias]
    st = status -sb
    co = checkout
    br = branch
    ci = commit
    lg = log --oneline --graph --all --decorate
    last = log -1 HEAD
    unstage = reset HEAD --
    amend = commit --amend --no-edit
    undo = reset --soft HEAD~1
    discard = checkout -- .

[color]
    ui = auto

[diff]
    algorithm = histogram

[merge]
    tool = code
    conflictstyle = zdiff3

[rerere]
    enabled = true

三、基础操作

3.1 创建仓库

BASH
# 初始化新仓库
git init my-project
cd my-project

# 克隆远程仓库
git clone git@github.com:user/repo.git
git clone git@github.com:user/repo.git my-folder  # 指定目录
git clone --depth 1 git@github.com:user/repo.git  # 浅克隆(只取最新提交)

# 克隆特定分支
git clone -b develop git@github.com:user/repo.git

3.2 日常操作流程

BASH
# 1. 查看状态
git status

# 2. 添加文件到暂存区
git add file.txt          # 添加指定文件
git add .                 # 添加所有修改
git add -p                # 交互式添加(按块选择)

# 3. 提交
git commit -m "feat: 添加用户登录功能"
git commit -am "fix: 修复登录bug"  # add + commit(仅已跟踪文件)

# 4. 推送
git push origin main
git push -u origin feature/login  # 首次推送新分支

# 5. 拉取
git pull origin main
git pull --rebase  # 变基拉取(推荐)

3.3 查看历史

BASH
# 查看提交历史
git log
git log --oneline              # 简洁模式
git log --oneline --graph      # 图形化
git log --oneline --graph --all --decorate  # 完整图形化

# 查看指定文件的修改历史
git log -- file.txt
git log -p -- file.txt         # 包含 diff
git log --follow -- file.txt   # 跟踪文件重命名

# 查看某人的提交
git log --author="John"

# 查看某段时间的提交
git log --since="2026-01-01" --until="2026-07-01"
git log --since="2 weeks ago"

# 搜索提交信息
git log --grep="login"

# 查看每次提交的统计信息
git log --stat
git log --shortstat

3.4 查看差异

BASH
# 工作区 vs 暂存区
git diff

# 暂存区 vs 最新提交
git diff --cached
git diff --staged  # 同上

# 工作区 vs 最新提交
git diff HEAD

# 两个分支的差异
git diff main..develop

# 两个提交的差异
git diff abc123..def456

# 只看哪些文件变了
git diff --stat

# 只看文件名
git diff --name-only

四、分支管理

4.1 分支基础

BASH
# 查看分支
git branch                 # 本地分支
git branch -r              # 远程分支
git branch -a              # 所有分支
git branch -vv             # 带跟踪信息

# 创建分支
git branch feature/login
git checkout -b feature/login    # 创建并切换
git switch -c feature/login      # 创建并切换(推荐)
git checkout -b feature/login origin/develop  # 基于远程分支创建

# 切换分支
git checkout main
git switch main            # 推荐
git switch -               # 切回上一个分支

# 删除分支
git branch -d feature/login    # 安全删除(已合并才删)
git branch -D feature/login    # 强制删除

# 重命名分支
git branch -m old-name new-name

4.2 合并(Merge)

BASH
# 将 feature 合并到 main
git switch main
git merge feature/login

# 快进合并(Fast-forward)
# 如果 main 没有新提交,直接移动指针
A---B---C (main)
         \
          D---E (feature)

# 合并后(快进):
A---B---C---D---E (main, feature)

# 三方合并
# 如果 main 有新提交,创建合并提交
A---B---C---F (main)
         \   /
          D---E (feature)

# 合并后:
A---B---C---F---M (main)
         \       /
          D---E (feature)

合并冲突解决:

BASH
# 合并时出现冲突
git merge feature/login
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt

# 查看冲突文件
git status
git diff

# 冲突标记
<<<<<<< HEAD
这是当前分支的内容
=======
这是被合并分支的内容
>>>>>>> feature/login

# 手动编辑解决冲突后
git add file.txt
git commit -m "merge: 合并 feature/login 分支"

# 放弃合并
git merge --abort

4.3 变基(Rebase)

BASH
# 将 feature 的提交变基到 main 最新
git switch feature/login
git rebase main

# 变基前:
A---B---C---F (main)
         \
          D---E (feature)

# 变基后:
A---B---C---F (main)
              \
               D'---E' (feature)

# 交互式变基(强大!)
git rebase -i HEAD~3  # 修改最近3个提交

交互式变基操作:

PLAINTEXT
pick abc1234 feat: 添加登录页面
pick def5678 feat: 添加登录API
pick ghi9012 fix: 修复登录bug

# 可用操作:
# pick (p) - 保留提交
# reword (r) - 修改提交信息
# edit (e) - 修改提交内容
# squash (s) - 合并到上一个提交
# fixup (f) - 合并到上一个提交(丢弃信息)
# drop (d) - 删除提交
# rebase (x) - 执行命令

Merge vs Rebase:

特性MergeRebase
历史记录保留分支历史线性历史
冲突处理一次性解决每个提交可能都要解决
安全性安全(不改写历史)危险(改写历史)
适用场景合并公共分支整理个人分支
推荐合并到 main同步最新 main

黄金法则:不要对已推送到公共分支的提交执行 rebase!

4.4 Cherry Pick

BASH
# 从其他分支挑选特定提交到当前分支
git cherry-pick abc1234

# 挑选多个提交
git cherry-pick abc1234 def5678

# 挑选一个范围
git cherry-pick A..B  # 不包含A,包含B

# 只应用修改,不提交
git cherry-pick --no-commit abc1234

五、分支策略与工作流

5.1 Git Flow(经典工作流)

PLAINTEXT
main     ────●──────────────●────────●──── (生产环境)
             \              ↑          ↑
              \            release   merge
               \            ↑          
develop  ──────●──●──●──●──●──●──●──●──── (开发主线)
                  \       /     \
feature/           ●──●──●       ●──●──● (功能分支)
login                           dashboard

release  ─────────────●──●──●────────────── (发布分支)
                      ↑
hotfix   ────────────────────●──●────────── (紧急修复)
                              ↑

分支说明:

分支来源合并到命名规范说明
main--main生产环境代码
developmain-develop开发主线
feature/*developdevelopfeature/xxx新功能
release/*developmain + developrelease/v1.0发布准备
hotfix/*mainmain + develophotfix/xxx紧急修复

适用场景: 中大型项目、有明确发布周期、需要维护多个版本。

5.2 GitHub Flow(简化工作流)

PLAINTEXT
main     ────●──●──●──●──●──●──●──── (始终可部署)
              \  \  \  \  \  \
feature/       ●  ●  ●  ●  ●  ●── (功能分支,通过PR合并)

规则简单:

  1. main 分支始终可部署
  2. main 创建功能分支
  3. 在功能分支上提交
  4. 创建 Pull Request
  5. 代码审查通过后合并到 main
  6. 合并后立即部署

适用场景: 小型项目、持续部署、快速迭代。

5.3 Trunk-Based Development(主干开发)

PLAINTEXT
main     ────●──●──●──●──●──●──●──●──── (主干,频繁集成)
              \ /    \  |  / \   /
short/         ●      ● ●    ● ●  (短生命周期分支,通常<24h)

特点:

适用场景: 高频部署、DevOps 成熟、自动化完善的团队。

5.4 选择建议

团队规模发布频率推荐工作流
1-5人每周/每两周GitHub Flow
5-20人每月Git Flow / GitHub Flow
20+人每季度Git Flow
任何规模每天多次Trunk-Based

六、提交规范

6.1 约定式提交(Conventional Commits)

BASH
<type>(<scope>): <subject>

<body>

<footer>

类型(type):

类型说明示例
feat新功能feat: 添加用户注册功能
fixBug 修复fix: 修复登录页面崩溃问题
docs文档docs: 更新 README
style格式style: 统一缩进为2空格
refactor重构refactor: 重构用户认证逻辑
perf性能perf: 优化列表渲染性能
test测试test: 添加用户服务单元测试
chore构建/工具chore: 升级依赖版本
ciCI 配置ci: 添加 GitHub Actions 工作流
revert回退revert: 回退用户注册功能

完整示例:

PLAINTEXT
feat(auth): 添加 OAuth2 第三方登录

支持 Google、GitHub、Apple 三种 OAuth2 登录方式。
用户可以在设置页面绑定第三方账号。

Closes #123

6.2 好的提交 vs 坏的提交

BASH
# ❌ 坏的提交
git commit -m "fix"
git commit -m "update"
git commit -m "修改了一些东西"
git commit -m "wip"
git commit -m "fix bug again"

# ✅ 好的提交
git commit -m "fix(auth): 修复 token 过期后无法自动刷新的问题"
git commit -m "feat(api): 添加用户头像上传接口"
git commit -m "perf(list): 使用虚拟滚动优化万级列表渲染"

提交原则:

  1. 原子性:每个提交只做一件事
  2. 完整性:每个提交都能编译通过
  3. 清晰性:提交信息说清楚做了什么、为什么做
  4. 一致性:团队遵循统一的规范

6.3 修改提交

BASH
# 修改最近一次提交的信息
git commit --amend -m "新的提交信息"

# 把新修改追加到最近一次提交
git add .
git commit --amend --no-edit

# 修改更早的提交(交互式变基)
git rebase -i HEAD~3
# 将要修改的提交从 pick 改为 reword

# 撤销最近一次提交(保留修改)
git reset --soft HEAD~1

# 撤销最近一次提交(丢弃修改)
git reset --hard HEAD~1

# 安全撤销(创建反向提交)
git revert abc1234

七、远程仓库协作

7.1 远程仓库管理

BASH
# 查看远程仓库
git remote -v

# 添加远程仓库
git remote add origin git@github.com:user/repo.git

# 修改远程仓库地址
git remote set-url origin git@github.com:user/new-repo.git

# 重命名远程仓库
git remote rename origin upstream

# 删除远程仓库
git remote remove origin

# 添加多个远程仓库
git remote add origin git@github.com:user/repo.git
git remote add upstream git@github.com:upstream/repo.git

7.2 推送与拉取

BASH
# 推送
git push origin main
git push -u origin feature/login  # 首次推送并设置跟踪
git push                          # 后续简写
git push --force-with-lease       # 安全的强制推送
git push --tags                   # 推送标签

# 拉取
git pull origin main
git pull                          # 简写
git fetch origin                  # 只下载,不合并
git fetch --all --prune           # 获取所有远程并清理已删除的分支

# fetch vs pull
git fetch  → 只下载远程更新,不修改本地分支
git pull   = git fetch + git merge

7.3 Fork 工作流(开源贡献)

BASH
# 1. 在 GitHub 上 Fork 项目

# 2. 克隆你的 Fork
git clone git@github.com:your-username/project.git
cd project

# 3. 添加上游仓库
git remote add upstream git@github.com:original-author/project.git

# 4. 创建功能分支
git switch -c fix/typo-in-readme

# 5. 修改并提交
git add README.md
git commit -m "docs: 修复 README 中的拼写错误"

# 6. 同步上游最新代码
git fetch upstream
git rebase upstream/main

# 7. 推送到你的 Fork
git push origin fix/typo-in-readme

# 8. 在 GitHub 上创建 Pull Request

7.4 处理远程分支

BASH
# 查看远程分支
git branch -r

# 创建跟踪远程分支的本地分支
git switch -c feature/login origin/feature/login
# 或简写
git switch feature/login  # 自动跟踪同名远程分支

# 删除远程分支
git push origin --delete feature/login

# 清理本地已删除的远程分支引用
git fetch --prune
git remote prune origin

八、高级技巧

8.1 Stash(暂存)

BASH
# 暂存当前修改
git stash
git stash push -m "工作到一半的修改"

# 查看暂存列表
git stash list

# 恢复暂存(保留暂存记录)
git stash apply
git stash apply stash@{1}  # 恢复指定暂存

# 恢复暂存(删除暂存记录)
git stash pop

# 删除暂存
git stash drop stash@{0}
git stash clear  # 删除所有暂存

# 暂存未跟踪文件
git stash -u
git stash --include-untracked

8.2 Tag(标签)

BASH
# 创建轻量标签
git tag v1.0.0

# 创建附注标签(推荐)
git tag -a v1.0.0 -m "发布版本 1.0.0"

# 给历史提交打标签
git tag -a v0.9.0 -m "旧版本" abc1234

# 查看标签
git tag
git tag -l "v1.*"
git show v1.0.0

# 推送标签
git push origin v1.0.0
git push origin --tags  # 推送所有标签

# 删除标签
git tag -d v1.0.0                    # 本地删除
git push origin --delete v1.0.0      # 远程删除

8.3 子模块(Submodule)

BASH
# 添加子模块
git submodule add git@github.com:user/sub-project.git libs/sub-project

# 克隆含子模块的项目
git clone --recurse-submodules git@github.com:user/main-project.git

# 已克隆的项目初始化子模块
git submodule update --init --recursive

# 更新子模块
git submodule update --remote

# 修改子模块代码后提交
cd libs/sub-project
git add .
git commit -m "update submodule"
git push
cd ../..
git add libs/sub-project
git commit -m "chore: 更新子模块"

8.4 Git Bisect(二分查找 Bug)

BASH
# 当你不知道哪个提交引入了 Bug
git bisect start
git bisect bad          # 标记当前版本有 Bug
git bisect good v1.0.0  # 标记 v1.0.0 版本正常

# Git 会自动切换到中间的提交
# 测试后标记
git bisect good  # 或 git bisect bad

# 重复直到找到引入 Bug 的提交
# Git 会告诉你哪个提交有问题

# 结束二分查找
git bisect reset

8.5 Reflog(引用日志)

BASH
# 查看所有操作记录(包括已删除的提交)
git reflog

# 恢复误删的提交
git reset --hard HEAD@{2}

# 恢复误删的分支
git switch -c recovered-branch abc1234

Reflog 是你的救命稻草! 只要提交过,几乎都能找回来。

8.6 Worktree(工作树)

BASH
# 在不同目录同时检出多个分支
git worktree add ../project-hotfix hotfix/urgent
git worktree add ../project-feature feature/new-api

# 查看工作树
git worktree list

# 删除工作树
git worktree remove ../project-hotfix

九、代码审查(Code Review)

9.1 Pull Request / Merge Request 工作流

BASH
# 1. 创建功能分支
git switch -c feature/user-profile

# 2. 开发并提交
git add .
git commit -m "feat: 添加用户个人资料页面"

# 3. 推送
git push -u origin feature/user-profile

# 4. 在 GitHub/GitLab 上创建 Pull Request
#    目标分支:develop 或 main

# 5. 代码审查
#    - 至少1-2人审核
#    - 讨论修改建议
#    - 根据反馈修改

# 6. 根据审查意见修改
git add .
git commit -m "fix: 根据代码审查意见修改"
git push

# 7. 审核通过,合并
#    - Squash and Merge(推荐)
#    - Rebase and Merge
#    - Create a Merge Commit

9.2 代码审查清单

功能方面:

代码质量:

测试方面:

性能方面:

9.3 代码审查礼仪

给审查者的建议:

PLAINTEXT
✅ 好的审查意见:
- "这里建议用 Map 代替 Object,因为 key 是动态的"
- "这个函数有点长,可以拆分成两个小函数"
- "这个变量名不够清晰,改成 xxx 如何?"
- "赞!这个实现很优雅"

❌ 不好的审查意见:
- "这样写不行"
- "为什么不用 xxx?"
- "这代码是谁写的?"

给被审查者的建议:

PLAINTEXT
✅ 好的做法:
- PR 描述清楚做了什么、为什么做
- 每个 PR 控制在 400 行以内
- 对审查意见保持开放态度
- 有不同意见理性讨论

❌ 不好的做法:
- "我就是这样写的,你不懂"
- 巨型 PR(几千行)
- 不写 PR 描述
- 对审查意见产生对抗情绪

十、CI/CD 集成

10.1 GitHub Actions 示例

YAML
# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main, develop]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [20, 22]
    
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'pnpm'
      
      - name: Install pnpm
        run: npm install -g pnpm
      
      - name: Install dependencies
        run: pnpm install --frozen-lockfile
      
      - name: Lint
        run: pnpm lint
      
      - name: Type check
        run: pnpm type-check
      
      - name: Test
        run: pnpm test -- --coverage
      
      - name: Build
        run: pnpm build
      
      - name: Upload coverage
        uses: codecov/codecov-action@v4

10.2 Git Hooks 与 Husky

BASH
# 安装 Husky
pnpm add -D husky lint-staged

# 初始化 Husky
pnpm husky init
JSON
// package.json
{
  "scripts": {
    "prepare": "husky"
  },
  "lint-staged": {
    "*.{ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{json,md,yml}": ["prettier --write"]
  }
}
BASH
# 创建 pre-commit hook
echo 'pnpm lint-staged' > .husky/pre-commit

# 创建 commit-msg hook(检查提交信息规范)
cat > .husky/commit-msg << 'EOF'
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# 检查提交信息是否符合约定式提交规范
commit_regex='^(feat|fix|docs|style|refactor|perf|test|chore|ci|revert)(\(.+\))?: .{1,100}$
error_msg="提交信息不符合规范!格式:type(scope): subject"

if ! grep -qE "$commit_regex" "$1"; then
    echo "$error_msg"
    exit 1
fi
EOF

10.3 常用 Git Hooks

Hook触发时机常见用途
pre-commitgit commit 之前代码检查、格式化
commit-msg编写提交信息后检查提交信息格式
pre-pushgit push 之前运行测试
pre-merge-commit合并之前运行完整测试
post-checkout切换分支后安装依赖、生成配置
prepare-commit-msg编辑提交信息前自动生成提交信息模板

十一、常见问题与解决方案

Q1:提交了不该提交的文件怎么办?

BASH
# 从暂存区移除(保留本地文件)
git rm --cached secret.txt
echo "secret.txt" >> .gitignore
git add .gitignore
git commit -m "chore: 移除误提交的文件并添加到 .gitignore"

# 如果已经推送到远程,需要从历史中彻底删除
# 使用 git-filter-repo(推荐)
pip install git-filter-repo
git filter-repo --path secret.txt --invert-paths

# 或使用 BFG Repo-Cleaner
java -jar bfg.jar --delete-files secret.txt
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push --force

Q2:合并冲突太多怎么办?

BASH
# 放弃合并
git merge --abort

# 使用合并工具
git mergetool

# 查看冲突文件列表
git diff --name-only --diff-filter=U

# 一次性添加所有已解决的文件
git add $(git diff --name-only --diff-filter=U)

Q3:如何撤销已推送的提交?

BASH
# 方法1:创建反向提交(推荐,安全)
git revert abc1234
git push

# 方法2:强制推送(危险!只在个人分支用)
git reset --hard HEAD~1
git push --force-with-lease

# ⚠️ 永远不要对 main/develop 等公共分支使用强制推送

Q4:怎么把多次提交合并成一次?

BASH
# 合并最近3次提交
git rebase -i HEAD~3

# 在编辑器中:
pick abc123 feat: 添加功能A
squash def456 feat: 添加功能B
squash ghi789 fix: 修复功能A的bug

# 保存后会让你编辑合并后的提交信息

Q5:clone 太慢怎么办?

BASH
# 浅克隆(只取最新提交)
git clone --depth 1 git@github.com:user/repo.git

# 克隆指定分支
git clone --branch main --single-branch --depth 1 git@github.com:user/repo.git

# 后续需要完整历史时
git fetch --unshallow

Q6:如何查看某行代码是谁写的?

BASH
# 查看文件每行的最后修改者
git blame file.txt

# 查看指定行范围
git blame -L 10,20 file.txt

# 忽略空白修改
git blame -w file.txt

# 在 VS Code 中:
# 右键 → Open Timeline / GitLens: Toggle Line Blame

十二、Git 最佳实践总结

12.1 提交最佳实践

PLAINTEXT
✅ 每个 commit 只做一件事(原子提交)
✅ commit 信息清晰描述做了什么
✅ 遵循约定式提交规范
✅ 先写完测试再提交
✅ 频繁提交,小步快跑

❌ 一个 commit 包含多个不相关的修改
❌ 提交不可编译的代码
❌ "wip" / "fix" 之类的无意义信息
❌ 一次提交几千行代码

12.2 分支最佳实践

PLAINTEXT
✅ 分支名有意义:feature/user-login, fix/token-refresh
✅ 功能分支生命周期尽量短(< 1周)
✅ 经常同步主分支,避免大幅冲突
✅ 合并前确保 CI 通过
✅ 合并后删除功能分支

❌ 一个分支开发好几个月
❌ 分支名混乱:test, tmp, xxx
❌ 不同步主分支,积累大量冲突
❌ 合并后的分支不删除

12.3 团队协作最佳实践

PLAINTEXT
✅ 制定统一的分支策略和工作流
✅ 使用 Pull Request 进行代码审查
✅ 提交前运行本地检查(lint + test)
✅ 保持 main 分支始终可部署
✅ 使用 .gitignore 管理不需要提交的文件
✅ 使用 Git Hooks 自动化检查
✅ 定期清理已合并的分支
✅ 敏感信息(密钥、密码)绝不提交

12.4 .gitignore 最佳实践

GITIGNORE
# .gitignore

# 依赖
node_modules/
vendor/

# 构建产物
dist/
build/
*.o
*.class

# 环境变量
.env
.env.local
.env.*.local

# IDE
.idea/
.vscode/
*.swp
*.swo
*~

# 操作系统
.DS_Store
Thumbs.db

# 日志
*.log
logs/

# 测试
coverage/
.nyc_output/

# 临时文件
*.tmp
*.bak

十三、推荐工具

13.1 GUI 客户端

工具平台价格推荐度
VS Code Git全平台免费⭐⭐⭐⭐⭐
GitKraken全平台免费(公开)/付费⭐⭐⭐⭐
SourceTreeWin/Mac免费⭐⭐⭐⭐
ForkWin/Mac免费试用/买断⭐⭐⭐⭐⭐
TowerMac/Win付费⭐⭐⭐⭐
Lazygit终端免费⭐⭐⭐⭐⭐
tig终端免费⭐⭐⭐⭐

13.2 VS Code Git 扩展

13.3 CLI 增强工具

BASH
# lazygit — 终端 GUI
brew install lazygit

# delta — 美化 diff 输出
brew install git-delta
# 在 .gitconfig 中配置:
# [core]
#     pager = delta
# [interactive]
#     diffFilter = delta --color-only

# tig — 文本模式仓库浏览器
brew install tig

# gh — GitHub CLI
brew install gh
gh auth login
gh pr create --fill
gh pr checkout 123


Git 不仅仅是一个工具,更是一种思维方式。 理解了 Git 的设计哲学,你会发现它的每一个命令都精妙无比。掌握 Git,让团队协作如丝般顺滑。🚀

版权声明

作者: 易邦

链接: https://blog.e8k.net/posts/git-version-control-team-guide-2026/

许可证: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。