Git版本管理:从零开始,用学生项目讲透每个命令

发布时间:2026/8/16 22:13:08
Git版本管理:从零开始,用学生项目讲透每个命令 学校不教Git但实习面试天天问你用过Git吗。网上的Git教程要么讲一堆原理要么假设你在公司团队里工作——可我还是学生没参加过工作那些场景我根本没概念。这篇就用你真正会遇到的项目场景课程设计、个人STM32项目、毕设一步步讲每个命令到底什么时候敲、为什么敲。一、先搞懂Git到底解决什么问题1.1 你一定遇到过这个场景你在做STM32课程设计代码改来改去温度采集.c 温度采集_改.c 温度采集_改2.c 温度采集_最终版.c 温度采集_最终版2.c 温度采集_最终版_真的最终.c 温度采集_打死不改了.c 温度采集_改了之后不工作了_还原.c问题哪个版本是最新的记不清了最终版2改了什么不知道了“改了之后不工作了”——到底改了哪行导致坏的找不出来想回到最终版那个能用的版本但已经覆盖了1.2 Git就是来解决这个的Git 给你的代码拍快照 随时回到任何一个快照快照1: 初始版本能编译 快照2: 加了SHT30驱动能读温度 快照3: 加了OLED显示能显示了 快照4: 改了显示格式 ← 现在在这里如果快照4改坏了一条命令回到快照3。每个快照都能写备注这版改了什么。这就是Git。1.3 面试为什么问Git因为公司里所有代码都用Git管理。你不会Git 进公司第一天连代码都拉不下来。面试官问Git不是考你背命令是确认你进公司能直接干活。二、安装和配置第一次用必看2.1 安装Windows去 https://git-scm.com 下载安装包一路下一步就行。安装完成后右键菜单会多出Git Bash Here。验证安装成功打开Git Bash或cmd输入git--version# 输出类似git version 2.43.0 就说明装好了2.2 第一次使用必须配置装好后告诉Git你是谁每次提交代码会附上你的名字gitconfig--globaluser.name嵌入式阿蔡gitconfig--globaluser.email2680631492qq.com这里的名字和邮箱随便填但建议用真名常用邮箱因为简历上的GitHub链接打开后面试官能看到你的提交记录。验证配置gitconfig--list# 能看到 user.name嵌入式阿蔡 和 user.email... 就对了三、用真实项目手把手走一遍场景你要做一个STM32温湿度检测器个人项目第1步创建项目文件夹# 在电脑上建个项目文件夹mkdirtemp_monitorcdtemp_monitor第2步初始化Git仓库gitinit# 输出Initialized empty Git repository in D:/temp_monitor/.git/这一步做了什么在你的文件夹里创建了一个隐藏的.git文件夹Git就是靠它来记录所有版本的。这个文件夹别删删了所有版本记录都没了。第3步创建.gitignore文件重点什么是.gitignore它是一个文本文件里面写哪些文件不要被Git管理。为什么需要它用Keil开发STM32编译一次会生成一堆文件temp_monitor/ ├── main.c ← 源代码要管理 ├── sht30.c ← 源代码要管理 ├── sht30.h ← 源代码要管理 ├── temp_monitor.uvprojx ← Keil工程文件要管理 ├── main.o ← 编译产物不需要 ├── sht30.o ← 编译产物不需要 ├── main.crf ← 编译产物不需要 ├── temp_monitor.axf ← 编译产物不需要 ├── temp_monitor.hex ← 编译产物不需要 ├── temp_monitor.map ← 编译产物不需要 └── DebugConfig/ ← 编译配置缓存不需要如果把这些编译产物也提交到Git仓库会越来越大几十MB的垃圾文件而且毫无意义——别人下载你的代码重新编译就会生成。怎么创建.gitignore方法1用VSCode/记事本创建推荐新手在项目文件夹temp_monitor根目录下新建一个文件文件名就叫.gitignore注意文件名前面有个点没有后缀。Windows可能提示必须输入文件名这时候文件名输入.gitignore.末尾加个点Windows就会自动改成.gitignore。方法2用命令创建touch.gitignore# Windows的Git Bash支持这个命令# 或者用记事本直接另存为.gitignore里写什么打开.gitignore文件把以下内容粘进去# Keil编译产物 *.o *.d *.crf *.iex *.axf *.hex *.bin *.map *.lst *.htm *.dep *.bak # Keil工程临时文件 *.uvguix.* *.uvgui.* *.scvd *.dbconf DebugConfig/ Listings/ Objects/ RTE/ # J-Link/ST-Link临时文件 JLinkLog.txt *.jdebug # VSCode配置 .vscode/ *.code-workspace # 系统文件 .DS_Store Thumbs.db desktop.ini这些规则是什么意思*.o→ 所有以.o结尾的文件都忽略星号是通配符代表任意文件名*.hex→ 所有.hex文件忽略DebugConfig/→ 这个文件夹整个忽略.vscode/→ VSCode的配置文件夹忽略怎么验证.gitignore生效了gitstatus如果你看到Untracked files: .gitignore main.c sht30.c sht30.h temp_monitor.uvprojx只列出了源代码和工程文件没有.o、.hex这些编译产物说明.gitignore生效了如果你看到.o文件还在列表里可能是你在创建.gitignore之前就已经git add了那些文件。解决办法# 从Git跟踪中移除文件还在电脑上只是Git不管了gitrm--cachedmain.ogitrm--cached*.o重要顺序先创建.gitignore→ 再git add。如果先add了编译产物再加.gitignore已经跟踪的文件不会被自动忽略。第4步第一次提交代码# 把所有文件加入暂存区准备提交的意思gitadd.# 提交-m后面是这次提交的说明gitcommit-m初始化项目STM32温湿度检测器包含SHT30驱动这两个命令是什么意思git add .→ 告诉Git这些文件我改好了准备记录一个快照这个阶段叫暂存区git commit -m 说明→ 正式拍快照存入版本历史为什么分两步这样你可以选择性地提交只提交sht30.c的改动不提交还没写完的main.c。gitaddsht30.c# 只暂存sht30.cgitcommit-m完成SHT30驱动第5步继续开发再次提交你继续写代码加上了OLED显示功能。写完后gitstatus# 看看改了哪些文件# 显示modified: main.c红色表示改了但没暂存gitadd.# 暂存所有改动gitcommit-m添加OLED显示温度湿度实时显示第6步查看历史版本gitlog--oneline# 输出# a3b2c1d 添加OLED显示温度湿度实时显示# 7e8f9a0 初始化项目STM32温湿度检测器包含SHT30驱动每一行前面的a3b2c1d是版本号commit ID想回到哪个版本就用这个号。四、远程仓库把代码传到GitHub/Gitee4.1 为什么要传到网上备份电脑坏了代码还在简历背书GitHub链接放简历上面试官能看你的代码多设备同步宿舍电脑和图书馆电脑都能拉代码4.2 注册并创建仓库去 https://github.com 或 https://gitee.com 注册账号点New Repository新建仓库仓库名填temp_monitor选Private私有或Public公开点创建创建后会给你一个地址类似https://github.com/你的用户名/temp_monitor.git4.3 把本地代码推上去# 关联远程仓库只需做一次gitremoteaddorigin https://github.com/你的用户名/temp_monitor.git# 第一次推送gitpush-uorigin main如果提示输入账号密码GitHub现在要用药TokenPersonal Access Token代替密码。去GitHub Settings → Developer settings → Personal access tokens 生成一个复制下来当密码用。Gitee直接用密码就行。之后每次改完代码提交后只要gitpush就推上去了。4.4 换台电脑继续开发在图书馆电脑上# 把仓库克隆下来gitclone https://github.com/你的用户名/temp_monitor.gitcdtemp_monitor# 改代码...gitadd.gitcommit-m在图书馆修改了显示格式gitpush# 推到网上回宿舍后cdtemp_monitorgitpull# 把网上的最新版本拉下来# 现在本地就是最新代码了五、分支Git最强大的功能5.1 什么是分支用大白话讲分支 平行宇宙。你在写温湿度检测器显示功能正常工作了。现在你想加一个数据存W25Q64 Flash的功能但不确定能不能写好怕改坏了现在能用的版本。不用分支的做法直接改main.c改坏了就完蛋回不去了或者手动备份文件夹。用分支的做法main分支稳定版─── 显示功能完成 ● │ │ 开个新分支去试Flash功能 ▼ feature分支 ────────── 写Flash代码中... │ │ 写好了合并回main ▼ main分支 ───────────── 显示Flash都完成 ●在feature分支上随便折腾main分支的代码完全不受影响。写好了再合并回去写不好直接删掉分支main还是原来那样。5.2 分支实操# 看看现在在哪个分支gitbranch# * main ← 星号表示当前分支# 创建一个新分支并切换过去gitcheckout-bfeature/w25q64# 现在你在feature/w25q64分支了# 在这个分支上写代码...# 假设你写好了Flash读写函数gitadd.gitcommit-m实现W25Q64 Flash读写驱动# 切回main分支代码会变回main的状态Flash代码暂时消失gitcheckout main# 把feature分支的代码合并到maingitmerge feature/w25q64# 合并完了删掉这个分支不需要了gitbranch-dfeature/w25q645.3 什么时候用分支场景分支名建议试一个不确定的新功能feature/xxx修一个bugfix/xxx毕设要改大版本dev或v2个人项目也要用分支别直接在main上改养成习惯进公司无缝衔接。六、救命操作改坏了怎么回退6.1 场景改了代码还没add还在工作区你改了main.c发现改错了想回到改之前gitcheckout -- main.c# main.c 恢复到上一次commit的状态--的意思是撤销工作区的修改。这个命令只能撤销还没git add的改动。6.2 场景已经add了但还没commitgitreset HEAD main.c# 从暂存区撤出来文件改动还在gitcheckout -- main.c# 再撤销改动6.3 场景已经commit了想撤销这次提交# 撤销最近1次提交但保留代码改动软回退gitreset--softHEAD~1# 撤销最近1次提交代码也回到改之前硬回退谨慎用gitreset--hardHEAD~1HEAD~1 “上一个版本”。HEAD~2 上上个版本。--soft保留代码改动相当于只撤销commit--hard连代码一起删真的回去了。6.4 场景想回到3个版本之前看看代码# 不影响当前分支只是穿越回去看看gitcheckout a3b2c1d# 填commit ID的前7位# 看完了回到最新版本gitcheckout main七、团队协作场景进阶面试会问7.1 公司里的Git工作流进公司后团队一般这样用Gitmain生产环境版本不能直接改 └── develop开发分支所有人合并到这里 ├── feature/sensor-driver你负责的传感器驱动 ├── feature/lvgl-ui同事A负责的界面 └── fix/uart-bug同事B在修bug每个人在自己分支上开发开发完合并到develop测试通过后再合并到main发布。7.2 你进公司第一天的流程# 1. 克隆团队仓库gitclone https://github.com/company/project.git# 2. 切换到develop分支gitcheckout develop# 3. 拉取最新代码gitpull# 4. 创建你自己的功能分支gitcheckout-bfeature/my-module# 5. 写代码提交gitadd.gitcommit-mfeat: 实现XX模块# 6. 推送到远程gitpush origin feature/my-module# 7. 在GitHub/GitLab上发起Pull RequestPR让同事review7.3 解决冲突你和同事同时改了main.c你先合并了同事再合并时冲突了gitpull# Auto-merging main.c# CONFLICT (content): Merge conflict in main.c打开main.c会看到HEAD// 你的代码uint8_ttempsht30_read_temp();// 同事的代码floattempget_temperature();feature/colleague HEAD到是你的代码到是同事的代码。你决定保留哪个或合并删掉这些标记符号然后gitaddmain.cgitcommit-m合并main.c解决冲突gitpush八、版本标签给正式版本打标记场景毕设答辩要交最终版# 在当前版本打个标签gittag v1.0.0-m毕设答辩版本温湿度检测器完整版# 推送标签到远程gitpush origin v1.0.0以后想找答辩那天的版本gitcheckout v1.0.0建议每次里程碑都打标签v0.1原型版、v0.5功能完成、v1.0答辩版、v1.1修改版。九、常见踩坑新手必看坑1.gitignore不生效原因先git add了文件后创建的.gitignore。已经跟踪的文件不会被忽略。解决# 从Git跟踪中移除文件还在电脑上gitrm-r--cached.# 重新addgitadd.gitcommit-m更新.gitignore坑2commit message写改了点东西3个月后看git log全是改了点东西、“又改了”、“修复bug”完全不知道每版改了什么。规范写法类型: 具体描述feat: 添加SHT30温湿度驱动 ← feat新功能 fix: 修复UART接收丢字节问题 ← fix修bug docs: 更新README使用说明 ← docs文档 refactor: 重构ADC滤波算法 ← refactor重构坑3编译产物提交了仓库几百MBgit log --oneline # 发现早期commit把.axf .hex都提交了预防项目一开始就建好.gitignore。补救用git rm --cached逐个移除或用 BFG Repo-Cleaner 工具清理历史。坑4在main分支直接改改坏了main分支应该永远是能用的版本。直接在上面改改坏了没法回退到稳定版。正确做法开分支改测好了再合并。坑5git push报错rejectedgitpush# ! [rejected] main - main (fetch first)原因远程有别人推的新提交你本地没有。解决先拉再推gitpull# 先拉取gitpush# 再推送十、速查表日常使用频率最高的5个命令命令什么时候用git status随时看当前状态git add .改完代码准备提交git commit -m 说明记录一个版本git push推到远程仓库git log --oneline查看历史版本完整场景速查我想要…命令开始一个新项目git init→ 建.gitignore→git add .→git commit改了代码想保存版本git add .→git commit -m 说明推到GitHubgit push从GitHub拉最新代码git pull回到上一个版本git reset --hard HEAD~1开新功能不影响主代码git checkout -b feature/xxx合并分支git checkout main→git merge feature/xxx改错了还没addgit checkout -- 文件名打版本标签git tag v1.0.0 -m 说明克隆别人的项目git clone 仓库地址十一、实战练习从零跑一遍打开电脑跟着敲一遍10分钟搞定# 1. 建项目mkdirmy_first_gitcdmy_first_git# 2. 初始化gitinit# 3. 建个.gitignoreecho*.o.gitignoreecho*.hex.gitignore# 4. 写个代码文件echo#include stdio.hmain.cechoint main() { printf(\hello git\); return 0; }main.c# 5. 第一次提交gitadd.gitcommit-mfeat: 初始化项目# 6. 改一下代码echo// 第二次修改main.c# 7. 看看改了什么gitdiff# 8. 提交第二次gitadd.gitcommit-mdocs: 添加注释# 9. 看历史gitlog--oneline# 10. 试着回退到第一个版本gitreset--hardHEAD~1gitlog--oneline# 只剩一条了# 11. 后悔了还能回去reflog找记录gitreflog# 找到刚才的commit IDgit reset --hard 那个ID跑完这11步你已经掌握Git 80%的日常用法了。剩下的就是多用、多踩坑。十二、写在最后Git不是学出来的是用出来的。建议你今天就把现有的STM32项目传到GitHub——简历上多个GitHub链接每次写代码前先git pull写完后git add → commit → push——养成习惯试着用分支开发新功能——体验一下改坏了也不怕的安全感等你习惯了Git你会发现再也不想回到最终版_打死不改_真的最终版.c的日子了。面试官问你用过Git吗你能回答“我的STM32项目都托管在GitHub上日常用分支开发新功能commit message遵循feat/fix/docs规范”——这就比90%的同学强了。相关文章推荐Keil vs VSCode vs STM32CubeIDE嵌入式IDE对比如何阅读Datasheet嵌入式工程师的核心技能作者嵌入式阿蔡 | 一枚准大四的嵌入式菜鸟正在打牢基础记录成长