最后更新于:2026年7月

不会 Git,寸步难行。 Git 已经是软件开发的绝对标准——95% 以上的项目使用 Git 进行版本控制。无论是个人项目、开源协作还是企业开发,Git 都是必备技能。
但很多人对 Git 的理解还停留在 add → commit → push 三板斧,遇到冲突就慌,分支管理一团糟,团队协作全靠口头沟通。
本文从核心原理到企业级工作流,带你全面掌握 Git。
一、Git 核心概念
1.1 什么是版本控制?
版本控制系统(VCS)的作用:
- 📂 记录文件的每一次修改历史
- ⏮️ 随时回退到任意历史版本
- 👥 支持多人同时开发,合并各自修改
- 🔍 追踪每一行代码的修改者和修改时间
- 🌿 支持并行开发多条功能线(分支)
1.2 Git vs 其他 VCS
| 特性 | Git | SVN | Mercurial |
|---|---|---|---|
| 类型 | 分布式 | 集中式 | 分布式 |
| 离线工作 | ✅ | ❌ | ✅ |
| 分支 | 轻量级 | 重量级 | 中等 |
| 速度 | ⚡ 快 | 🐢 慢 | ⚡ 快 |
| 生态 | 最丰富 | 衰退中 | 较小 |
| 普及度 | 95%+ | < 3% | < 1% |
1.3 Git 的核心架构
工作区 (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 的本质是一个内容寻址的文件系统。
每次 commit = 一个快照(Snapshot),不是差异(Diff)
Commit 对象包含:
├── tree(目录结构)
│ ├── blob(文件内容)
│ ├── blob(文件内容)
│ └── tree(子目录)
│ └── blob(文件内容)
├── parent(父提交)
├── author(作者)
├── committer(提交者)
└── message(提交信息)关键理解:
- Git 存储的是快照,不是增量差异
- 每个文件内容都有 SHA-1 哈希值
- 相同内容的文件只存一份(去重)
- 分支只是一个指向 commit 的指针
二、Git 安装与配置
2.1 安装 Git
macOS:
# 方式1:Xcode Command Line Tools
xcode-select --install
# 方式2:Homebrew
brew install gitWindows:
# 下载安装包
# https://git-scm.com/download/win
# 或使用 winget
winget install Git.Git
# 或使用 Scoop
scoop install gitLinux:
# Debian/Ubuntu
sudo apt install git
# CentOS/RHEL
sudo yum install git
# Arch
sudo pacman -S git2.2 全局配置
# 设置用户名和邮箱(必须配置)
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 current2.3 SSH 密钥配置
# 生成 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:
GitHub → Settings → SSH and GPG keys → New SSH key → 粘贴公钥测试连接:
ssh -T git@github.com
# Hi username! You've successfully authenticated...2.4 .gitconfig 推荐配置
# ~/.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 创建仓库
# 初始化新仓库
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.git3.2 日常操作流程
# 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 查看历史
# 查看提交历史
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 --shortstat3.4 查看差异
# 工作区 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 分支基础
# 查看分支
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-name4.2 合并(Merge)
# 将 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)合并冲突解决:
# 合并时出现冲突
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 --abort4.3 变基(Rebase)
# 将 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个提交交互式变基操作:
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:
| 特性 | Merge | Rebase |
|---|---|---|
| 历史记录 | 保留分支历史 | 线性历史 |
| 冲突处理 | 一次性解决 | 每个提交可能都要解决 |
| 安全性 | 安全(不改写历史) | 危险(改写历史) |
| 适用场景 | 合并公共分支 | 整理个人分支 |
| 推荐 | 合并到 main | 同步最新 main |
黄金法则:不要对已推送到公共分支的提交执行 rebase!
4.4 Cherry Pick
# 从其他分支挑选特定提交到当前分支
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(经典工作流)
main ────●──────────────●────────●──── (生产环境)
\ ↑ ↑
\ release merge
\ ↑
develop ──────●──●──●──●──●──●──●──●──── (开发主线)
\ / \
feature/ ●──●──● ●──●──● (功能分支)
login dashboard
release ─────────────●──●──●────────────── (发布分支)
↑
hotfix ────────────────────●──●────────── (紧急修复)
↑分支说明:
| 分支 | 来源 | 合并到 | 命名规范 | 说明 |
|---|---|---|---|---|
main | - | - | main | 生产环境代码 |
develop | main | - | develop | 开发主线 |
feature/* | develop | develop | feature/xxx | 新功能 |
release/* | develop | main + develop | release/v1.0 | 发布准备 |
hotfix/* | main | main + develop | hotfix/xxx | 紧急修复 |
适用场景: 中大型项目、有明确发布周期、需要维护多个版本。
5.2 GitHub Flow(简化工作流)
main ────●──●──●──●──●──●──●──── (始终可部署)
\ \ \ \ \ \
feature/ ● ● ● ● ● ●── (功能分支,通过PR合并)规则简单:
main分支始终可部署- 从
main创建功能分支 - 在功能分支上提交
- 创建 Pull Request
- 代码审查通过后合并到
main - 合并后立即部署
适用场景: 小型项目、持续部署、快速迭代。
5.3 Trunk-Based Development(主干开发)
main ────●──●──●──●──●──●──●──●──── (主干,频繁集成)
\ / \ | / \ /
short/ ● ● ● ● ● (短生命周期分支,通常<24h)特点:
- 所有人在主干上开发,或用非常短的功能分支
- 频繁集成(每天多次)
- 依赖 Feature Flag 控制功能可见性
- 强调自动化测试和 CI
适用场景: 高频部署、DevOps 成熟、自动化完善的团队。
5.4 选择建议
| 团队规模 | 发布频率 | 推荐工作流 |
|---|---|---|
| 1-5人 | 每周/每两周 | GitHub Flow |
| 5-20人 | 每月 | Git Flow / GitHub Flow |
| 20+人 | 每季度 | Git Flow |
| 任何规模 | 每天多次 | Trunk-Based |
六、提交规范
6.1 约定式提交(Conventional Commits)
<type>(<scope>): <subject>
<body>
<footer>类型(type):
| 类型 | 说明 | 示例 |
|---|---|---|
feat | 新功能 | feat: 添加用户注册功能 |
fix | Bug 修复 | fix: 修复登录页面崩溃问题 |
docs | 文档 | docs: 更新 README |
style | 格式 | style: 统一缩进为2空格 |
refactor | 重构 | refactor: 重构用户认证逻辑 |
perf | 性能 | perf: 优化列表渲染性能 |
test | 测试 | test: 添加用户服务单元测试 |
chore | 构建/工具 | chore: 升级依赖版本 |
ci | CI 配置 | ci: 添加 GitHub Actions 工作流 |
revert | 回退 | revert: 回退用户注册功能 |
完整示例:
feat(auth): 添加 OAuth2 第三方登录
支持 Google、GitHub、Apple 三种 OAuth2 登录方式。
用户可以在设置页面绑定第三方账号。
Closes #1236.2 好的提交 vs 坏的提交
# ❌ 坏的提交
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): 使用虚拟滚动优化万级列表渲染"提交原则:
- 原子性:每个提交只做一件事
- 完整性:每个提交都能编译通过
- 清晰性:提交信息说清楚做了什么、为什么做
- 一致性:团队遵循统一的规范
6.3 修改提交
# 修改最近一次提交的信息
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 远程仓库管理
# 查看远程仓库
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.git7.2 推送与拉取
# 推送
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 merge7.3 Fork 工作流(开源贡献)
# 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 Request7.4 处理远程分支
# 查看远程分支
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(暂存)
# 暂存当前修改
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-untracked8.2 Tag(标签)
# 创建轻量标签
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)
# 添加子模块
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)
# 当你不知道哪个提交引入了 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 reset8.5 Reflog(引用日志)
# 查看所有操作记录(包括已删除的提交)
git reflog
# 恢复误删的提交
git reset --hard HEAD@{2}
# 恢复误删的分支
git switch -c recovered-branch abc1234Reflog 是你的救命稻草! 只要提交过,几乎都能找回来。
8.6 Worktree(工作树)
# 在不同目录同时检出多个分支
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 工作流
# 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 Commit9.2 代码审查清单
功能方面:
- 代码是否实现了预期功能?
- 是否处理了边界情况?
- 是否有错误处理?
- 是否有安全漏洞?
代码质量:
- 命名是否清晰有意义?
- 函数/类是否职责单一?
- 是否有重复代码?
- 是否有足够的注释和文档?
测试方面:
- 是否有单元测试?
- 测试覆盖率是否达标?
- 是否有集成测试?
- CI 是否通过?
性能方面:
- 是否有明显的性能问题?
- 是否有不必要的数据库查询?
- 是否有内存泄漏风险?
9.3 代码审查礼仪
给审查者的建议:
✅ 好的审查意见:
- "这里建议用 Map 代替 Object,因为 key 是动态的"
- "这个函数有点长,可以拆分成两个小函数"
- "这个变量名不够清晰,改成 xxx 如何?"
- "赞!这个实现很优雅"
❌ 不好的审查意见:
- "这样写不行"
- "为什么不用 xxx?"
- "这代码是谁写的?"给被审查者的建议:
✅ 好的做法:
- PR 描述清楚做了什么、为什么做
- 每个 PR 控制在 400 行以内
- 对审查意见保持开放态度
- 有不同意见理性讨论
❌ 不好的做法:
- "我就是这样写的,你不懂"
- 巨型 PR(几千行)
- 不写 PR 描述
- 对审查意见产生对抗情绪十、CI/CD 集成
10.1 GitHub Actions 示例
# .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@v410.2 Git Hooks 与 Husky
# 安装 Husky
pnpm add -D husky lint-staged
# 初始化 Husky
pnpm husky init// package.json
{
"scripts": {
"prepare": "husky"
},
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{json,md,yml}": ["prettier --write"]
}
}# 创建 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
EOF10.3 常用 Git Hooks
| Hook | 触发时机 | 常见用途 |
|---|---|---|
pre-commit | git commit 之前 | 代码检查、格式化 |
commit-msg | 编写提交信息后 | 检查提交信息格式 |
pre-push | git push 之前 | 运行测试 |
pre-merge-commit | 合并之前 | 运行完整测试 |
post-checkout | 切换分支后 | 安装依赖、生成配置 |
prepare-commit-msg | 编辑提交信息前 | 自动生成提交信息模板 |
十一、常见问题与解决方案
Q1:提交了不该提交的文件怎么办?
# 从暂存区移除(保留本地文件)
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 --forceQ2:合并冲突太多怎么办?
# 放弃合并
git merge --abort
# 使用合并工具
git mergetool
# 查看冲突文件列表
git diff --name-only --diff-filter=U
# 一次性添加所有已解决的文件
git add $(git diff --name-only --diff-filter=U)Q3:如何撤销已推送的提交?
# 方法1:创建反向提交(推荐,安全)
git revert abc1234
git push
# 方法2:强制推送(危险!只在个人分支用)
git reset --hard HEAD~1
git push --force-with-lease
# ⚠️ 永远不要对 main/develop 等公共分支使用强制推送Q4:怎么把多次提交合并成一次?
# 合并最近3次提交
git rebase -i HEAD~3
# 在编辑器中:
pick abc123 feat: 添加功能A
squash def456 feat: 添加功能B
squash ghi789 fix: 修复功能A的bug
# 保存后会让你编辑合并后的提交信息Q5:clone 太慢怎么办?
# 浅克隆(只取最新提交)
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 --unshallowQ6:如何查看某行代码是谁写的?
# 查看文件每行的最后修改者
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 提交最佳实践
✅ 每个 commit 只做一件事(原子提交)
✅ commit 信息清晰描述做了什么
✅ 遵循约定式提交规范
✅ 先写完测试再提交
✅ 频繁提交,小步快跑
❌ 一个 commit 包含多个不相关的修改
❌ 提交不可编译的代码
❌ "wip" / "fix" 之类的无意义信息
❌ 一次提交几千行代码12.2 分支最佳实践
✅ 分支名有意义:feature/user-login, fix/token-refresh
✅ 功能分支生命周期尽量短(< 1周)
✅ 经常同步主分支,避免大幅冲突
✅ 合并前确保 CI 通过
✅ 合并后删除功能分支
❌ 一个分支开发好几个月
❌ 分支名混乱:test, tmp, xxx
❌ 不同步主分支,积累大量冲突
❌ 合并后的分支不删除12.3 团队协作最佳实践
✅ 制定统一的分支策略和工作流
✅ 使用 Pull Request 进行代码审查
✅ 提交前运行本地检查(lint + test)
✅ 保持 main 分支始终可部署
✅ 使用 .gitignore 管理不需要提交的文件
✅ 使用 Git Hooks 自动化检查
✅ 定期清理已合并的分支
✅ 敏感信息(密钥、密码)绝不提交12.4 .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 | 全平台 | 免费(公开)/付费 | ⭐⭐⭐⭐ |
| SourceTree | Win/Mac | 免费 | ⭐⭐⭐⭐ |
| Fork | Win/Mac | 免费试用/买断 | ⭐⭐⭐⭐⭐ |
| Tower | Mac/Win | 付费 | ⭐⭐⭐⭐ |
| Lazygit | 终端 | 免费 | ⭐⭐⭐⭐⭐ |
| tig | 终端 | 免费 | ⭐⭐⭐⭐ |
13.2 VS Code Git 扩展
- GitLens — Git 超级增强(blame、history、比较)
- Git Graph — 图形化分支历史
- GitHub Pull Requests — 直接在编辑器中管理 PR
- Conventional Commits — 提交信息辅助
13.3 CLI 增强工具
# 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【相关推荐】
- VS Code 完全配置与效率提升指南 - 开发者必备编辑器
- React 19 + TypeScript 完全指南 - 前端框架
- Vite 5 项目构建与性能优化指南 - 构建工具
Git 不仅仅是一个工具,更是一种思维方式。 理解了 Git 的设计哲学,你会发现它的每一个命令都精妙无比。掌握 Git,让团队协作如丝般顺滑。🚀
