Git 是什么?
Git是目前世界上最流行的分布式版本控制系统,由Linus Torvalds于2005年创建。它能够跟踪文件的每一次变更,让多人协作开发变得高效可控。无论是个人项目还是大型团队,Git都是现代软件开发不可或缺的工具。
Git的核心优势:分布式架构、强大的分支管理、极速的本地操作、完整的变更历史。
基础命令
初始化与配置
# 初始化一个新的Git仓库
git init
# 克隆远程仓库
git clone https://github.com/user/repo.git
git clone [email protected]:user/repo.git # SSH方式
# 配置用户信息(全局)
git config --global user.name "张三"
git config --global user.email "[email protected]"
# 查看配置
git config --list
git config user.name
基本工作流
# 查看文件状态
git status
# 添加文件到暂存区
git add file.txt # 添加单个文件
git add src/ # 添加整个目录
git add . # 添加所有变更
git add -p # 交互式选择要添加的代码块
# 提交
git commit -m "feat: 添加用户登录功能"
git commit -am "fix: 修复表单验证bug" # 跳过add,直接提交已跟踪文件
# 查看提交历史
git log
git log --oneline # 简洁模式
git log --oneline --graph # 图形化显示分支
git log --author="张三" # 按作者筛选
git log --since="2026-01-01" # 按时间筛选
git log -5 # 最近5条提交
git log --stat # 显示文件变更统计
查看变更
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与上次提交的差异
git diff --staged
# 查看两次提交之间的差异
git diff abc1234 def5678
# 查看某个文件的历史修改
git log -p file.txt
# 查看某次提交的内容
git show abc1234
分支管理
分支是Git最强大的功能之一。它允许你在不影响主线代码的情况下进行开发、实验和修复。
基本分支操作
# 查看分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支
# 创建分支
git branch feature/login
# 切换分支
git checkout feature/login
git switch feature/login # Git 2.23+ 推荐
# 创建并切换到新分支
git checkout -b feature/signup
git switch -c feature/signup
# 删除分支
git branch -d feature/login # 安全删除(已合并)
git branch -D feature/login # 强制删除
# 重命名分支
git branch -m old-name new-name
合并分支
# 合并分支(fast-forward 合并)
git checkout main
git merge feature/login
# 合并分支(三方合并,创建合并提交)
git merge --no-ff feature/signup -m "合并feature/signup分支"
# 变基(rebase)—— 整理提交历史
git checkout feature/login
git rebase main
# 变基后需要重新应用到main
git checkout main
git merge feature/login # 此时是fast-forward
merge 保留完整的分支历史,rebase 创建线性的提交历史。团队可以根据需要选择合适的策略。
merge vs rebase 对比
| 特性 | merge | rebase |
|---|---|---|
| 历史记录 | 保留完整分支结构 | 创建线性历史 |
| 合并提交 | 创建merge commit | 不创建额外提交 |
| 适用场景 | 公共分支(main/develop) | 个人功能分支 |
| 风险 | 低 | 重写历史,需要force push |
远程仓库操作
# 关联远程仓库
git remote add origin [email protected]:user/repo.git
# 查看远程仓库
git remote -v
# 推送到远程
git push origin main
git push -u origin main # 首次推送并设置上游分支
git push origin feature/login # 推送分支
# 拉取远程更新
git pull origin main # fetch + merge
git pull --rebase origin main # fetch + rebase
# 获取远程更新(不合并)
git fetch origin
# 查看远程分支状态
git branch -vv # 显示本地分支与远程分支的跟踪关系
解决冲突
当两个分支修改了同一文件的同一区域时,Git无法自动合并,需要手动解决冲突。
# 合并时出现冲突
Auto-merging src/app.js
CONFLICT (content): Merge conflict in src/app.js
Automatic merge failed; fix conflicts and then commit the result.
# 查看冲突文件
git status
# 冲突标记说明
<<<<<<< HEAD
const API_URL = 'https://api.example.com'; ← 当前分支的修改
=======
const API_URL = 'https://api.new.com'; ← 合并分支的修改
>>>>>>> feature/update-api
# 解决冲突:手动编辑文件,删除冲突标记,保留正确内容
# 然后添加并提交
git add src/app.js
git commit -m "resolve: 解决API URL冲突"
# 使用工具解决冲突
git mergetool
# 放弃合并
git merge --abort
.gitignore 文件
.gitignore文件指定Git应该忽略的文件和目录,避免将不必要的文件提交到仓库。
# .gitignore 示例
# 依赖目录
node_modules/
vendor/
# 构建输出
dist/
build/
*.min.js
*.min.css
# 环境变量
.env
.env.local
.env.*.local
# IDE配置
.idea/
.vscode/
*.swp
*.swo
# 操作系统文件
.DS_Store
Thumbs.db
# 日志文件
*.log
npm-debug.log*
# 编译产物
*.class
*.o
*.exe
# 测试覆盖率
coverage/
# 临时文件
tmp/
temp/
Git 工作流
Git Flow
main ──●──────────────●──────────●──
\ / /
feature/login ──●──●──●──●
\ /
develop ──●──●──●──●──●──●──●──●──●──
\ /
hotfix/bug ────────●──●──●
- main — 生产分支,只接受合并
- develop — 开发分支,功能集成
- feature/* — 功能分支,从develop创建
- hotfix/* — 热修复,从main创建
GitHub Flow(推荐)
main ──●──────────────●──────────●──
\ / /
feature/* ──●──●──●──PR──●
- 从main创建功能分支
- 在功能分支上开发并提交
- 发起Pull Request(PR)
- 代码审查通过后合并到main
- 删除功能分支
提交规范
# 格式:type(scope): description
# 常用类型
feat: 新功能
fix: 修复bug
docs: 文档更新
style: 代码格式(不影响功能)
refactor: 代码重构
test: 添加/修改测试
chore: 构建过程或辅助工具变更
perf: 性能优化
# 示例
feat(auth): 添加用户登录功能
fix(form): 修复邮箱验证正则错误
docs: 更新README安装说明
refactor(api): 重构用户接口调用方式
perf(images): 优化图片懒加载性能
实用技巧
# 撤销工作区修改
git checkout -- file.txt # 丢弃工作区变更
git restore file.txt # Git 2.23+ 推荐
# 撤销暂存
git reset HEAD file.txt # 取消暂存
git restore --staged file.txt # Git 2.23+ 推荐
# 修改上次提交
git commit --amend -m "新的提交信息"
git commit --amend --no-edit # 仅添加文件,不改提交信息
# 回退提交(保留变更在工作区)
git reset --soft HEAD~1 # 回退到暂存区
git reset --mixed HEAD~1 # 回退到工作区(默认)
git reset --hard HEAD~1 # 完全丢弃(慎用!)
# 暂存当前工作(切换分支前)
git stash
git stash pop # 恢复并删除暂存
git stash list # 查看暂存列表
git stash apply stash@{0} # 恢复指定暂存
# 查找引入bug的提交
git bisect start
git bisect bad # 标记当前为坏
git bisect good abc1234 # 标记这个提交为好
# Git会自动二分查找
# Cherry-pick — 选择性合并提交
git cherry-pick abc1234 # 将指定提交应用到当前分支
# 清理未跟踪文件
git clean -fd # 删除未跟踪的文件和目录
最佳实践
- 频繁提交:小步提交,每次提交只做一件事
- 写好提交信息:遵循Conventional Commits规范
- 分支命名规范:使用
feature/、fix/、hotfix/前缀 - 合并前先rebase:保持功能分支与main同步
- 使用Pull Request:让代码审查成为流程的一部分
- 保护main分支:禁止直接推送,要求PR和CI通过
- 定期清理分支:合并后删除已完成功能的分支
- 不要提交敏感信息:使用 .gitignore 和 pre-commit hooks
- 善用tag标记版本:
git tag v1.0.0 - 备份重要分支:定期推送到远程仓库