大家好,版本控制系统是开发团队协作的基石,它记录文件的变更历史,支持多人协同开发。本文将系统性地讲解SVN(集中式) 和Git(分布式) 两大版本控制系统的核心概念与常用操作,帮助你快速上手并理解两者的区别。
一、版本控制概述
1.1 什么是版本控制
版本控制是一种记录文件变更的系统,以便日后查阅特定版本的历史记录。它是团队协作开发中不可或缺的工具。
1.2 SVN 与 Git 的核心区别
| 对比项 | SVN(集中式) | Git(分布式) |
|---|---|---|
| 仓库位置 | 中央服务器 | 每个本地都有完整仓库 |
| 网络依赖 | 大部分操作需要联网 | 大部分操作离线完成 |
| 分支成本 | 较高 | 极低,分支切换快速 |
| 历史记录 | 仅存储在中央服务器 | 本地完整历史 |
| 协作方式 | 必须与中央服务器同步 | 可自由在本地操作后推送 |
| 适用场景 | 企业内部、权限管理严格 | 开源项目、分布式团队 |
一句话总结:SVN 是集中式的,所有操作依赖中央服务器;Git 是分布式的,每个人本地都有完整的仓库副本。
二、Git 核心概念
2.1 四大区域
| 区域 | 说明 |
|---|---|
| 工作区(Working Directory) | 本地文件目录,即你编写代码的地方 |
| 暂存区(Staging Area) | 存放准备提交的变更,也称为 Index |
| 本地仓库(Local Repository) | 提交历史存储在本地的 .git 目录中 |
| 远程仓库(Remote Repository) | 托管在服务器上的共享仓库(如 GitHub、Gitee) |
2.2 工作流程
工作区 → git add → 暂存区 → git commit → 本地仓库 → git push → 远程仓库
三、Git 基础配置
3.1 配置用户信息
Git 需要知道提交者的身份信息。
# 全局配置(针对电脑上的所有项目)
git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"
# 局部配置(仅针对当前项目,优先级高于全局)
git config user.name "项目专用姓名"
git config user.email "项目专用邮箱"
# 查看所有配置
git config --list
3.2 初始化仓库
# 将当前目录变为 Git 项目,生成 .git 隐藏文件夹
git init
四、Git 基本操作
4.1 查看状态:git status
# 查看工作区和暂存区的状态
git status
# 状态颜色说明:
# 白色 正常
# 红色 工作区有修改未提交
# 绿色 暂存区有修改未提交
4.2 添加文件:git add
# 将工作区的变更添加到暂存区
git add 文件名 # 添加单个文件
git add . # 添加当前目录所有变更
git add *.py # 添加所有 Python 文件
4.3 撤销暂存:git restore --staged
# 将暂存区的内容撤销回工作区(取消 git add)
git restore --staged 文件名
# 撤销所有暂存内容
git restore --staged .
4.4 提交:git commit
# 从暂存区提交到本地仓库
git commit -m "提交信息"
# 直接提交所有已追踪文件的变更(跳过 git add)
git commit -a -m "提交信息"
4.5 查看提交日志:git log
# 查看提交历史(详细)
git log
# 简洁模式(一行一个提交)
git log --oneline
# 查看所有操作日志(包含版本切换记录)
git reflog
4.6 版本回退:git reset
# 回退到指定版本(保留工作区变更)
git reset --soft 版本号前缀
# 回退到指定版本(丢弃工作区变更,谨慎使用)
git reset --hard 版本号前缀
不同模式对比:
| 模式 | 工作区 | 暂存区 | 仓库 |
|---|---|---|---|
--soft |
保留 | 保留 | 回退 |
--mixed(默认) |
保留 | 清除 | 回退 |
--hard |
清除 | 清除 | 回退 |
五、Git 分支管理
5.1 分支的核心概念
分支是 Git 最强大的特性之一,允许开发者在独立线上进行开发,不影响主分支。
# 查看所有分支(* 表示当前分支)
git branch
# 查看所有分支(包含远程分支)
git branch -a
# 创建新分支
git branch 分支名
# 切换分支
git switch 分支名
# 或使用旧命令
git checkout 分支名
# 创建并切换到新分支
git switch -c 分支名
# 删除分支
git branch -d 分支名
# 强制删除分支(未合并时使用)
git branch -D 分支名
5.2 合并分支
# 将目标分支合并到当前分支
git merge 目标分支名
# 示例:将 dev 分支的代码合并到 main 分支
# 1. 先切换到 main 分支
git switch main
# 2. 执行合并
git merge dev
5.3 合并冲突解决
当两个分支修改了同一文件的同一位置时,Git 无法自动合并,需要手动解决冲突。
# 冲突文件中的标记:
<<<<<<< HEAD
当前分支的内容
=======
被合并分支的内容
>>>>>>> 分支名
# 解决步骤:
# 1. 手动编辑文件,删除冲突标记,保留想要的内容
# 2. 重新添加并提交
git add .
git commit -m "解决冲突"
六、Git 与远程仓库
6.1 关联远程仓库
# 添加远程仓库
git remote add origin https://github.com/用户名/仓库名.git
# 查看远程仓库
git remote -v
# 修改远程仓库地址
git remote set-url origin 新地址
6.2 推送与拉取
# 推送到远程仓库
git push origin 分支名
# 首次推送时设置上游分支
git push -u origin 分支名
# 从远程仓库拉取更新
git pull origin 分支名
# 只拉取不合并(查看远程变更)
git fetch origin 分支名
6.3 克隆仓库
# 克隆远程仓库到本地
git clone 仓库地址
# 克隆指定分支
git clone -b 分支名 仓库地址
七、Git 操作流程图
text
┌─────────────┐ git add ┌─────────────┐ git commit ┌─────────────┐ git push ┌─────────────┐
│ │ ──────────► │ │ ────────────► │ │ ───────────► │ │
│ 工作区 │ │ 暂存区 │ │ 本地仓库 │ │ 远程仓库 │
│ │ ◄────────── │ │ ◄──────────── │ │ ◄─────────── │ │
└─────────────┘ git restore └─────────────┘ git reset └─────────────┘ git pull └─────────────┘
八、SVN 简介(集中式)
8.1 SVN 的核心概念
SVN(Subversion)是集中式版本控制系统,所有版本历史存储在中央服务器上,开发者需要从服务器获取代码并提交变更。
8.2 SVN 常用命令
| 命令 | 说明 |
|---|---|
svn checkout URL |
从服务器检出代码 |
svn update |
更新本地代码到最新版本 |
svn add 文件 |
添加文件到版本控制 |
svn commit -m "msg" |
提交变更到服务器 |
svn status |
查看工作副本状态 |
svn log |
查看提交历史 |
svn diff |
查看文件变更差异 |
svn revert |
撤销本地修改 |
8.3 典型 SVN 工作流程
# 1. 首次获取代码
svn checkout 仓库地址
# 2. 更新最新代码
svn update
修改后会变红
# 3. 修改代码后查看状态
svn status
# 4. 添加新文件
TortoiseSVN → Add
# 5. 提交变更
svn commit
8.4 SVN 与 Git 的对比总结
| 特性 | SVN | Git |
|---|---|---|
| 架构 | 集中式 | 分布式 |
| 离线操作 | 有限 | 完整 |
| 分支创建 | 较慢 | 极快 |
| 分支合并 | 复杂 | 高效 |
| 权限控制 | 细粒度 | 通过平台实现 |
| 存储方式 | 差异存储 | 快照存储 |
| 学习曲线 | 较平缓 | 较陡峭 |
九、常用命令速查表
Git 快速参考
| 操作 | 命令 |
|---|---|
| 初始化 | git init |
| 查看状态 | git status |
| 添加文件 | git add . |
| 提交变更 | git commit -m "msg" |
| 查看日志 | git log --oneline |
| 查看操作日志 | git reflog |
| 回退版本 | git reset --hard 版本号 |
| 查看分支 | git branch |
| 切换分支 | git switch 分支名 |
| 创建分支 | git branch 分支名 |
| 创建并切换 | git switch -c 分支名 |
| 删除分支 | git branch -d 分支名 |
| 合并分支 | git merge 分支名 |
| 关联远程 | git remote add origin 地址 |
| 推送 | git push origin 分支名 |
| 拉取 | git pull origin 分支名 |
| 克隆 | git clone 地址 |
| 从暂存区撤销 | git restore --staged 文件名 |
| 丢弃工作区修改 | git restore 文件名 |
SVN 快速参考
| 操作 | 命令 |
|---|---|
| 检出 | svn checkout URL |
| 更新 | svn update |
| 添加 | svn add 文件 |
| 提交 | svn commit -m "msg" |
| 查看状态 | svn status |
| 查看日志 | svn log |
| 撤销修改 | svn revert 文件 |
十、总结
| 分类 | 核心内容 |
|---|---|
| SVN(集中式) | 中央服务器存储所有版本,checkout、update、commit |
| Git(分布式) | 本地完整仓库,add、commit、push、pull |
| Git 四大区域 | 工作区 → 暂存区 → 本地仓库 → 远程仓库 |
| Git 分支 | branch、switch、merge、branch -d |
| 版本回退 | git reset --hard、git reflog |
| 冲突解决 | 手动编辑冲突文件,重新 add + commit |
SVN 适合权限管理严格的集中式开发场景,Git 则凭借分布式特性和强大的分支管理能力,成为开源项目和现代开发团队的首选。掌握 Git 的基本操作是每位开发者的必修课,建议在实际项目中多练习,逐步熟悉工作流程。
如果觉得这篇内容对你有帮助,欢迎收藏备用。