Git vs SVN 核心区别

一、Git vs SVN 核心区别

  1. 架构设计
    Git:分布式版本控制系统
    每个开发者本地都有完整的代码仓库(包括完整历史记录),无需依赖中央服务器即可提交、分支、合并。

SVN:集中式版本控制系统

所有代码和历史记录存储在中央服务器,开发者通过客户端与服务器交互(提交、更新等必须联网)。

  1. 核心概念对比
    特性 Git SVN
    存储方式 每个提交保存文件快照 记录文件差异(增量存储)
    分支/标签 轻量级(指针操作) 目录拷贝(较重量级)
    冲突处理 本地解决冲突后提交 更新时解决冲突再提交
    网络依赖 大部分操作本地完成,仅同步需网络 几乎所有操作依赖网络
    速度 快(本地操作) 较慢(依赖网络)
    二、Git 详细使用
  2. 基本操作
    bash
    复制

初始化仓库

git init

克隆远程仓库

git clone https://github.com/user/repo.git

添加文件到暂存区

git add file.txt

git add . # 添加所有修改

提交到本地仓库

git commit -m "提交说明"

查看状态

git status

查看提交历史

git log

git log --oneline --graph # 简洁版图形化历史

  1. 分支管理

bash

复制

创建分支

git branch feature-1

切换分支

git checkout feature-1

git switch feature-1 # 新版本推荐

创建并切换分支

git checkout -b feature-1

合并分支到当前分支(如合并到main)

git merge feature-1

删除分支

git branch -d feature-1

强制删除未合并分支

git branch -D feature-1

  1. 远程操作

bash

复制

关联远程仓库

git remote add origin https://github.com/user/repo.git

推送本地分支到远程

git push -u origin main # -u 设置默认上游分支

拉取远程更新

git pull # 相当于 git fetch + git merge

强制推送(谨慎使用!)

git push -f

  1. 撤销与回退

bash

复制

撤销工作区修改

git checkout -- file.txt

撤销暂存区修改(取消add)

git reset HEAD file.txt

回退到某个提交(保留修改)

git reset --soft commit_id

回退到某个提交(丢弃修改)

git reset --hard commit_id

修改最后一次提交的说明

git commit --amend

三、SVN 详细使用

  1. 基本操作
    bash
    复制

检出仓库

svn checkout http://svn.example.com/repo/trunk

更新本地代码

svn update

添加文件到版本控制

svn add file.txt

提交修改到服务器

svn commit -m "提交说明"

查看状态

svn status

查看差异

svn diff

  1. 分支与标签

SVN 通过目录结构管理分支和标签:

复制

repo/

trunk/ # 主分支

branches/ # 分支目录

tags/ # 标签目录

bash

复制

创建分支(拷贝trunk到branches)

svn copy http://svn.example.com/repo/trunk

http://svn.example.com/repo/branches/feature-1

-m "创建feature-1分支"

切换分支(本质是切换目录)

svn switch http://svn.example.com/repo/branches/feature-1

创建标签(类似分支)

svn copy http://svn.example.com/repo/trunk

http://svn.example.com/repo/tags/v1.0

-m "发布v1.0版本"

  1. 冲突解决

bash

复制

更新代码时发现冲突

svn update

冲突文件会生成多个版本:

file.txt.mine (你的修改)

file.txt.rOLD (基础版本)

file.txt.rNEW (他人修改)

手动解决冲突后标记为已解决

svn resolve --accept working file.txt

重新提交

svn commit -m "解决冲突"

四、使用场景建议

适合 Git 的场景:

需要频繁分支合并(如敏捷开发)

分布式团队协作(允许离线工作)

开源项目(GitHub/GitLab 生态完善)

适合 SVN 的场景:

企业内部集中式管理

对目录结构有严格规范

需要严格的权限控制(如按目录控制)

五、进阶技巧

Git

忽略文件:创建 .gitignore 文件,定义需忽略的文件模式。

储藏修改:临时保存未完成的修改:

bash

复制

git stash

git stash pop

Rebase 变基:整理提交历史(避免在公共分支使用):

bash

复制

git rebase main

SVN

忽略文件:通过 svn propedit svn:ignore . 设置目录忽略规则。

外部引用:链接其他仓库的代码:

bash

复制

svn propset svn:externals "lib http://svn.example.com/libs/trunk" .

六、迁移工具

SVN → Git:使用 git svn 工具迁移历史记录:

bash

复制

git svn clone http://svn.example.com/repo --authors-file=users.txt

Git → SVN:通过 git svn 双向同步,或手动导出代码提交。

七、常见问题

Git

提交到了错误分支:

bash

复制

git reset --hard HEAD~1 # 回退提交

git checkout correct-branch

git cherry-pick commit_id

合并冲突:手动编辑冲突文件后执行 git add 和 git commit。

SVN

锁定文件:某些文件需锁定才能编辑:

bash

复制

svn lock file.txt

svn unlock file.txt

清理失败:当操作中断时:

bash

复制

svn cleanup

通过以上内容,你已经掌握了 Git 和 SVN 的核心操作。建议在实际项目中多练习,遇到问题时善用 --help 或官方文档(如 git help commit)。

相关推荐
爱学英语的程序员1 小时前
让AI 帮我做了个个人博客(附提示词!)
人工智能·git·vue·github·node·个人博客
虫小宝1 小时前
个微iPad协议场景下Java后端的协议解析异常排查与问题定位技巧
java·svn·ipad
liu****2 小时前
git工具
git·python·算法·机器学习·计算机基础
wxr06162 小时前
git无法克隆
git
cooldream20095 小时前
Git 拒绝推送(Push Rejected)问题全解析与解决方案实战指南
git
wxr06165 小时前
GIT无法push
git·gitee
装不满的克莱因瓶7 小时前
【踩坑】IDEA提交Git .gitignore忽略文件不起作用
java·git·.gitignore·踩坑
cos17 小时前
Fork 主题如何更新?基于 Ink 构建主题更新 CLI 工具
前端·javascript·git
OpenMiniServer18 小时前
当 AI 成为 Git 里的一个“人”
人工智能·git
Carry34519 小时前
不清楚的 .gitignore
前端·git