1、Git基础概念:版本控制是什么、Git与SVN的区别、Git的工作流程

各位ADAS团队的同事,大家好。我是你们的老朋友,一个在ADAS领域摸爬滚打了七八年的工程师。今天咱们开始聊Git,这个在团队协作里几乎绕不开的工具。

说实话,我刚入行那会儿,团队还在用U盘拷代码,文件名后面跟着“_最终版”、“_最终版2”、“_打死不改版”。那叫一个混乱。后来项目越来越复杂,尤其是ADAS这种涉及感知、规划、控制多个模块协同的系统,没有版本控制,简直就是灾难。所以,Git不是锦上添花,是生存必需品。

版本控制是什么?

版本控制,说白了就是给你的代码拍“快照”。

你想想看,写代码就像盖楼。今天你砌了一面墙,明天觉得不好看想拆了重砌。如果没有记录,你只能凭记忆复原。版本控制就是帮你记录每一块砖是怎么码上去的,还能随时回到任意一个施工状态。

我个人习惯把版本控制理解成“后悔药”+“时光机”。

  • 后悔药:改错了?没关系,回退到上一个正常版本。
  • 时光机:想看看上周三提交的代码长什么样?一键切换。

在ADAS开发中,这个功能尤其重要。比如你调整了一个车道保持的参数,结果导致车辆在弯道里画龙。这时候你不需要从头排查,直接回退到昨天的版本,问题就解决了。嗯,就是这么直接。

核心要点:版本控制不是管理“文件”,而是管理“文件的变更历史”。

Git与SVN的区别

很多老项目还在用SVN。我最早接触的也是SVN,但后来全面转向了Git。为什么?

我举个例子你就明白了。

SVN是中央集权制。所有代码都放在一个中央服务器上。你要提交代码,必须先联网连上服务器。如果服务器挂了,或者你在地下车库没信号,那就只能干瞪眼。

Git是分布式联邦制。每个开发者的电脑上都有一个完整的代码仓库。你可以在飞机上、在隧道里、甚至在荒郊野外,照样提交代码、查看历史、创建分支。等有网了,再同步到远程仓库。

我记得有一次,我们团队去一个封闭的测试场做ADAS路试。那个地方信号极差,SVN的同事完全没法工作。而我们用Git的,在车里就把代码改完了,晚上回酒店一推送,完美。

具体区别,我整理了一个表格:

对比维度 Git SVN
架构 分布式,每个本地都是完整仓库 集中式,依赖中央服务器
离线工作 完全支持,无网络也能提交 不支持,必须联网
分支管理 轻量级,创建/合并分支极快 重量级,分支操作慢且占用空间大
性能 大部分操作在本地,速度快 依赖网络,大文件操作慢
数据存储 存储快照(snapshot) 存储差异(delta)

我的建议:新项目直接上Git。如果公司还在用SVN,可以考虑用Git-SVN桥接工具过渡。但长远看,Git是趋势。

Git的工作流程:四个核心区域

Git的工作流程,围绕四个区域展开。很多新手搞混,其实很简单。

你想象一下你在厨房做饭:

  • 工作区(Working Directory):就是你的案板。你在这里切菜、配菜,所有修改都发生在这里。对应到代码,就是你电脑上看到的文件目录。
  • 暂存区(Staging Area / Index):这是你的备菜盘。你把切好的菜放进盘子里,准备下锅。对应到Git,就是git add之后,文件进入暂存区,但还没真正提交。
  • 本地仓库(Local Repository):这是你的冰箱。菜做好了,放进冰箱保存起来。对应到Git,就是git commit之后,代码被永久记录在本地仓库。
  • 远程仓库(Remote Repository):这是你邻居家的冰箱。你把自己冰箱里的菜复制一份,放到邻居家,以防自己家冰箱坏了。对应到Git,就是git push到GitHub、GitLab等远程服务器。

流程就是:工作区修改 → 暂存区准备 → 本地仓库提交 → 远程仓库推送

我刚开始用Git时,总觉得暂存区是多余的。直接提交不行吗?后来在ADAS项目中,我经常需要同时改多个文件,但只想把其中一部分提交。比如我改了感知模块的代码和规划模块的代码,但感知模块还没测完,我只想先提交规划模块的改动。这时候暂存区就派上用场了——我可以只git add规划模块的文件,然后提交。

关键命令对应关系:

工作区 → 暂存区:git add <文件>
暂存区 → 本地仓库:git commit -m "提交信息"
本地仓库 → 远程仓库:git push
远程仓库 → 本地仓库:git pull

避坑指南:我曾经犯过一个低级错误——在没git add的情况下直接git commit。结果发现提交了个空。记住,git commit只提交暂存区里的内容,工作区的修改如果不git add,是不会被提交的。

还有一个常见的误解:很多人以为git pull就是下载代码。其实它包含两步:git fetch(从远程拉取最新数据) + git merge(合并到本地分支)。我建议新手先分开用这两个命令,等熟悉了再直接用git pull。为什么?因为git pull自动合并,万一有冲突,你可能一脸懵。而git fetch只是看看远程有什么变化,不会动你的本地代码,安全得多。

好了,这一章的基础概念就讲到这里。记住这四个区域和它们之间的流转关系,后面的内容都会建立在这个基础上。下一章,咱们聊聊分支策略——在ADAS团队里,怎么用分支管理好感知、规划、控制这些并行开发的模块。