[{"data":1,"prerenderedAt":521},["ShallowReactive",2],{"content:\u002Fposts\u002F2025\u002Fgit-angular-push-rules":3,"surround:\u002Fposts\u002F2025\u002Fgit-angular-push-rules":510},{"id":4,"title":5,"body":6,"canonical":478,"categories":479,"date":481,"description":482,"draft":483,"extension":484,"image":485,"meta":486,"navigation":487,"path":488,"permalink":478,"readingTime":489,"recommend":494,"references":478,"seo":495,"sitemap":496,"stem":506,"tags":507,"type":478,"updated":481,"__hash__":509},"content\u002Fposts\u002F2025\u002Fgit-angular-push-rules.md","Git 提交规范及其在项目里的使用",{"type":7,"value":8,"toc":454},"minimark",[9,13,24,27,38,41,44,52,56,59,63,66,130,133,136,139,142,153,156,159,162,165,169,172,179,185,188,191,194,200,203,209,212,215,221,228,231,239,242,245,254,257,260,266,270,273,276,309,312,352,355,358,364,384,389,409,415,435,441,444,447],[10,11,12],"h2",{"id":12},"git提交规范",[14,15,16,17],"p",{},"目前最受开发人员肯定的规范是Angular提出的",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fgithub.com\u002Fangular\u002Fangular\u002Fblob\u002F22b96b9\u002FCONTRIBUTING.md#-commit-message-guidelines",[22],"nofollow","Angular 提交信息规范",[14,25,26],{},"提交格式如下",[28,29,34],"pre",{"className":30,"code":32,"language":33},[31],"language-text","\u003Ctype>(\u003Cscope>): \u003Csubject>\n\u003CBLANK LINE>\n\u003Cbody>\n\u003CBLANK LINE>\n\u003Cfooter>\n","text",[35,36,32],"code",{"__ignoreMap":37},"",[14,39,40],{},"每次提交可以包含页眉(header)、正文(body)和页脚(footer)，每次提交必须包含页眉内容",[14,42,43],{},"每次提交的信息不超过100个字符",[14,45,46,47],{},"详细文档：",[18,48,51],{"href":49,"rel":50},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y\u002Fedit#",[22],"AngularJS Git Commit Message Conventions",[53,54,55],"h3",{"id":55},"页眉设置",[14,57,58],{},"页眉的格式指定为提交类型(type)、作用域(scope，可选)和主题(subject)",[60,61,62],"h4",{"id":62},"提交类型",[14,64,65],{},"提交类型指定为下面其中一个：",[67,68,69,76,82,88,94,100,106,112,118,124],"ol",{},[70,71,72,75],"li",{},[35,73,74],{"code":74},"build"," : 对构建系统或者外部依赖项进行了修改",[70,77,78,81],{},[35,79,80],{"code":80},"ci"," : 对CI配置文件或脚本进行了修改",[70,83,84,87],{},[35,85,86],{"code":86},"docs"," : 对文档进行了修改",[70,89,90,93],{},[35,91,92],{"code":92},"feat"," : 增加新的特征",[70,95,96,99],{},[35,97,98],{"code":98},"fix"," : 修复bug",[70,101,102,105],{},[35,103,104],{"code":104},"pref"," : 提高性能的代码更改",[70,107,108,111],{},[35,109,110],{"code":110},"refactor"," : 既不是修复bug也不是添加特征的代码重构",[70,113,114,117],{},[35,115,116],{"code":116},"style"," : 不影响代码含义的修改，比如空格、格式化、缺失的分号等",[70,119,120,123],{},[35,121,122],{"code":122},"test"," : 增加确实的测试或者矫正已存在的测试",[70,125,126,129],{},[35,127,128],{"code":128},"chore"," : 构建过程或辅助工具的变动",[60,131,132],{"id":132},"作用域",[14,134,135],{},"范围可以是任何指定提交更改位置的内容",[60,137,138],{"id":138},"主题",[14,140,141],{},"主题包括了对本次修改的简洁描述，有以下准则",[67,143,144,147,150],{},[70,145,146],{},"使用命令式，现在时态：“改变”不是“已改变”也不是“改变了”",[70,148,149],{},"不要大写首字母",[70,151,152],{},"不在末尾添加句号",[53,154,155],{"id":155},"正文设置",[14,157,158],{},"和主题设置类似，使用命令式、现在时态",[14,160,161],{},"应该包含修改的动机以及和之前行为的对比",[53,163,164],{"id":164},"页脚设置",[60,166,168],{"id":167},"breaking-changes-破坏性改动","Breaking changes 破坏性改动",[14,170,171],{},"不兼容修改指的是本次提交修改了不兼容之前版本的API或者环境变量",[14,173,174,175,178],{},"所有不兼容修改都必须在页脚中作为中断更改块提到，以 ",[35,176,177],{"code":177},"BREAKING CHANGE:"," 开头，后跟一个空格或者两个换行符，其余的信息就是对此次修改的描述，修改的理由和修改注释",[28,180,183],{"className":181,"code":182,"language":33},[31],"BREAKING CHANGE: isolate scope bindings definition has changed and\n    the inject option for the directive controller injection was removed.\n\n    To migrate the code follow the example below:\n\n    Before:\n\n    。。。\n    。。。\n\n    After:\n\n    。。。\n    。。。\n\n    The removed `inject` wasn't generaly useful for directives so there should be no code using it.\n",[35,184,182],{"__ignoreMap":37},[60,186,187],{"id":187},"引用提交的问题",[14,189,190],{},"如果本次提交目的是修改issue的话，需要在页脚引用该issue",[14,192,193],{},"以关键字Closes开头，比如",[28,195,198],{"className":196,"code":197,"language":33},[31],"Closes #234\n",[35,199,197],{"__ignoreMap":37},[14,201,202],{},"如果修改了多个bug，以逗号隔开",[28,204,207],{"className":205,"code":206,"language":33},[31],"Closes #123, #245, #992\n",[35,208,206],{"__ignoreMap":37},[53,210,211],{"id":211},"回滚设置",[14,213,214],{},"当此次提交包含回滚(revert)操作，那么页眉以\"revert:\"开头，同时在正文中添加\"This reverts commit hash\"，其中hash值表示被回滚前的提交",[28,216,219],{"className":217,"code":218,"language":33},[31],"revert:\u003Ctype>(\u003Cscope>): \u003Csubject>\n\u003CBLANK LINE>\nThis reverts commit hash\n\u003Cother-body>\n\u003CBLANK LINE>\n\u003Cfooter>\n",[35,220,218],{"__ignoreMap":37},[10,222,224,225],{"id":223},"在项目里的设置-simple-git-hooks","在项目里的设置 ",[35,226,227],{"code":227},"simple-git-hooks",[14,229,230],{},"将 simple-git-hooks 添加到项目中",[28,232,237],{"className":233,"code":235,"language":236,"meta":37},[234],"language-bash","npm install simple-git-hooks --save-dev\n","bash",[35,238,235],{"__ignoreMap":37},[14,240,241],{},"将simple-git-hooks添加到您的package.json中。用 git hooks 和相应的命令填充它。",[14,243,244],{},"例如：",[28,246,252],{"className":247,"code":249,"filename":250,"language":251,"meta":37},[248],"language-json","{\n  \"simple-git-hooks\": {\n    \"pre-commit\": \"npx lint-staged\",\n    \"pre-push\": \"npm run format\",\n\n    \u002F\u002F 默认情况下，所有未使用的钩子将被自动删除\n    \u002F\u002F 但你可以使用 preseruunused 选项来防止这种行为\n\n    \u002F\u002F 如果您希望保留所有未使用的钩子\n    \"preserveUnused\": true,\n\n    \u002F\u002F 如果您希望保留特定的未使用的钩子\n    \u002F\u002F \"preserveUnused\": [\"commit-msg\",],\n  },\n}\n","package.json","json",[35,253,249],{"__ignoreMap":37},[14,255,256],{},"此配置将在每次commit时运行所有 linter，并在push时运行格式化程序。",[14,258,259],{},"可以配合 eslint 在提交时自动格式化代码",[28,261,264],{"className":262,"code":263,"filename":250,"language":251,"meta":37},[248],"{\n  \"simple-git-hooks\": {\n    \"pre-commit\": \"pnpm lint-staged\",\n  },\n  \"lint-staged\": {\n    \"*\": \"eslint --fix\",\n  },\n}\n",[35,265,263],{"__ignoreMap":37},[10,267,269],{"id":268},"git-分支","Git 分支",[53,271,272],{"id":272},"各分支说明",[14,274,275],{},"一般都有一些规范来创建分支",[67,277,278,285,291,297,303],{},[70,279,280,281,284],{},"production 分支",[282,283],"br",{},"一般是 master 分支，这个分支是最近的部署到生产环境的代码。这个分支只能从其他分支合并，不能直接在此分支修改代码。",[70,286,287,288,290],{},"develop 分支",[282,289],{},"这个分支一般是开发主分支，包含所有要发布到下一版本的 release 代码，这个分支主要合并其他分支，如 feature 分支",[70,292,293,294,296],{},"feature 分支",[282,295],{},"这个分支主要用来开发一个新的功能，一旦开发完成并且合并如 develop 分支进入下一个 release",[70,298,299,300,302],{},"release 分支",[282,301],{},"当需要发布一个新的 release 的时候，我们基于 develop 分支创建一个 release 分支，完成 release 后，我们合并到 master 和 develop 分支",[70,304,305,306,308],{},"hotfix 分支",[282,307],{},"当我们在 production 分支发现新的 bug，我们需要创建一个 hotfix，完成 hotfix 后，我们合并回 master 和 develop 分支，所以 hotfix 的改动会进入下一个 release",[53,310,311],{"id":311},"各分支操作示意图",[67,313,314,325,334,343],{},[70,315,316,317,319,320],{},"master\u002Fdevelop 分支",[282,318],{},"所有在 master 分支上的 commit 应该打上 tag，一般情况下 master 不存在 commit ，develop 分\n支基于 master 分支创建。\n",[321,322],"img",{"alt":323,"src":324},"git-master-develop","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F6795aa29c46a4-78.webp",[70,326,293,327,329,330],{},[282,328],{},"feature 分支做完后，必须合并回 develop 分支, 合并完分支后一般会删除这个 feature 分支，\n毕竟保留下来意义也不大。\n",[321,331],{"alt":332,"src":333},"git-feature","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F6795aa2aaaa1d-78.webp",[70,335,299,336,338,339],{},[282,337],{},"release 分支基于 develop 分支创建，打完 release 分支之后，我们可以在这个 release 分支\n上测试，修改 Bug 等。同时，其它开发人员可以基于 develop 分支新建 feature (记住：一旦打了\nrelease 分支之后不要从 develop 分支上合并新的改动到 release 分支)发布 release 分支时，合并\nrelease 到 Master 和 develop， 同时在 Master 分支上打个 Tag 记住 release 版本号，然后可以删\n除 release 分支了。\n",[321,340],{"alt":341,"src":342},"git-release","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F6795aa2dbad1b-78.webp",[70,344,305,345,347,348],{},[282,346],{},"hotfix 分支基于 Master 分支创建，开发完后需要合并回 Master 和 develop 分支，同时在\nMaster 上打一个 tag。\n",[321,349],{"alt":350,"src":351},"git-hotfix","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F6795aa2f35eda-78.webp",[10,353,354],{"id":354},"合并类型",[14,356,357],{},"squash、 rebase or merge？",[14,359,360],{},[321,361],{"alt":362,"src":363},"git-example","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F6795aa283d07d-78.webp",[67,365,366],{},[70,367,368,369],{},"merge",[370,371,372,375,378,381],"ul",{},[70,373,374],{},"操作方式：将一个分支的更改合并到另一个分支，创建一个全新的合并提交",[70,376,377],{},"历史记录：会保留原有分支结构",[70,379,380],{},"优点：保留分支的独立性，可读性好，安全",[70,382,383],{},"缺点：历史记录变得复杂，会有冗余合并提交",[14,385,386],{},[321,387],{"alt":368,"src":388},"https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F6795aa2d12373-78.webp",[67,390,392],{"start":391},2,[70,393,394,395],{},"rebase（变基）",[370,396,397,400,403,406],{},[70,398,399],{},"操作方式：将一个分支的更改移动到另一个分支的末端",[70,401,402],{},"历史记录：不同于合并，他会修改提交历史，使提交记录看起来像是一条线",[70,404,405],{},"优点：历史记录干净、线性，介绍不必要的合并提交，适用于已经完成的分支和主分支合并",[70,407,408],{},"缺点：可能引起冲突",[14,410,411],{},[321,412],{"alt":413,"src":414},"rebase","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F6795aa291dd50-78.webp",[67,416,418],{"start":417},3,[70,419,420,421],{},"squash（压缩）",[370,422,423,426,429,432],{},[70,424,425],{},"操作方式：将多个连续的提交合并为一个，创建一个新的提交",[70,427,428],{},"历史记录：生成一个简化的历史，只包含最终的合并提交",[70,430,431],{},"优点：简化历史记录，提供更干净的视图",[70,433,434],{},"缺点：丟失了每个提交的详细信息",[14,436,437],{},[321,438],{"alt":439,"src":440},"squash","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F6795aa2f48143-78.webp",[442,443],"hr",{},[10,445,446],{"id":446},"附件",[14,448,449],{},[18,450,453],{"href":451,"rel":452},"https:\u002F\u002Flearngitbranching.js.org\u002F?demo=&locale=zh_CN",[22],"学习 git 分支游戏",{"title":37,"searchDepth":455,"depth":455,"links":456},4,[457,470,472,476,477],{"id":12,"depth":391,"text":12,"children":458},[459,464,465,469],{"id":55,"depth":417,"text":55,"children":460},[461,462,463],{"id":62,"depth":455,"text":62},{"id":132,"depth":455,"text":132},{"id":138,"depth":455,"text":138},{"id":155,"depth":417,"text":155},{"id":164,"depth":417,"text":164,"children":466},[467,468],{"id":167,"depth":455,"text":168},{"id":187,"depth":455,"text":187},{"id":211,"depth":417,"text":211},{"id":223,"depth":391,"text":471},"在项目里的设置 simple-git-hooks",{"id":268,"depth":391,"text":269,"children":473},[474,475],{"id":272,"depth":417,"text":272},{"id":311,"depth":417,"text":311},{"id":354,"depth":391,"text":354},{"id":446,"depth":391,"text":446},null,[480],"代码","2025-01-16 07:31:53","简单的给你的项目配置和使用 Git 提交规范",false,"md","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F679f0d37ddcd1-78.webp",{},true,"\u002Fposts\u002F2025\u002Fgit-angular-push-rules",{"text":490,"minutes":491,"time":492,"words":493},"9 min read",8.11,486600,1622,1,{"title":5,"description":482},{"loc":488,"images":497},[498,499,500,501,502,503,504,505],{"loc":324},{"loc":333},{"loc":342},{"loc":351},{"loc":363},{"loc":388},{"loc":414},{"loc":440},"posts\u002F2025\u002Fgit-angular-push-rules",[508],"git","p-pbXeSrdQlflC-5s1BdltUlKJkjs3WL3VwhIbR7wBU",[511,516],{"title":512,"path":513,"stem":514,"date":515,"type":478,"children":-1},"使用 zod 对.env 文件约束","\u002Fposts\u002F2025\u002Fsecurely-share-environment-variables","posts\u002F2025\u002Fsecurely-share-environment-variables","2025-01-15 14:52:04",{"title":517,"path":518,"stem":519,"date":520,"type":478,"children":-1},"如何让网站图标跟随系统主题变化？","\u002Fposts\u002F2025\u002Fhow-to-dynamically-change-favicon-for-dark-and-light-mode","posts\u002F2025\u002Fhow-to-dynamically-change-favicon-for-dark-and-light-mode","2025-01-22 13:49:51",1789642585211]