尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Django + Vue电商项目第003讲:Git规范|分支模型、Commit约定与.gitignore

发布时间:2026/9/24 17:54:41

资讯中心
01
ARTICLE

Django + Vue电商项目第003讲:Git规范|分支模型、Commit约定与.gitignore

Django + Vue电商项目第003讲:Git规范|分支模型、Commit约定与.gitignore
本讲核心让你从「会git add/git commit/git push」升级到「理解Git三区模型与分支策略能写出团队认可的Commit」。上一讲装好的环境这一讲把它装进Git仓库。从此每一讲对应一个lecture/0NNtag代码可追溯、可复现、可回滚。建议先点赞 收藏 关注配SSH Key时随时回查。一、为什么这篇技术文不讲代码而讲Git很多新人觉得Git就是「代码备份工具」会用add/commit/push三件套就够了。这会改变你的看法——Git在本专栏里承担三个不可替代的职责。第一可复现机制。每个读者最痛的点是「代码跑不起来」。本专栏的核心承诺之一是你跟着做到一半发现跑不动了可以git checkout lecture/00N回到该讲结束时的代码状态完全相同的代码、完全相同的目录结构。这背后靠的是N次规范commit和对应的tag。第二协作语言。你迟早要和别人一起写代码——同事、合伙人、开源贡献者。git log是一片会说话的森林Commit信息是给未来的你和别人看的笔记分支是隔离风险的围栏PR是讨论设计的地方这些规范不是装饰是工程默契。第三面试基本功。git rebase和git merge的区别、git reset和git revert的取舍、cherry-pick怎么用——这些是中级工程师面试必问。本讲一次讲透。所以这一讲只讲Git不写一行业务代码。但它比你想象的值钱。二、Git三区模型理解工作流的关键很多人用Git出问题是因为没分清三个区。三个区是什么工作区Working Directory你能在文件夹里看到的文件编辑器正在编辑的版本暂存区Stage / Index一个虚拟的区域git add之后改动从这里等commit版本库Repository.git/目录存放所有历史 commit三区流转图用三个命令验证cd~/workspace/shopxechoHello ShopXREADME.md# 此时工作区有 README.mdgitstatus# On branch main# Untracked files:# README.mdgitaddREADME.md# 此时文件在暂存区gitstatus# Changes to be committed:# new file: README.mdgitcommit-mdocs: 初始化项目 README# 此时文件在版本库gitstatus# nothing to commit, working tree clean几个核心命令的精确含义git diff工作区 vs 暂存区还没add的改动git diff --staged暂存区 vs 版本库已add但还没commit的改动git restore file丢弃工作区改动git restore --staged file把暂存区改动撤回到工作区git reset --soft HEAD~1撤销commit但保留暂存区git reset --mixed HEAD~1撤销commit撤回到工作区git reset --hard HEAD~1撤销commit连同工作区一起回滚——慎用黄金法则git reset --hard是Git最有破坏力的命令之一。运行前先git status看看有什么未保存的改动否则改没了找不回。补充git checkout在新版Git里已拆分为git switch切分支和git restore恢复文件。本专栏统一使用新命令更清晰、更安全。三、分支模型main / develop / feature/*本专栏约定的分支模型来自Git Flow的精简版去掉了hotfix / release之类的复杂分支。三个分支的职责分支用途谁来推命名main永远可发布的稳定分支主理人固定develop日常开发主分支全员固定feature/lecture-0NN-xxx每讲一个特性分支作者本人见下命名约定每讲开始时从develop拉一个特性分支gitswitch develop# 如果原本没有develop分支使用git switch -c developgitpullgitswitch-cfeature/lecture-003-git-speclecture-003是讲次号git-spec是该讲主题的简短英文。整列示例feature/lecture-001-introfeature/lecture-002-env-setupfeature/lecture-003-git-specfeature/lecture-004-frontend-scaffoldfeature/lecture-005-backend-scaffold分支流向图每次feature合并到develop删除feature分支每 10 讲把develop合并到main并打 tag。四、合并策略rebase vs merge新人最容易问的feature分支合并到develop时用rebase还是merge推荐答案squash merge# feature 分支开发完合并到 developgitswitch developgitmerge--squashfeature/lecture-003-git-specgitcommit-mfeat: 第 003 讲 Git 与协作规范--squash把特性分支上所有commit合并成1个保留在develop的history里。这样develop历史清爽每讲一个commit。各种合并方式对比场景推荐方式原因feature → developsquash merge保持develop线性每讲一个commitdevelop → mainmerge commit不带--squash保留分支历史能清楚看到临时同步develop最新代码到featurerebase让feature同步最新代码提交历史保持线性撤销某次commitgit revert hash撤销但不删历史安全改写commit信息git rebase -i HEAD~3交互式rebase合并/重写/删除最近几次commit千万不要做的事❌不要把git push --force用在main或develop上——会覆盖他人提交协作大忌❌不要在没有备份的情况下git reset --hard——改没了❌不要把node_modules、.env、数据库文件commit进去——下一节讲五、Conventional Commits规范Commit 信息是给未来的你和同事看的。git log --oneline输出的是项目演化的简史质量差的commit等于乱写日记。格式type(scope): subject body footertype必填commit类别scope可选影响范围如backend/frontend/docs/depssubject必填一句话描述祈使句、不大写首字母、不加句号常用 typetype含义示例feat新功能feat(backend): 加入商品列表分页接口fix修 bugfix(frontend): 修复SKU选择器状态丢失docs仅改文档docs(readme): 更新封面图style格式空格、分号style(frontend): 统一缩进2空格refactor重构非新功能、非修 bugrefactor(backend): 抽离UserService层test加测试test(backend): 补订单关闭单元测试chore杂项依赖、配置chore(deps): 锁定Django 5.2.xperf性能优化perf(search): 商品搜索加全文索引本专栏commit规范每讲至少1个commit复杂讲可能3-5个。Commit信息要带讲次号方便追溯# 推荐gitcommit-mfeat(backend): 加入商品列表分页接口# 也可gitcommit-mfeat(backend): 商品分页page/page_size 必填最多100进阶commitlint husky可选想让 commit 规范强制执行可以装commitlinthusky做提交钩子pnpmadd-Dcommitlint/cli commitlint/config-conventional husky npx husky initechopnpm dlx commitlint --edit \$1.husky/commit-msg本专栏不强制用这个工具但如果你团队人多推荐加。六、SSH Key配置git push到GitHub走HTTPS还是SSH用SSH——配置一次终身受益免去每次输密码。生成SSH Keyssh-keygen-ted25519-Cyouremail.com连按3次回车用默认路径、不设密码。生成两个文件~/.ssh/id_ed25519—— 私钥绝对不能泄漏~/.ssh/id_ed25519.pub—— 公钥要给GitHub把公钥加到GitHubcat~/.ssh/id_ed25519.pub# 复制整段输出打开GitHub → Settings → SSH and GPG keys → New SSH key → 粘贴 → 保存。验证连接ssh-Tgitgithub.com# 输出Hi yourname! Youve successfully authenticated...如果看到这行说明SSH配置成功。SSH Agent重要macOS / Linux 默认不会自动加载Key每次新终端都要ssh-add很烦。配置自动加载# macOS / Linuxcat~/.ssh/configEOF Host github.com AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/id_ed25519 EOF# macOS 还要ssh-add --apple-use-keychain ~/.ssh/id_ed25519Windows (WSL 2) 如果装了ssh-agent服务通常不用额外配置如果没有可以手动eval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519。七、.gitignore模板.gitignore决定哪些文件不进版本库。写错会出现两类事故泄漏事故把.env含数据库密码commit进去 → 立刻轮换密钥污染事故把node_modules10000 个小文件commit 进去 → 仓库暴涨到200MBclone慢到哭本项目专用.gitignore放到shopx/.gitignore注意前端和后端是两个独立的目录但本专栏单仓库monorepo根目录放一份即可# # Python / Django # __pycache__/ *.py[cod] *$py.class *.so .Python .venv/ venv/ env/ *.egg-info/ .pytest_cache/ .coverage htmlcov/ db.sqlite3 db.sqlite3-journal *.sqlite3 # Django *.log local_settings.py /staticfiles/ /media/ # # Node / Vue # node_modules/ dist/ .vite/ *.local .pnpm-store/ # # IDE / 编辑器 # .vscode/ .idea/ *.swp *.swo *.iml .DS_Store Thumbs.db # # 环境变量 / 密钥 # .env .env.local .env.*.local *.pem *.key # # 文档构建 # docs/_build/ *.pdf !docs/**/*.pdf几个细节.env必须忽略本项目后面会装python-decouple从.env读数据库密码。这个文件一旦commit上去密码就在GitHub历史里永久可见了。万一commit进去了gitrm--cached.env# 然后立刻轮换所有泄漏的密钥node_modules/一定忽略几百MB的依赖文件跟package.json重复没必要入库。.vscode/可选团队都用VSCode时可以入库共享配置但个人设置如窗口位置不共享建议忽略。不要忽略package-lock.json或pnpm-lock.yaml锁定依赖版本用的必须入库。/staticfiles/是Djangocollectstatic的产物部署时会重新生成不用入库。验证.gitignore生效gitstatus# 应该看不到 .env / .venv / node_modulesgitcheck-ignore-v.env# 输出.gitignore:53:.env .env# 第二列是 .gitignore文件路径和行号八、第一次commit与推送cd~/workspace/shopx# 初始化使用 -b main一步到位gitinit-bmain# 加 .gitignore# 用本讲第七节的内容自己创建 .gitignoregitadd.gitignoregitcommit-mchore: 初始化项目 .gitignore# 加 READMEcatREADME.mdEOF # ShopX 星选商城 从零到上线的全栈电商项目。 详见CSDN专栏《Django Vue电商项目》。 EOFgitaddREADME.mdgitcommit-mdocs: 添加项目 README# 推送到GitHub# 1. 在GitHub网页上点New repository名字shopx**不要勾选README**# 2. 复制仓库URLSSH形式gitremoteaddorigin gitgithub.com:yourname/shopx.gitgitpush-uorigin main⚠️常见坑GitHub创建仓库时如果勾选了「Add a README」本地git push会冲突。两种解法① 取消勾选②git pull origin main --rebase后再push。九、课时tag体系本专栏一个核心承诺是「可追溯」。靠的就是课时tag。规则每讲结束打1个taglecture/0NNNN是讲次号补零便于排序每10讲合并到main后打里程碑tagv0.1v0.2v0.3…专栏结束打v1.0——全专栏毕业打tag的命令# 如果没有develop分支需要创建developgitswitch-cdevelop# 推送到远端建立追踪关系gitpush-uorigin developgittag lecture/003gitpush origin develop--tags读者复现gitclone gitgithub.com:yourname/shopx.gitcdshopxgitfetch--tagsgitswitch--detachlecture/003# 此时工作区是第3讲结束时的状态新版Git中git checkout tag会进入detached HEAD 状态。用git switch --detach更语义化效果一样。tag是只读的commit才是可改的新读者经常问我看到你的lecture/005标签能不能从005跳到028能但不能「跳到028的代码状态」——lecture/005只代表第5讲结束时的快照。你想从028开始可以git switch --detach lecture/028直接进入第28讲git switch main git pull获取最新代码但main不一定每讲都打tag习惯用develop十、本讲作业配置SSH Key并验证ssh -T gitgithub.com成功创建GitHub仓库shopx不要勾选 README本地初始化仓库 提交.gitignore 提交README.md 推送到main从develop建特性分支feature/lecture-004-frontend-scaffold为下一讲做准备故意commit一次脏的commit写git commit -m update然后用git rebase -i HEAD~2改写commit信息——体验交互式rebase十一、常见报错速查表报错原因解决Permission denied (publickey)SSH Key没配 / 没加到ssh-agenteval $(ssh-agent -s)ssh-add ~/.ssh/id_ed25519error: failed to push some refs to ...远端有本地没有的commitgit pull --rebase origin main后再pushgit tag看不到别人打的tag没拉taggit fetch --tagscommit信息被commitlint拒绝不符合Conventional Commits规范改写subject形如feat(scope): 描述.env文件意外被commit第一次commit前没加.gitignoregit rm --cached .env然后提交并立即轮换所有密钥fatal: not a git repository当前目录没初始化cd到正确目录或git init -b mainCONFLICT (content): Merge conflict in xxx合并冲突打开文件找 HEAD标记手动解决后git addgit commit最后Git规范是工程默契不是形式主义如果你跟着敲完评论区打卡一句第003讲签到SSH Key已配置仓库已推送点赞让更多正在学Git的人看到收藏配SSH Key、写.gitignore时随时回查关注追更不迷路我们下期见。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。