第一部分SVN 分支管理最佳实践一、标准目录结构约定优于配置SVN 本身不强制目录结构但业界公认的标准布局是trunk / branches / tags 三件套repository/ ├── trunk/ # 主干主开发线始终保持可用 │ ├── rtl/ │ ├── verification/ │ └── docs/ ├── branches/ # 分支并行开发 │ ├── feature_uart/ # 特性分支 │ ├── bugfix_clk_issue/ # 缺陷修复分支 │ └── dev_team_a/ # 团队/个人分支 └── tags/ # 标签只读版本快照 ├── v1.0_tapeout/ # 流片版本 ├── v1.1_release/ └── milestone_rtl_freeze/大型项目多模块布局repository/ ├── project_soc/ │ ├── trunk/ │ ├── branches/ │ └── tags/ ├── project_ip_uart/ │ ├── trunk/ │ ├── branches/ │ └── tags/ └── ...每个独立可发布单元IP/子系统拥有自己的 trunk/branches/tags。二、三类目录的职责目录职责规则trunk主开发线集成所有功能保持随时可编译/可仿真不放未完成的破坏性代码branches隔离开发不影响主干特性、修复、实验都在分支进行完成后合并回 trunktags版本快照只读创建后绝不修改仅用于标记里程碑/发布/流片三、分支策略何时建分支1. 特性分支Feature Branch为新功能开发创建避免半成品污染主干svn copy https://repo/trunk \ https://repo/branches/feature_axi_dma \ -m create feature branch for AXI DMA适用开发周期长、影响范围大的新功能。2. 缺陷修复分支Bugfix Branch针对已发布版本修 bug不引入主干新功能svn copy https://repo/tags/v1.0_release \ https://repo/branches/bugfix_v1.0_clk \ -m fix clock bug on v1.03. 发布分支Release Branch发布前稳定化主干可继续开发新功能svn copy https://repo/trunk \ https://repo/branches/release_v2.0 \ -m create release branch v2.04. 个人/团队分支大团队隔离工作减少互相干扰但要定期同步主干。四、分支生命周期管理创建分支 定期同步trunk 合并回trunk 删除分支 trunk ─────●──────────────────────────●─────────────────────●──────────────► \ ↑ ↗ \ (merge trunk→branch) / branch ●──────●──────●──────────────────●──────────● 开发 开发 开发 开发完成1. 创建分支svn copy trunk-url branch-url -m 说明 svn switch branch-url # 切换工作副本到分支2. 在分支上开发# 正常 update / commit svn up svn ci -m develop on branch3. 定期同步主干改动到分支关键★最重要的最佳实践分支要定期合并 trunk 的更新避免最后合并时冲突爆炸。# 在分支工作副本中 svn merge https://repo/trunk # 把 trunk 的新改动合进当前分支 svn ci -m sync trunk changes to branch4. 分支合并回主干# 切换到 trunk 工作副本 svn switch https://repo/trunk svn up # 合并分支SVN 1.5 自动跟踪合并历史 svn merge https://repo/branches/feature_axi_dma svn ci -m merge feature_axi_dma into trunk5. 删除已合并的分支svn delete https://repo/branches/feature_axi_dma \ -m remove merged branch删除不丢历史需要时可从历史版本恢复。五、合并Merge的关键技巧1. SVN 1.5 的自动合并跟踪SVN 1.5 起引入mergeinfo属性自动记录已合并的版本避免重复合并svn merge branch-url # 自动合并未合并的部分 svn mergeinfo branch-url # 查看合并状态 svn mergeinfo --show-revs eligible branch-url # 查看待合并版本2. 合并指定版本范围svn merge -r 100:150 branch-url # 合并版本100到150 svn merge -c 120 branch-url # 只合并版本120这一次提交 svn merge -c 120,125,130 branch-url # 合并多个特定版本3. 反向合并撤销某次提交svn merge -c -120 url # 撤销版本120的改动负号 svn merge -r 120:119 url # 等效写法4. 预演合并试运行不实际改动★svn merge --dry-run branch-url # 只显示会发生什么不真正合并强烈建议正式合并前先--dry-run看看影响范围。5. 合并后必检svn status # 查看冲突和改动 # 解决冲突... svn diff # 确认合并结果正确 # 编译/仿真验证后再提交 svn ci -m merge xxx六、Tag 标签最佳实践1. 创建标签里程碑/流片svn copy https://repo/trunk \ https://repo/tags/v1.0_tapeout_20240115 \ -m tag for v1.0 tapeout2. Tag 命名规范建议场景命名示例版本发布v1.0, v2.1.3流片v1.0_tapeout_20240115RTL 冻结rtl_freeze_milestone1回归基线regression_baseline_w123. Tag 铁律⚠️Tag 创建后绝对不要修改Tag 是某一时刻的只读快照修改 tag 会破坏可追溯性。如需基于 tag 改动应从 tag 创建分支。# 从 tag 创建修复分支正确做法 svn copy https://repo/tags/v1.0 \ https://repo/branches/fix_v1.0 \ -m branch from v1.0 for hotfix七、芯片团队特有最佳实践实践说明流片打 Tag每次 tapeout 必须打 tag永久固化版本RTL 冻结 Tag验证/后端介入前冻结 RTL 版本回归基线管理每周/每日回归对应一个 tag/revision便于复现二进制文件锁定库/版图/文档在分支上也要 svn lock分支命名带日期/负责人如 dev_zhang_20240115便于管理大文件慎合并二进制不可 merge分支策略上避免多分支同改一个二进制八、分支管理常见误区与建议误区正确做法长期不合并 trunk定期同步至少每周一次分支存活过久功能完成尽快合并并删除避免僵尸分支直接在 trunk 上做大改动大改动开分支保护主干稳定修改 tagtag 只读要改就从 tag 开分支不写合并说明合并提交注明来源分支和版本范围合并前不 dry-run先 --dry-run 预演合并后不验证合并后编译/仿真通过再提交第二部分SVN 与 Git 命令对照表一、核心概念差异先理解再对照维度SVNGit架构集中式中央仓库分布式每人完整仓库提交直接提交到中央服务器先本地 commit再 push 到远程版本号全局递增整数r12340 位哈希a3f5e9c...离线工作受限需连服务器完全支持分支成本较重服务器端副本极轻量指针暂存区无有staging area最大区别Git 的 commit 是本地操作需要 push 才到远程SVN 的 commit直接到中央服务器。二、基础操作对照操作SVNGit获取仓库svn checkout urlgit clone url更新代码svn updategit pull查看状态svn statusgit status查看差异svn diffgit diff添加文件svn add filegit add file删除文件svn delete filegit rm file移动/重命名svn move a bgit mv a b提交svn commit -m msggit commit -m msg git push查看历史svn loggit log查看文件历史svn log filegit log file逐行作者svn blame filegit blame file三、提交流程对照核心差异SVN两步svn add new.v # 1. 添加新文件 svn commit -m add new.v # 2. 直接提交到服务器Git四步git add new.c # 1. 添加到暂存区 git commit -m add new.c # 2. 提交到本地仓库 git pull # 3. 同步远程合并 git push # 4. 推送到远程仓库SVN 一次 commit Git 的 commit push。四、撤销操作对照操作SVNGit撤销工作区改动svn revert filegit checkout -- filebr或 git restore file撤销所有改动svn revert -R .git checkout -- .br或 git restore .撤销暂存无暂存区概念git reset HEAD filebr或 git restore --staged file撤销某次提交svn merge -c -N .git revert commit回退到旧版本svn up -r Ngit reset --hard commit清理锁定svn cleanup一般不需要五、分支与标签对照操作SVNGit创建分支svn copy trunk branch -m ...git branch name切换分支svn switch branch-urlgit checkout namebr或 git switch name创建并切换svn copy ... svn switch ...git checkout -b name查看分支svn list branches-urlgit branch合并分支svn merge branch-urlgit merge branch删除分支svn delete branch-url -m ...git branch -d name创建标签svn copy trunk tag -m ...git tag name查看标签svn list tags-urlgit tag关键差异SVN 的分支/标签本质是目录拷贝用 copy 命令Git 的分支是轻量指针标签是特定提交的引用。六、查看与比较对照操作SVNGit查看仓库文件内容svn cat urlgit show commit:file列出远程内容svn list urlgit ls-tree branch比较两版本svn diff -r 100:200git diff c1 c2比较分支svn diff url1 url2git diff b1 b2合并预演svn merge --dry-rungit merge --no-commit --no-ff查看合并状态svn mergeinfo urlgit log --merges七、冲突处理对照操作SVNGit冲突标记状态 C状态 UUboth modified解决后标记svn resolve --accept working filegit add file用我的版本svn resolve --accept mine-fullgit checkout --ours file用对方版本svn resolve --accept theirs-fullgit checkout --theirs file八、忽略文件对照SVNsvn propset svn:ignore *.log . svn propset svn:ignore -F ignore_list .Git# 创建 .gitignore 文件写入 *.log *.o build/Git 用.gitignore文件更直观SVN 用svn:ignore属性。九、独有命令无直接对应SVN 独有命令功能Git 类比svn lock/unlock文件加锁独占编辑git lfs lock需 LFSsvn cleanup清理工作副本锁一般不需要svn co 子目录部分检出git sparse-checkout较新Git 独有命令功能SVN 类比git stash临时储藏改动无只能用补丁git rebase变基无git cherry-pick挑拣单个提交svn merge -c N 类似git reflog引用日志无git add -p部分暂存无git push/pull远程同步SVN 自动集中式十、典型工作流对照日常修改提交SVNsvn up # 更新 # 修改文件... svn st # 看状态 svn ci -m fix bug # 提交直接到服务器Gitgit pull # 更新 # 修改文件... git status # 看状态 git add . # 暂存 git commit -m fix bug # 本地提交 git push # 推送到远程创建特性分支开发SVNsvn copy trunk branch -m new feature svn switch branch # 开发、提交... svn switch trunk svn merge branch svn ci -m merge featureGitgit checkout -b feature # 开发、提交... git checkout main git merge feature git push十一、思维方式转换提示如果你习惯 SVN用 Git 要记住如果你习惯 Git用 SVN 要记住commit 是本地的要 push 才上传commit 直接上传到服务器分支是廉价的随便建分支是目录拷贝相对重有暂存区先 add 再 commit没有暂存区add 只针对新文件版本是哈希不是递增数字版本是全局递增整数用 .gitignore 文件用 svn:ignore 属性pull fetch mergeupdate 直接合并十二、命令对照速查表汇总功能SVNGit检出/克隆svn co urlgit clone url更新svn upgit pull状态svn stgit status添加svn addgit add提交svn ci -mgit commit -m git push差异svn diffgit diff日志svn loggit log撤销改动svn revertgit restore删除svn rmgit rm移动svn mvgit mv建分支svn copygit branch切分支svn switchgit switch合并svn mergegit merge打标签svn copy ...tags/git tag作者追溯svn blamegit blame加锁svn lockgit lfs lock总结SVN 分支管理黄金法则trunk 保持稳定随时可编译仿真大改动开分支隔离风险分支定期同步 trunk最重要避免合并地狱合并前 dry-run合并后验证tag 只读流片/发布必打 tag及时删除僵尸分支SVN vs Git 一句话SVN 集中式commit 直达服务器分支是目录拷贝版本号递增适合大文件强管控芯片行业。Git 分布式commit 在本地分支是轻量指针需要 push/pull适合文本代码并行协作软件行业。核心记忆svn commit≈git commit git pushsvn update≈git pull。