Git 从入门到团队协作:真正理解 Git,而不是死记命令
前言很多人第一次学习 Git 时都会有一种很奇怪的感觉。命令似乎并不复杂gitaddgitcommitgitpushgitpull看起来就那么几个。但真正开始使用时却总会遇到各种问题文件为什么没有提交成功add 和 commit 到底有什么区别为什么切换分支以后文件不见了为什么会出现代码冲突为什么 push 失败于是很多人慢慢开始觉得Git 很难。其实 Git 真正难的从来不是命令。而是没有理解 Git 的工作逻辑。如果只是机械地背命令那么一旦项目稍微复杂一点就很容易彻底混乱。所以这篇文章不会像很多教程一样疯狂堆命令而是会结合实际开发场景带你真正理解Git 为什么会出现Git 是如何管理代码的Git 的核心工作流程常用命令到底在做什么分支为什么重要团队开发为什么一定离不开 Git看完以后你不仅能知道“怎么用”更能理解“为什么这样用”。一、为什么程序员一定要学习 Git在 Git 出现之前很多开发者管理代码的方式其实非常原始。电脑里经常会出现这样的文件夹项目最终版 项目最终版2 项目最终版_真的最终版 项目最终版_不要再改了项目小的时候似乎还能勉强使用。但随着功能越来越多问题很快就会出现。比如昨天程序还能运行今天改了几行代码以后突然报错想恢复到昨天的状态却不知道哪里改错了再比如团队开发文件被覆盖功能互相影响不知道谁改了什么项目版本越来越乱这些问题本质上都指向同一个需求我们需要一个工具帮我们记录代码历史。而 Git就是为了解决这些问题诞生的。你甚至可以把 Git 理解成代码世界里的“时光机”因为它真的能够让代码回到过去。二、Git 的核心工作流程重点很多人学不会 Git并不是因为命令难。而是没有真正理解 Git 的工作流程。Git 最核心的内容其实只有一句话工作区 → 暂存区 → 本地仓库整个 Git 的运行逻辑几乎都是围绕这三个区域展开的。1、工作区Working Directory工作区其实就是你平时真正写代码的地方。例如app.py main.py user.py这些文件都属于工作区。你新增代码、修改代码、删除代码所有操作都会先发生在这里。简单来说工作区 你正在开发的代码区域2、暂存区Stage这是很多新手最容易迷糊的地方。很多人第一次学习 Git 时都会疑惑为什么不能直接 commit 为什么还需要 add其实原因很简单。Git 希望开发者能够“选择性提交代码”例如你今天同时做了两件事修复登录 Bug开发支付功能但支付功能只写了一半。现在你只想提交登录 Bug 修复这时候gitadd就非常重要。因为它允许你只把需要提交的文件放进暂存区而那些还没写完的功能不会进入版本记录。3、本地仓库Repository只有执行gitcommit-m完成登录功能Git 才会真正生成一个历史版本。所以git add → 准备提交 git commit → 正式保存版本你甚至可以把 commit 理解成给当前代码拍一张“快照”以后无论代码怎么修改都可以回到这次提交时的状态。4、Git 工作流程图真正理解 Git其实记住下面这个流程就够了工作区写代码 ↓ git add ↓ 暂存区准备提交 ↓ git commit ↓ 本地仓库正式版本很多新手真正混乱的地方其实就在这里。三、Git 常用命令与真实开发逻辑理解了 Git 的工作流程以后很多命令其实都会变得非常清晰。这一部分不会只讲命令怎么写。而是会告诉你这些命令在真实开发中到底有什么作用。1、初始化 Git 仓库在使用 Git 管理项目之前需要先初始化仓库gitinit执行以后项目目录里会出现一个隐藏文件夹.git这个目录非常重要。因为里面保存了Git 历史记录分支信息提交版本仓库配置你甚至可以把它理解成Git 的“大脑”2、查看当前仓库状态Git 使用频率最高的命令之一gitstatus它的作用非常简单查看当前仓库状态很多开发者在实际开发时都会频繁执行gitstatus来确认哪些文件被修改哪些文件已经 add哪些文件还没提交3、添加到暂存区gitadd.很多新手会误以为git add 就是提交代码其实并不是。它真正的作用是把修改内容加入暂存区也就是告诉 Git这些代码已经准备提交了但此时还没有真正生成版本记录4、真正提交代码gitcommit-m提交说明这一步才是真正生成历史版本。这里的提交说明非常重要。很多新手喜欢写aaa test 111这种提交信息其实毫无意义。更推荐这种写法修复登录接口报错 完成订单模块开发 优化数据库查询逻辑因为以后查看历史记录时你需要快速知道这次提交到底修改了什么5、查看代码修改有时候你改着改着就忘了自己到底修改了什么。这时候就可以使用gitdiff它会清楚告诉你哪一行发生了变化修改前是什么修改后是什么这个命令在排查 Bug 时非常有用。6、查看历史版本gitlog可以查看详细提交记录。而gitreflog则会记录HEAD 指针的所有移动历史即使你进行了版本回退也依然可以找回来。7、版本回退重点Git 最强大的功能之一就是代码可以回到过去例如gitreset--hard版本号执行以后代码会直接恢复到对应版本。但这里也有一个非常容易踩坑的地方gitreset--hard会直接丢弃当前修改。所以没有 commit 的代码不要随便 hard reset。四、Git 文件状态与常见问题很多新手第一次使用 Git 时会发现终端里出现红色绿色其实这些颜色本质上是在提示文件状态。1、红色表示文件已经修改 但还没有 add也就是文件仍然停留在工作区2、绿色表示文件已经 add 但还没有 commit也就是文件已经进入暂存区新手最容易犯的错误很多人修改代码以后忘记 commit。然后直接切换分支。最后导致文件混乱修改丢失分支冲突所以一定要养成一个习惯修改代码以后 及时 add 和 commit五、Git 最强大的功能分支开发真正让 Git 强大的其实并不是版本回退。而是Branch分支很多人第一次接触分支时会觉得特别抽象。其实你可以简单理解成一份独立的代码副本1、为什么需要分支假设现在项目已经上线。但产品经理突然提出了一个新需求。如果你直接在主代码上开发风险会非常大。因为新功能可能影响线上系统。于是 Git 提供了分支机制main → 稳定版本 dev → 开发版本这样即使开发失败也不会影响线上代码。这就是分支真正的意义隔离风险。2、常用分支命令查看分支gitbranch创建分支gitbranch dev切换分支gitswitch dev创建并切换分支gitswitch-clogin合并分支gitmerge dev3、分支结构示意图main ├── dev │ ├── login │ ├── order │ └── payment真实开发中每个功能通常都会单独开发。这样能够避免不同功能互相影响。六、为什么会出现代码冲突很多新手第一次看到 Git 冲突时都会慌。但实际上冲突并不可怕它产生的原因通常只有一个两个人同时修改了同一部分代码。例如你修改name张三同事修改name李四Git 无法判断应该保留谁。于是就会出现 HEAD 当前代码 别人代码 dev看到这些符号不要慌。你只需要手动保留正确代码删除特殊符号再次 add 和 commit即可解决。七、远程仓库与团队协作前面学习的内容其实都属于本地 Git但真实开发中一定会涉及多人协作。于是就需要远程仓库常见平台GitHub适合开源项目Gitee国内访问速度更快GitLab很多公司内部使用官方网站GitHub 官方网站Gitee 官方网站GitLab 官方网站1、常用远程仓库命令添加远程仓库gitremoteaddorigin 仓库地址推送代码gitpush origin main第一次推送通常需要gitpush-uorigin main拉取代码gitpull origin main克隆项目gitclone 仓库地址2、一个真实团队开发流程真实开发其实更像这样1. 上班先 pull 最新代码 2. 创建自己的功能分支 3. 开发功能 4. git add 5. git commit 6. git push 7. 提交 Merge Request 8. Code Review 9. 合并到主分支当项目开始多人协作以后Git 的意义才会真正体现出来。因为它不仅是在管理代码。更是在管理团队协作流程八、如何真正学会 Git很多人学习 Git 时总喜欢疯狂背命令。但真正重要的从来不是命令本身。而是理解 Git 工作流程理解版本控制思想理解分支开发模式理解团队协作流程学习 Git 最好的方式从来不是死记硬背。而是自己创建仓库自己提交代码自己创建分支自己制造冲突自己解决冲突很多人刚开始学习 Git 时都会被各种命令吓到。但真正工作以后你会发现Git 从来不是为了增加开发难度。恰恰相反。它是在项目越来越复杂时帮助程序员建立一种可回退、可协作、可追踪的开发习惯。而这也是程序员工程化思维的一部分