Git版本控制入门到精通

开发工具 作者: 编辑团队 发布于: 2026-07-11 阅读约 14 分钟

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     ────────●──●──●

GitHub Flow(推荐)

main      ──●──────────────●──────────●──
              \            /          /
feature/*  ──●──●──●──PR──●
  1. 从main创建功能分支
  2. 在功能分支上开发并提交
  3. 发起Pull Request(PR)
  4. 代码审查通过后合并到main
  5. 删除功能分支

提交规范

# 格式: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                 # 删除未跟踪的文件和目录

最佳实践

  1. 频繁提交:小步提交,每次提交只做一件事
  2. 写好提交信息:遵循Conventional Commits规范
  3. 分支命名规范:使用 feature/fix/hotfix/ 前缀
  4. 合并前先rebase:保持功能分支与main同步
  5. 使用Pull Request:让代码审查成为流程的一部分
  6. 保护main分支:禁止直接推送,要求PR和CI通过
  7. 定期清理分支:合并后删除已完成功能的分支
  8. 不要提交敏感信息:使用 .gitignore 和 pre-commit hooks
  9. 善用tag标记版本git tag v1.0.0
  10. 备份重要分支:定期推送到远程仓库