1. 这不是Git教程,是“能立刻用起来”的指令速查手册
你有没有过这种时刻:刚在团队群里被@,说“主干分支被误提交了,快回滚”,你手指悬在键盘上,脑子里却只浮现出git push和git pull两个词?或者写完代码想提交,输完git commit -m "fix"回车后突然卡住——忘了加-a还是该先add?又或者git status满屏红色,你盯着那行modified: src/utils/date.js,却不敢动,怕一不小心就把同事昨天写的时区逻辑删了?
这本手册不讲“分布式版本控制的哲学”,也不画“工作区→暂存区→本地仓库→远程仓库”的四层抽象图。它只做一件事:把Git最常踩的坑,变成你手指肌肉记忆里的10个动作。核心关键词就三个:手把手、图文并茂、10分钟——意味着每一步操作都配真实终端截图(文字描述还原),每个指令都标注“什么场景下必须用”“不用会怎样”,所有解释都用你日常写代码时的真实语境:比如git stash不是“保存未提交更改”,而是“当你正改着登录页,产品经理突然甩来一个紧急线上bug,你得先把手里没写完的按钮样式藏起来,修完bug再拿出来接着调”。
适合谁?刚从培训班结业、第一次进真实项目组的新人;转岗做前端/测试/运维,但Git只停留在clone+pull的半熟手;甚至是有三年经验、但每次遇到rebase就默默点开Stack Overflow搜“如何放弃当前rebase”的老手。只要你打开终端时还会犹豫3秒该敲什么,这篇就是为你写的。它不追求“全”,而追求“准”——只覆盖你每天高频遇到的10个指令,但每个都拆到终端光标闪烁的位置。
我带过的某高校实训项目里,23个学生用同一套Vue模板开发,前三天平均每人每天要找助教问3次Git问题。后来我把这些指令打印成A4纸贴在工位右上角,配合终端实时截图标注,一周后Git相关提问归零。这不是因为学生变聪明了,而是把模糊的“应该怎么做”,变成了确定的“就按这三步敲”。现在,我们直接进入第一块硬骨头:怎么让Git记住你改了什么,又不急着把它塞进历史记录里。
2. 指令设计逻辑:为什么只选这10个?它们如何构成你的日常操作闭环
2.1 不是“最全”,而是“最痛”——从真实协作断点反推指令优先级
Git指令有上百个,但90%的开发者80%的时间只用其中10个。这个数字不是拍脑袋定的,而是基于某跨平台系统开发团队连续6个月的终端日志分析:他们抓取了所有成员执行git命令的频次、错误率、重试次数,再结合每日站会中“Git卡点”反馈,最终锁定这10个指令。它们共同构成一个闭环:从改代码开始,到把改动安全送达远程仓库结束。
为什么git add排第一?因为它是整个流程的“闸门”。很多新人以为git commit能直接提交所有修改,结果发现git status里一堆红色文件根本没进提交记录。真相是:Git故意把“标记待提交文件”和“生成提交快照”拆成两步。这就像你去超市结账——add是把商品放进购物篮(暂存区),commit才是刷卡付款(生成快照)。篮子不装满,收银机根本不认。我们选它的理由很实在:它是唯一一个能让你看清“到底哪些文件会被提交”的指令。git status告诉你改了什么,git add让你决定哪些改动能进这次提交。漏掉它,后面所有操作都是空中楼阁。
为什么git checkout和git switch并列?因为这是Git版本切换的“双生指令”。checkout是老将,功能多但语法混乱(切分支、恢复文件、丢弃修改全靠它);switch是新兵,专精切分支,命令干净利落。我们保留两者,不是为了教历史,而是解决现实困境:你用的旧版Git(比如CentOS 7默认的1.8.3)不支持switch,但新项目文档全写git switch main,你照着敲报错。所以这里必须讲清:git checkout -b new-feature等价于git switch -c new-feature,但git checkout -- file.js(丢弃单个文件修改)没有switch对应命令——这时候你只能用老将。
为什么git log --oneline --graph --all这么长一串参数排进TOP10?因为它是“理解团队协作状态”的唯一窗口。新人常问:“为什么我的分支看不到同事的提交?”答案往往藏在这条命令的输出里。--oneline压缩显示(避免满屏哈希值),--graph画出分支合并线(直观看到feature/login是怎么并入develop的),--all拉取所有分支记录(否则默认只显示当前分支)。少一个参数,你就可能误判代码归属。
提示:别被“10分钟”误导——这10个指令不是让你10分钟学会Git,而是让你10分钟内能处理90%的日常协作卡点。真正的掌握,在于反复在真实项目里用它们“救火”。
2.2 每个指令都绑定一个“不可跳过的前置条件”
Git所有“诡异行为”的根源,几乎都来自忽略前置条件。比如git push失败,90%的情况不是网络问题,而是你没确认当前分支是否已关联远程分支。我们给每个指令强制绑定一个检查项:
git add前必做:git status -s(短格式状态,一眼扫清所有修改)git commit前必做:git diff --cached(预览即将提交的内容,防止误提调试代码)git push前必做:git branch -vv(看当前分支是否显示[origin/main]这样的远程追踪信息)
这些检查不是多此一举。某次某公司上线前,开发人员直接git push origin main,结果推送到了测试环境的origin,因为他的本地main分支关联的是测试服务器而非生产服务器。如果他习惯性先敲git branch -vv,终端会清晰显示main 7a2b3c [test-origin/main],那个test-origin就是预警信号。
2.3 拒绝“黑盒式教学”:每个参数背后都有血泪教训
为什么git reset --hard HEAD~1比git reset HEAD~1危险十倍?因为--hard会同时重置工作区、暂存区、HEAD指针,而HEAD~1代表“上一个提交”。这意味着:你刚写的50行代码,连同git add进暂存区的改动,全被物理删除。某导师带的学生曾用这条命令回滚一个误提交,结果发现本地所有未提交的修改也消失了——他忘了自己前一天改的登录接口还没add,那些代码就永远留在了硬盘的某个扇区里。
所以手册里所有带--hard的指令,都强制要求你先做三件事:
git status确认当前无未跟踪文件(避免误删新文件)git log --oneline -5看最近5次提交哈希(记下HEAD~1对应的哈希,万一错了还能git reset --hard <哈希>找回)- 对着终端截图自言自语:“我要删掉的是上一次提交,不是上上周的”。
这不是矫情,是把Git从“命令行工具”变成“协作保险丝”。
3. 核心指令详解:从终端输入到结果验证,每一步都附真实场景
3.1git status:你的代码健康体检报告(不是可选项)
这是你每天打开终端后该敲的第一条命令,没有之一。它不产生任何变更,但告诉你“此刻代码库的状态”。很多人跳过它,直接git add .,结果把.env配置文件、node_modules缓存目录全塞进提交——后者会导致仓库体积暴涨,前者可能泄露数据库密码。
正确姿势:
$ git status -s M src/components/Button.vue ?? docs/api.md A package-lock.jsonM(Modified):文件被修改但未add,比如你改了按钮组件的样式但没执行git add??(Untracked):全新文件,Git完全不认识,比如刚写的API文档A(Added):已add进暂存区,下次commit就会包含它
关键细节:
-s参数(short format)是刚需。不加它,你会看到大段英文描述:“On branch main / Your branch is up to date... / Changes not staged for commit:”,信息密度低且易读错。-s把所有信息压缩成两列:第一列是暂存区状态(A/M/D),第二列是工作区状态(M/??),一眼定位问题。- 如果看到大量
??,别急着add。先用git check-ignore -v docs/api.md检查是否被.gitignore规则拦截——某次某实验室项目因.gitignore里写了docs/,导致API文档始终无法提交,排查半小时才发现是忽略规则太宽泛。
实操心得:
我习惯在VS Code终端里固定一个分屏,每写完一个功能模块就敲一次git status -s。如果输出为空,说明你可能忘了git add;如果全是M,说明你还没add;如果出现??且是你需要的文件,立刻git add <文件名>。这个动作像程序员的“洗手步骤”,看似多余,实则过滤掉80%的低级失误。
3.2git add:精准控制“哪些改动进入历史”
git add的核心价值不是“添加文件”,而是建立工作区与暂存区的精确映射。新手常犯的错是git add .(点号代表当前目录所有文件),这就像把整个购物车推进收银台,不管里面有没有过期牛奶。
分场景操作:
- 只添加特定文件:
git add src/utils/date.js
适用场景:你只改了日期工具函数,其他文件是同事的代码,不想混在一起提交。 - 添加某类文件:
git add "**/*.vue"(注意引号,防止shell提前解析)
适用场景:重构了所有Vue组件,但JS工具函数没动,用通配符精准捕获。 - 交互式添加:
git add -p
这是高手必备。它把每个文件的修改拆成“小块”(hunk),逐块询问:“把这块加入暂存区吗?(y/n)”
适用场景:你改了一个函数,但不小心在调试时加了@@ -12,4 +12,4 @@ export default { methods: { - formatDate() { return new Date().toISOString(); } + formatDate() { return dayjs().format('YYYY-MM-DD'); } } } Stage this hunk [y,n,q,a,d,s,e,?]? yconsole.log,-p模式能让你只add函数主体,跳过调试语句。
避坑指南:
git add -A(All)和git add .的区别:前者会跟踪新文件、更新已跟踪文件、删除已删除文件;后者只处理当前目录及子目录,且不会处理已删除文件。某次某公司部署脚本因add .没同步删除的旧配置文件,导致服务启动失败。- 如果
git add后想撤销:git restore --staged <文件名>(Git 2.23+)或git reset HEAD <文件名>(旧版)。注意,这只是把文件从暂存区移出,工作区修改依然存在。
3.3git commit:生成不可篡改的“时间胶囊”
git commit不是“保存代码”,而是创建一个带有时间戳、作者信息、完整文件快照的永久记录。它的核心参数只有两个:-m(message)和-a(all)。
为什么-a是双刃剑?git commit -a -m "update login logic"等价于自动执行git add所有已跟踪文件,再提交。好处是快;坏处是它会把你忘记add的临时调试代码(比如console.log('debug'))一起打包进历史。更糟的是,它对新文件(??状态)完全无效——你得手动add。
专业做法:
- 先
git status -s确认待提交文件 git add精准选择(不用-a)git commit -m "feat(login): add password strength validation"- 前缀
feat表示新功能,login是模块名,冒号后是具体行为。这种规范让git log能快速过滤:git log --oneline --grep="feat(login)"。
- 前缀
参数深挖:
--amend:修正上一次提交。比如你刚commit完发现message写错了,或漏add了一个文件,直接git commit --amend -m "correct message",它会用新提交替换旧提交(哈希值改变,但逻辑上是“编辑”)。--no-edit:配合--amend使用,只改内容不改message。某次某开发者用--amend补加文件后,终端弹出vim编辑器让他改message,他慌乱中退出,结果提交被取消——用--no-edit就能跳过编辑器。
3.4git log:读懂团队协作的“交通地图”
git log的默认输出是信息黑洞:满屏哈希、作者、日期、message,看不出分支关系。我们必须用参数把它变成可视化地图。
黄金组合:
git log --oneline --graph --all --simplify-by-decoration--oneline:每提交一行,哈希缩写+message--graph:用ASCII字符画分支线(*是提交点,|是父提交,/和\是分支合并)--all:显示所有分支(包括远程分支origin/main)--simplify-by-decoration:只显示有标签(tag)或分支头(branch head)的提交,过滤掉中间无意义的合并点
真实截图还原:
* 9f3a1b2 (HEAD -> feature/login, origin/feature/login) add login form validation | * 7c8d2e1 (origin/develop) merge feature/user-profile into develop | |\ | | * 5a1b3c4 (feature/user-profile) implement avatar upload | |/ | * 3d4e5f6 refactor api service layer |/ * 1a2b3c4 (origin/main, main) release v2.1.0解读:当前在feature/login分支,它基于origin/develop的最新提交(7c8d2e1)创建;develop分支刚合并了feature/user-profile;main分支是上个版本发布点。如果你要向develop提交代码,就得确保你的feature/login是从7c8d2e1之后拉出的分支。
效率技巧:
git log -p <文件名>:查看某文件的所有修改历史,定位谁在什么时候改了哪行代码。git log --author="zhang" --since="2 weeks ago":查张工最近两周的提交,用于代码审查分工。
3.5git checkout/git switch:安全切换“代码时空”
切换分支的本质,是让工作区文件瞬间回到另一个提交点的状态。checkout是万能钥匙,switch是专用钥匙。
git switch(推荐新手):
- 创建并切换:
git switch -c feature/new-ui(等价git checkout -b feature/new-ui) - 切换已有分支:
git switch develop - 切回上一个分支:
git switch -(短横线,不是减号)
git checkout(兼容旧环境):
- 切分支:
git checkout develop - 恢复单个文件到上次提交:
git checkout HEAD -- src/App.vue(注意双横线--,它告诉Git后面是文件名不是分支名) - 丢弃所有未提交修改:
git checkout .(点号代表当前目录,慎用!)
致命陷阱:git checkout <分支名>和git checkout <文件名>用同一个命令,但行为天壤之别。如果你在feature/login分支,执行git checkout src/utils/date.js,Git会把date.js恢复成feature/login分支最后一次提交的状态——而不是main分支的。某次某同学想“看看main分支的date.js长啥样”,结果执行后发现自己的修改没了,因为checkout默认从当前分支恢复。
安全替代方案:
- 查看其他分支的文件:
git show main:src/utils/date.js(不改变工作区) - 临时查看:
git worktree add ../temp-main main,在新目录里检出main分支,完全隔离。
3.6git pull:同步远程变更的“双步协议”
git pull=git fetch+git merge。很多人只知其一,不知其二,导致冲突频发。
为什么不能跳过fetch?fetch只是下载远程分支的最新提交信息到本地(存为origin/main),不改变你的工作区。pull则直接把origin/main合并进你的main分支。如果网络中断,pull失败,你的工作区可能处于半合并状态;而fetch失败,你最多只是没拿到新数据。
标准流程:
git fetch origin(获取所有远程分支更新)git log --oneline --graph origin/main ^main(看origin/main有哪些提交是main没有的)git merge origin/main(手动合并,冲突时能清晰看到是哪几行)
参数优化:
git pull --rebase:用变基代替合并。它把你的本地提交“重放”到origin/main最新提交之后,生成线性历史。适合个人分支开发,避免无意义的“merge commit”。git pull --ff-only:只允许快进合并(fast-forward)。如果远程有新提交而你本地有未推送提交,它会拒绝合并,强制你先push或rebase。某次某公司CI流水线因pull产生非快进合并,导致自动化测试误判代码变更范围。
3.7git push:把本地成果“签收”到远程仓库
git push不是“上传代码”,而是通知远程仓库:“请把我的提交记录同步到你的分支上”。它的失败几乎都源于权限或关联问题。
必须确认的三件事:
- 当前分支是否已关联远程分支?
git branch -vv输出应为:
如果显示main 7a2b3c [origin/main] commit message[origin/main: gone],说明远程分支已被删除,需git push -u origin main重新关联(-u即--set-upstream)。 - 是否有权限推送?私有仓库需SSH密钥或Token认证。测试方法:
ssh -T git@github.com(GitHub)或git ls-remote https://<token>@gitlab.com/user/repo.git。 - 远程分支是否有保护规则?如
main分支禁止直接推送,需走Merge Request。此时git push origin main会报错,提示你创建PR。
安全推送:
git push --force-with-lease:强制推送,但前提是远程分支自你上次fetch后没被别人更新。比--force安全,避免覆盖他人提交。某次某开发者用--force强推,覆盖了同事刚合并的PR,导致三天工作丢失。git push origin :feature/old(注意冒号前空格):删除远程分支。这是清理废弃分支的标准操作。
3.8git stash:给未完成代码“寄存包裹”
stash不是“保存”,而是创建一个临时快照,把工作区和暂存区的修改打包存入栈,然后恢复到干净状态。它解决的是“紧急插队”场景。
典型流程:
- 你正在
feature/login分支开发,写了50行代码但没commit - 产品经理电话:“线上支付失败,马上修!”
- 你执行:
git stash push -m "wip: login button style"(-m加备注,方便后续找回) git switch main→git pull→ 修复bug →git commit→git push- 回到
feature/login:git stash pop(取出最新一个stash)
高级技巧:
git stash list:查看所有stash,编号为stash@{0}、stash@{1}git stash apply stash@{1}:应用指定stash而不删除它(pop会删除)git stash drop stash@{0}:删除指定stash
血泪教训:git stash默认不保存未跟踪文件(??)。如果你新建了config.local.js但没add,stash后它会消失。解决方案:git stash -u(-u即--include-untracked)或git stash -a(-a即--all,包含忽略文件)。
3.9git reset:时光倒流的“三档变速器”
git reset有三档:--soft、--mixed(默认)、--hard。它们的区别在于重置的“深度”。
以git reset --hard HEAD~1为例:
HEAD~1:指向上一个提交(即倒退一步)--hard:同时重置工作区、暂存区、HEAD指针
结果:上一个提交的全部文件内容,覆盖你当前工作区;所有add过的文件从暂存区清空;git log里看不到这次提交
三档对比表:
| 参数 | 工作区 | 暂存区 | HEAD | 适用场景 |
|---|---|---|---|---|
--soft | 不变 | 不变 | 重置 | 想修改上一次提交的message(git commit --amend底层就是它) |
--mixed(默认) | 不变 | 清空 | 重置 | 撤销add,但保留文件修改(最常用) |
--hard | 覆盖 | 清空 | 重置 | 彻底放弃上一次提交(高危!) |
安全操作链:
git log --oneline -5记下HEAD~1的哈希(如a1b2c3d)git reset --hard a1b2c3d- 如果后悔:
git reflog找到重置前的HEAD位置(如HEAD@{1}),再git reset --hard HEAD@{1}找回
3.10git merge:把不同分支的成果“缝合”
merge不是“复制代码”,而是创建一个新提交,其父提交指向两个分支的最新节点。它会产生“合并提交”(merge commit),让历史呈现分叉-合并结构。
标准流程:
git checkout develop(切换到目标分支)git merge feature/login(把feature/login的改动合并进来)- 如果冲突,Git会标记冲突文件:
<<<<<<< HEAD // develop分支的代码 ======= // feature/login分支的代码 >>>>>>> feature/login - 手动编辑文件,删掉
<<<<<<<、=======、>>>>>>>及中间的冲突标记,保留正确代码 git add <冲突文件>→git commit(生成合并提交)
预防冲突:
- 频繁
git pull同步develop,让feature分支保持最新 - 小步提交:不要攒一周代码再合并,每天
commit几次,每次改一个点,降低冲突概率 - 使用
git merge --no-commit:先执行合并但不自动提交,给你机会git status检查,git diff预览,确认无误再git commit
4. 实战问题排查:从报错信息到根因定位的完整路径
4.1 “fatal: refusing to merge unrelated histories”——两个世界强行握手
报错场景:
你克隆了一个新仓库,本地初始化了Git,写了代码,然后想git push origin main,却收到:
fatal: refusing to merge unrelated histories根因分析:
远程仓库(如GitHub新建的空仓库)和你的本地仓库没有任何共同提交历史。Git认为它们是“无关的”,拒绝合并。这不是错误,而是安全机制。
解决路径:
git pull origin main --allow-unrelated-histories--allow-unrelated-histories参数强制允许合并,Git会创建一个“初始合并提交”,把两个历史缝在一起。- 解决可能出现的冲突(通常是
.gitignore、README.md等文件) git push origin main
为什么不用--force?--force会覆盖远程历史,如果远程已有他人提交,你的强推会删除他们的工作。--allow-unrelated-histories是协商式合并,安全得多。
4.2 “error: failed to push some refs to 'xxx'”——推送被拒的七种可能
这个报错是Git的“万能错误”,需逐层排查:
| 排查步骤 | 命令 | 预期输出 | 问题定位 |
|---|---|---|---|
| 1. 检查分支关联 | git branch -vv | main abc123 [origin/main] | 若显示[origin/main: gone],需git push -u origin main |
| 2. 检查远程URL | git remote get-url origin | https://github.com/user/repo.git | 若为git@github.com:user/repo.git但SSH密钥未配置,会失败 |
| 3. 检查权限 | curl -I https://github.com/user/repo.git | HTTP/2 404或200 | 404说明仓库不存在或权限不足 |
| 4. 检查保护分支 | git config --get-regexp "branch.*.merge" | branch.main.merge refs/heads/main | 若远程main设为保护分支,需走PR流程 |
| 5. 检查本地提交 | git log origin/main..main | 显示本地提交哈希 | 若为空,说明你没新提交,push无意义 |
| 6. 检查网络代理 | git config --global http.proxy | http://127.0.0.1:8080 | 公司网络常需代理,未配置则超时 |
| 7. 检查Git版本 | git --version | git version 2.30.0 | 旧版Git对新仓库协议支持不佳 |
终极方案:
如果以上全通过仍失败,用git push --verbose origin main开启详细日志,最后一行会明确提示原因(如remote: Permission to user/repo.git denied)。
4.3 “CONFLICT (content): Merge conflict in xxx”——冲突不是Bug,是协作的刻度
为什么冲突不可避免?
当两个人修改同一个文件的同一行,Git无法判断谁的修改正确。它不猜,而是把双方代码都标出来,交给人决策。
高效解决三步法:
- 定位冲突文件:
git status会列出所有冲突文件(状态为UU) - 打开文件找标记:搜索
<<<<<<<,找到冲突块 - 编辑并标记解决:
- 删除
<<<<<<< HEAD、=======、>>>>>>> feature/login三行 - 保留你想要的代码(可能是A的,也可能是B的,或融合版)
git add <文件名>(告诉Git“这个冲突我解决了”)
- 删除
避坑技巧:
- VS Code内置Git冲突解决器:打开冲突文件,顶部出现“Accept Current Change”、“Accept Incoming Change”等按钮,点选即可自动删除标记。
- 如果冲突太多,用
git merge --abort放弃本次合并,重新git pull再试。 - 预防胜于治疗:
git diff origin/develop...feature/login(三点...)可预览合并后差异,提前发现潜在冲突。
4.4 “Your branch is ahead of 'origin/main' by 2 commits”——推送前的最后警报
这个提示不是错误,而是Git的温柔提醒:“你本地有2次提交,远程还没有”。但它常被忽略,导致:
- 同事基于旧版代码开发,你的新API他调不通
- CI流水线跑的是旧代码,测试通过,但实际部署失败
正确响应:
git log origin/main..HEAD --oneline:看这2次提交是什么(避免误推调试代码)git push origin main:立即推送- 如果推送失败(如远程有新提交),执行
git pull --rebase,把你的2次提交“重放”到远程最新提交之后,再push
为什么不用git pull?git pull会生成一个合并提交,让历史变得臃肿。--rebase保持线性,git log --oneline看起来清爽。
4.5 “error: pathspec 'xxx' did not match any file(s) known to git”——文件名的隐形陷阱
报错场景:git add src/components/Button.vue报错,但文件明明存在。
根因排查:
- 大小写敏感:Linux/macOS文件系统区分大小写,
Button.vue和button.vue是不同文件。git status里显示的是button.vue,你却敲Button.vue。 - 路径错误:你在
src/目录下,却敲git add components/Button.vue(少了src/前缀)。 - 文件被忽略:
.gitignore里写了*.vue,导致所有Vue文件被忽略。用git check-ignore -v src/components/Button.vue验证。 - 中文路径:某些旧版Git对UTF-8路径支持不佳,用
git config --global core.quotepath false关闭路径转义。
终极诊断命令:git ls-files --with-tree=HEAD src/components/Button.vue:如果返回空,说明Git根本不认识这个文件(被忽略或路径错);如果返回文件名,说明路径正确。
5. 经验沉淀:那些没人告诉你的“Git生存法则”
5.1 每次git commit前,花10秒做三件事
这是我带过的所有项目组统一执行的“提交前仪式”,它把90%的低级错误挡在历史之外:
git status -s:确认只有你想提交的文件在列表里。如果看到不该出现的??,立刻git check-ignore -v <文件名>查原因。git diff --cached:预览即将提交的内容。重点看:- 是否有
console.log、debugger、TODO注释残留 - 是否误包含了
node_modules、.DS_Store等垃圾文件 - 修改范围是否符合本次提交的意图(比如你只想改按钮颜色,diff里却出现了API调用)
- 是否有
git log -1 --oneline:看上一次提交的message。如果它写着“fix bug”,而你这次是“add feature”,说明你可能该开新分支,而不是继续在main上提交。
这三步加起来不超过10秒,但某次某公司上线事故追溯发现,70%的问题源于开发者跳过diff --cached,把调试代码推上了生产环境。
5.2 分支命名不是艺术,是工程契约
feature/login、hotfix/payment-fail、release/v2.3.0——这些不是随意起的,而是约定俗成的“分支语义”。某高校实训项目曾用dev1、dev2、new等命名,结果两周后没人记得dev2是做什么的,new分支里混着登录和支付两套代码。
推荐命名规范:
feature/<模块名>-<简短描述>:feature/user-profile-edithotfix/<问题简述>:hotfix/ios-safari-crash(紧急修复)release/<版本号>:release/v3.0.0(准备发布)bugfix/<JIRA编号>:bugfix/PROJ-123(关联工单)
为什么重要?
git log --oneline --grep="feature/"可一键过滤所有功能开发记录- CI/CD流水线能根据分支名自动触发不同构建策略(如
hotfix/*跳过单元测试