[{"data":1,"prerenderedAt":1815},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Fgit-branches-stage-production-primeiro-lancamento":129},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Nuxfire Docs","\u002Fdocs","docs\u002F0.index",[9,11],{"title":5,"path":6,"stem":7,"icon":10},"i-ph-squares-four-duotone",{"title":12,"path":13,"stem":14,"children":15,"icon":18},"Flow Videos","\u002Fdocs\u002Fflow-videos","docs\u002Fflow-videos\u002F0.index",[16,19,36,67,93],{"title":17,"path":13,"stem":14,"icon":18},"Serelius Flow Video","i-ph-video-camera-duotone",{"title":20,"icon":21,"path":22,"stem":23,"children":24,"page":35},"Getting Started","i-ph-rocket-launch-duotone","\u002Fdocs\u002Fflow-videos\u002Fgetting-started","docs\u002Fflow-videos\u002F1.getting-started",[25,30],{"title":26,"path":27,"stem":28,"icon":29},"Overview","\u002Fdocs\u002Fflow-videos\u002Fgetting-started\u002Foverview","docs\u002Fflow-videos\u002F1.getting-started\u002F0.overview","i-ph-play-circle-duotone",{"title":31,"path":32,"stem":33,"icon":34},"Global Features","\u002Fdocs\u002Fflow-videos\u002Fgetting-started\u002Fglobal-features","docs\u002Fflow-videos\u002F1.getting-started\u002F1.global-features","i-ph-gear-six-duotone",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Pipeline","i-ph-film-strip-duotone","\u002Fdocs\u002Fflow-videos\u002Fpipeline","docs\u002Fflow-videos\u002F2.pipeline",[42,47,52,57,62],{"title":43,"path":44,"stem":45,"icon":46},"Phase 1 — Script","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Fscript","docs\u002Fflow-videos\u002F2.pipeline\u002F1.script","i-ph-scroll-duotone",{"title":48,"path":49,"stem":50,"icon":51},"Phase 2 — Style & Identity","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Fstyle-and-identity","docs\u002Fflow-videos\u002F2.pipeline\u002F2.style-and-identity","i-ph-palette-duotone",{"title":53,"path":54,"stem":55,"icon":56},"Phase 3 — Storyboard","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Fstoryboard","docs\u002Fflow-videos\u002F2.pipeline\u002F3.storyboard","i-ph-image-duotone",{"title":58,"path":59,"stem":60,"icon":61},"Phase 4 — Videos","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Fvideos","docs\u002Fflow-videos\u002F2.pipeline\u002F4.videos","i-ph-video-duotone",{"title":63,"path":64,"stem":65,"icon":66},"Phase 5 — Final Assembly","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Ffinal-assembly","docs\u002Fflow-videos\u002F2.pipeline\u002F5.final-assembly","i-ph-scissors-duotone",{"title":68,"icon":69,"path":70,"stem":71,"children":72,"page":35},"Settings & Models","i-ph-sliders-duotone","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models","docs\u002Fflow-videos\u002F3.settings-and-models",[73,78,83,88],{"title":74,"path":75,"stem":76,"icon":77},"Settings","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models\u002Fsettings","docs\u002Fflow-videos\u002F3.settings-and-models\u002F0.settings","i-ph-sliders-horizontal-duotone",{"title":79,"path":80,"stem":81,"icon":82},"AI Models & Limits","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models\u002Fmodels-and-limits","docs\u002Fflow-videos\u002F3.settings-and-models\u002F1.models-and-limits","i-ph-cpu-duotone",{"title":84,"path":85,"stem":86,"icon":87},"Option Catalogs","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models\u002Fcatalogs","docs\u002Fflow-videos\u002F3.settings-and-models\u002F2.catalogs","i-ph-list-bullets-duotone",{"title":89,"path":90,"stem":91,"icon":92},"Pipeline Calibration","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models\u002Fcalibration","docs\u002Fflow-videos\u002F3.settings-and-models\u002F3.calibration","i-ph-gauge-duotone",{"title":94,"icon":95,"path":96,"stem":97,"children":98,"page":35},"Reference","i-ph-book-open-duotone","\u002Fdocs\u002Fflow-videos\u002Freference","docs\u002Fflow-videos\u002F4.reference",[99,104,109,114,119,124],{"title":100,"path":101,"stem":102,"icon":103},"Delivered Files","\u002Fdocs\u002Fflow-videos\u002Freference\u002Fdelivered-files","docs\u002Fflow-videos\u002F4.reference\u002F0.delivered-files","i-ph-folder-duotone",{"title":105,"path":106,"stem":107,"icon":108},"Supported Video Types","\u002Fdocs\u002Fflow-videos\u002Freference\u002Fvideo-types","docs\u002Fflow-videos\u002F4.reference\u002F1.video-types","i-ph-television-duotone",{"title":110,"path":111,"stem":112,"icon":113},"What the Tool Does NOT Do","\u002Fdocs\u002Fflow-videos\u002Freference\u002Flimitations","docs\u002Fflow-videos\u002F4.reference\u002F2.limitations","i-ph-prohibit-duotone",{"title":115,"path":116,"stem":117,"icon":118},"Business Models","\u002Fdocs\u002Fflow-videos\u002Freference\u002Fbusiness-models","docs\u002Fflow-videos\u002F4.reference\u002F3.business-models","i-ph-briefcase-duotone",{"title":120,"path":121,"stem":122,"icon":123},"FAQ & Glossary","\u002Fdocs\u002Fflow-videos\u002Freference\u002Ffaq-and-glossary","docs\u002Fflow-videos\u002F4.reference\u002F4.faq-and-glossary","i-ph-question-duotone",{"title":125,"path":126,"stem":127,"icon":128},"Technical and Architectural Audit","\u002Fdocs\u002Fflow-videos\u002Freference\u002Faudit","docs\u002Fflow-videos\u002F4.reference\u002F5.audit","i-ph-shield-check-duotone",{"id":130,"title":131,"author":132,"authorType":133,"body":134,"category":1792,"date":1793,"description":1794,"extension":1795,"image":1796,"lang":1797,"meta":1798,"navigation":1688,"ogImage":1799,"path":1800,"readTime":1801,"seo":1802,"stem":1803,"tags":1804,"translations":1810,"updated":133,"__hash__":1814},"blog\u002Fblog\u002Fgit-branches-stage-production-primeiro-lancamento.md","Git para o Primeiro Lançamento: Branches stage e production, do Repositório Vazio ao Ar","Equipe Nuxfire",null,{"type":135,"value":136,"toc":1772},"minimark",[137,151,154,159,169,172,223,236,240,276,280,359,371,376,382,386,408,414,420,496,518,540,546,550,556,562,580,607,614,634,640,659,663,669,675,681,719,725,742,746,752,761,774,788,807,817,835,854,857,876,885,889,895,899,909,913,919,962,968,996,1018,1022,1028,1068,1078,1088,1108,1138,1142,1148,1152,1158,1180,1191,1207,1213,1259,1265,1298,1301,1347,1356,1360,1366,1370,1379,1405,1414,1456,1463,1467,1473,1477,1483,1530,1540,1544,1550,1554,1673,1677,1758,1768],[138,139,140,141,145,146,150],"p",{},"Você extraiu o código-fonte do Nuxfire e está prestes a publicar seu primeiro produto. Antes de rodar qualquer comando ",[142,143,144],"code",{},"sst",", dedique vinte minutos ao que decide se os próximos cem deploys serão tranquilos ou estressantes: ",[147,148,149],"strong",{},"como as suas branches do Git se relacionam com o que está no ar",".",[138,152,153],{},"Este manual constrói um modelo pequeno e rigoroso. Todo comando Git aqui foi executado de ponta a ponta em um repositório de teste antes da publicação; as opções do GitHub CLI vêm do manual oficial. Cada etapa traz os comandos manuais e um prompt curto para colar em um agente de IA na sua IDE (Cursor, Claude Code, Copilot e similares).",[155,156,158],"h2",{"id":157},"o-modelo-em-um-minuto","O modelo em um minuto",[160,161,167],"pre",{"className":162,"code":164,"language":165,"meta":166},[163],"language-text","feature\u002Fx ──▶ stage ──(validated)──▶ production\n              default branch          moves ONLY by fast-forward\n              you work here           = what you approved for live\n","text","",[142,168,164],{"__ignoreMap":166},[138,170,171],{},"Duas branches de longa duração e cinco regras:",[173,174,175,185,197,205,213],"ol",{},[176,177,178,184],"li",{},[147,179,180,181,150],{},"Todo o trabalho acontece na ",[142,182,183],{},"stage"," Ela é a branch padrão, então pull requests e clones caem nela.",[176,186,187,196],{},[147,188,189,190,193,194,150],{},"A ",[142,191,192],{},"production"," só avança por fast-forward a partir da ",[142,195,183],{}," Sem commits de merge e sem commits diretos.",[176,198,199,204],{},[147,200,201,202,150],{},"Nunca faça force-push na ",[142,203,192],{}," Se um push for rejeitado, é a rede de segurança funcionando.",[176,206,207,212],{},[147,208,209,210,150],{},"Faça o deploy de produção a partir da branch ",[142,211,192],{}," Um deploy publica o que estiver em checkout na sua máquina, então a branch em que você está é a verdade.",[176,214,215,218,219,222],{},[147,216,217],{},"Marque com uma tag cada release que foi ao ar"," (",[142,220,221],{},"v1.0.0","). A branch diz \"aprovado\", a tag diz \"confirmado no ar\".",[138,224,225,226,229,230,232,233,235],{},"Por que não manter a ",[142,227,228],{},"main"," também? Uma terceira branch de longa duração é uma terceira resposta para \"qual é o código mais recente?\". O Nuxfire já chama seus estágios de deploy de ",[142,231,183],{}," e ",[142,234,192],{},", então as branches espelham esses nomes e não há nada para traduzir na sua cabeça.",[155,237,239],{"id":238},"o-que-você-precisa","O que você precisa",[241,242,243,257,264],"ul",{},[176,244,245,246,249,250,253,254,150],{},"Git ",[147,247,248],{},"2.28 ou mais novo"," (para o ",[142,251,252],{},"git init -b","). Confira com ",[142,255,256],{},"git --version",[176,258,259,260,263],{},"Uma conta no GitHub (pessoal ou organização). O GitHub CLI (",[142,261,262],{},"gh",") é opcional; cada etapa também mostra o caminho pela interface web.",[176,265,266,267,270,271,150],{},"A pasta do Nuxfire extraída e o ",[142,268,269],{},"bun install"," feito, como em ",[272,273,275],"a",{"href":274},"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Finstallation","Instalação",[155,277,279],{"id":278},"etapa-1-diga-ao-git-quem-você-é","Etapa 1: diga ao Git quem você é",[160,281,285],{"className":282,"code":283,"language":284,"meta":166,"style":166},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark monokai","git --version\ngit config --global user.name \"Your Name\"\ngit config --global user.email \"you@example.com\"\ngit config --global init.defaultBranch stage\n","bash",[142,286,287,300,325,344],{"__ignoreMap":166},[288,289,292,296],"span",{"class":290,"line":291},"line",1,[288,293,295],{"class":294},"sR7ES","git",[288,297,299],{"class":298},"sFhLe"," --version\n",[288,301,303,305,309,312,315,319,322],{"class":290,"line":302},2,[288,304,295],{"class":294},[288,306,308],{"class":307},"sLACW"," config",[288,310,311],{"class":298}," --global",[288,313,314],{"class":307}," user.name",[288,316,318],{"class":317},"siCPE"," \"",[288,320,321],{"class":307},"Your Name",[288,323,324],{"class":317},"\"\n",[288,326,328,330,332,334,337,339,342],{"class":290,"line":327},3,[288,329,295],{"class":294},[288,331,308],{"class":307},[288,333,311],{"class":298},[288,335,336],{"class":307}," user.email",[288,338,318],{"class":317},[288,340,341],{"class":307},"you@example.com",[288,343,324],{"class":317},[288,345,347,349,351,353,356],{"class":290,"line":346},4,[288,348,295],{"class":294},[288,350,308],{"class":307},[288,352,311],{"class":298},[288,354,355],{"class":307}," init.defaultBranch",[288,357,358],{"class":307}," stage\n",[138,360,361,362,364,365,368,369,150],{},"A última linha faz todo repositório novo que você criar começar na ",[142,363,183],{},", em vez de ",[142,366,367],{},"master"," ou ",[142,370,228],{},[138,372,373],{},[147,374,375],{},"Prompt para agentes de IA:",[160,377,380],{"className":378,"code":379,"language":165,"meta":166},[163],"Check `git --version` (2.28 or newer is required). Show my global git\nuser.name and user.email. If either is empty, ask me for the values\nbefore setting them. Do not change anything else.\n",[142,381,379],{"__ignoreMap":166},[155,383,385],{"id":384},"etapa-2-proteja-seus-segredos-e-faça-o-primeiro-commit","Etapa 2: proteja seus segredos e faça o primeiro commit",[138,387,388,389,392,393,232,396,399,400,403,404,407],{},"Sua pasta já contém arquivos que ",[147,390,391],{},"nunca"," podem chegar ao Git: ",[142,394,395],{},".env.production",[142,397,398],{},".env.stage"," guardam credenciais reais (a verificação prévia do deploy até confere se os valores do banco estão preenchidos), e ",[142,401,402],{},".sst"," é o estado local do deploy. O ",[142,405,406],{},".gitignore"," do Nuxfire cobre todos eles:",[160,409,412],{"className":410,"code":411,"language":165,"meta":166},[163],".env\n.env.*\n!.env.example\n.sst\n",[142,413,411],{"__ignoreMap":166},[138,415,416,417,419],{},"Crie o repositório na ",[142,418,183],{},", prove que as regras funcionam e só então adicione tudo:",[160,421,423],{"className":282,"code":422,"language":284,"meta":166,"style":166},"git init -b stage\ngit check-ignore -v .env.production .env.stage .sst\ngit add -A\ngit diff --cached --name-only | grep -E \"(^|\u002F)\\.env\"\n",[142,424,425,437,456,466],{"__ignoreMap":166},[288,426,427,429,432,435],{"class":290,"line":291},[288,428,295],{"class":294},[288,430,431],{"class":307}," init",[288,433,434],{"class":298}," -b",[288,436,358],{"class":307},[288,438,439,441,444,447,450,453],{"class":290,"line":302},[288,440,295],{"class":294},[288,442,443],{"class":307}," check-ignore",[288,445,446],{"class":298}," -v",[288,448,449],{"class":307}," .env.production",[288,451,452],{"class":307}," .env.stage",[288,454,455],{"class":307}," .sst\n",[288,457,458,460,463],{"class":290,"line":327},[288,459,295],{"class":294},[288,461,462],{"class":307}," add",[288,464,465],{"class":298}," -A\n",[288,467,468,470,473,476,479,483,486,489,491,494],{"class":290,"line":346},[288,469,295],{"class":294},[288,471,472],{"class":307}," diff",[288,474,475],{"class":298}," --cached",[288,477,478],{"class":298}," --name-only",[288,480,482],{"class":481},"sGXK2"," |",[288,484,485],{"class":294}," grep",[288,487,488],{"class":298}," -E",[288,490,318],{"class":317},[288,492,493],{"class":307},"(^|\u002F)\\.env",[288,495,324],{"class":317},[138,497,498,499,502,503,506,507,510,511,514,515,517],{},"O ",[142,500,501],{},"check-ignore"," precisa imprimir a regra que casa com cada arquivo. O último comando precisa imprimir ",[147,504,505],{},"somente"," ",[142,508,509],{},".env.example",". Se qualquer outro arquivo ",[142,512,513],{},".env*"," aparecer, pare e corrija o ",[142,516,406],{}," antes de commitar.",[160,519,521],{"className":282,"code":520,"language":284,"meta":166,"style":166},"git commit -m \"chore: initial commit from Nuxfire\"\n",[142,522,523],{"__ignoreMap":166},[288,524,525,527,530,533,535,538],{"class":290,"line":291},[288,526,295],{"class":294},[288,528,529],{"class":307}," commit",[288,531,532],{"class":298}," -m",[288,534,318],{"class":317},[288,536,537],{"class":307},"chore: initial commit from Nuxfire",[288,539,324],{"class":317},[541,542,543],"blockquote",{},[138,544,545],{},"Se um segredo for commitado alguma vez, apagar o arquivo não basta: ele continua no histórico. Trate a credencial como comprometida, troque-a primeiro e só depois limpe o histórico.",[138,547,548],{},[147,549,375],{},[160,551,554],{"className":552,"code":553,"language":165,"meta":166},[163],"In the project root, run `git init -b stage` only if there is no .git\nfolder. With `git check-ignore -v`, verify that .env.production,\n.env.stage and .sst are ignored and that .env.example is not. Run\n`git add -A` and print `git diff --cached --name-only`. STOP and warn me\nif any .env* file other than .env.example is listed. If it is clean,\ncommit with the message \"chore: initial commit from Nuxfire\".\n",[142,555,553],{"__ignoreMap":166},[155,557,559,560],{"id":558},"etapa-3-crie-o-repositório-no-github-e-envie-a-stage","Etapa 3: crie o repositório no GitHub e envie a ",[142,561,183],{},[138,563,564,565,568,569,571,572,575,576,579],{},"Crie um repositório ",[147,566,567],{},"privado e vazio",": sem README, sem ",[142,570,406],{},", sem licença. No navegador, use ",[147,573,574],{},"New repository",", escolha ",[147,577,578],{},"Private"," e deixe as opções de inicialização desmarcadas. Ou, pela CLI, dentro da pasta do projeto:",[160,581,583],{"className":282,"code":582,"language":284,"meta":166,"style":166},"gh repo create my-product --private --source=. --remote=origin\n",[142,584,585],{"__ignoreMap":166},[288,586,587,589,592,595,598,601,604],{"class":290,"line":291},[288,588,262],{"class":294},[288,590,591],{"class":307}," repo",[288,593,594],{"class":307}," create",[288,596,597],{"class":307}," my-product",[288,599,600],{"class":298}," --private",[288,602,603],{"class":298}," --source=.",[288,605,606],{"class":298}," --remote=origin\n",[138,608,609,610,613],{},"A CLI adiciona o remoto ",[142,611,612],{},"origin"," para você. Sem ela, adicione o remoto manualmente, com a URL que o GitHub mostra:",[160,615,617],{"className":282,"code":616,"language":284,"meta":166,"style":166},"git remote add origin git@github.com:YOUR-USER\u002Fmy-product.git\n",[142,618,619],{"__ignoreMap":166},[288,620,621,623,626,628,631],{"class":290,"line":291},[288,622,295],{"class":294},[288,624,625],{"class":307}," remote",[288,627,462],{"class":307},[288,629,630],{"class":307}," origin",[288,632,633],{"class":307}," git@github.com:YOUR-USER\u002Fmy-product.git\n",[138,635,636,637,639],{},"Nos dois casos, publique a ",[142,638,183],{}," e configure o rastreamento do remoto:",[160,641,643],{"className":282,"code":642,"language":284,"meta":166,"style":166},"git push -u origin stage\n",[142,644,645],{"__ignoreMap":166},[288,646,647,649,652,655,657],{"class":290,"line":291},[288,648,295],{"class":294},[288,650,651],{"class":307}," push",[288,653,654],{"class":298}," -u",[288,656,630],{"class":307},[288,658,358],{"class":307},[138,660,661],{},[147,662,375],{},[160,664,667],{"className":665,"code":666,"language":165,"meta":166},[163],"Create a PRIVATE, empty GitHub repository named \u003Cname> under \u003Cowner>\n(no README, no .gitignore, no license), add it as `origin`, and push the\n`stage` branch with upstream tracking. Use `gh` if it is installed;\notherwise print the exact commands for me to run. Never use --force.\n",[142,668,666],{"__ignoreMap":166},[155,670,672,673],{"id":671},"etapa-4-crie-a-production","Etapa 4: crie a ",[142,674,192],{},[138,676,677,678,680],{},"Crie a branch a partir da ",[142,679,183],{},", no mesmo commit, publique-a e volte:",[160,682,684],{"className":282,"code":683,"language":284,"meta":166,"style":166},"git switch -c production\ngit push -u origin production\ngit switch stage\n",[142,685,686,699,711],{"__ignoreMap":166},[288,687,688,690,693,696],{"class":290,"line":291},[288,689,295],{"class":294},[288,691,692],{"class":307}," switch",[288,694,695],{"class":298}," -c",[288,697,698],{"class":307}," production\n",[288,700,701,703,705,707,709],{"class":290,"line":302},[288,702,295],{"class":294},[288,704,651],{"class":307},[288,706,654],{"class":298},[288,708,630],{"class":307},[288,710,698],{"class":307},[288,712,713,715,717],{"class":290,"line":327},[288,714,295],{"class":294},[288,716,692],{"class":307},[288,718,358],{"class":307},[138,720,721,722,724],{},"Agora adicione uma trava local para que a ",[142,723,192],{}," só possa avançar por fast-forward. O Git vai recusar qualquer merge que não seja um fast-forward:",[160,726,728],{"className":282,"code":727,"language":284,"meta":166,"style":166},"git config branch.production.mergeOptions --ff-only\n",[142,729,730],{"__ignoreMap":166},[288,731,732,734,736,739],{"class":290,"line":291},[288,733,295],{"class":294},[288,735,308],{"class":307},[288,737,738],{"class":307}," branch.production.mergeOptions",[288,740,741],{"class":298}," --ff-only\n",[138,743,744],{},[147,745,375],{},[160,747,750],{"className":748,"code":749,"language":165,"meta":166},[163],"Create branch `production` from `stage`, push it with upstream tracking,\nswitch back to `stage`, then run\n`git config branch.production.mergeOptions --ff-only`.\nConfirm the result with `git branch -vv`.\n",[142,751,749],{"__ignoreMap":166},[155,753,755,756,758,759],{"id":754},"etapa-5-torne-a-stage-a-branch-padrão-e-remova-a-main","Etapa 5: torne a ",[142,757,183],{}," a branch padrão e remova a ",[142,760,228],{},[138,762,763,764,766,767,770,771,773],{},"Quem decide a branch padrão é o GitHub, não o seu Git local. Mesmo em um repositório vazio ela pode continuar sendo a ",[142,765,228],{},", então confira explicitamente. O GitHub exige ",[147,768,769],{},"mais de uma branch"," para trocar a padrão, e é por isso que a ",[142,772,192],{}," precisava existir antes.",[138,775,776,777,780,781,783,784,787],{},"No navegador: ",[147,778,779],{},"Settings → Branches → Default branch",", clique no ícone de troca, escolha ",[142,782,183],{},", ",[147,785,786],{},"Update"," e confirme. Pela CLI:",[160,789,791],{"className":282,"code":790,"language":284,"meta":166,"style":166},"gh repo edit --default-branch stage\n",[142,792,793],{"__ignoreMap":166},[288,794,795,797,799,802,805],{"class":290,"line":291},[288,796,262],{"class":294},[288,798,591],{"class":307},[288,800,801],{"class":307}," edit",[288,803,804],{"class":298}," --default-branch",[288,806,358],{"class":307},[138,808,809,810,812,813,816],{},"Depois veja o que existe no remoto e, se a ",[142,811,228],{}," estiver lá (por exemplo, porque o repositório foi criado com um README), apague-a. Faça isso ",[147,814,815],{},"depois"," de trocar a padrão, nunca antes:",[160,818,820],{"className":282,"code":819,"language":284,"meta":166,"style":166},"git ls-remote --heads origin\n",[142,821,822],{"__ignoreMap":166},[288,823,824,826,829,832],{"class":290,"line":291},[288,825,295],{"class":294},[288,827,828],{"class":307}," ls-remote",[288,830,831],{"class":298}," --heads",[288,833,834],{"class":307}," origin\n",[160,836,838],{"className":282,"code":837,"language":284,"meta":166,"style":166},"git push origin --delete main\n",[142,839,840],{"__ignoreMap":166},[288,841,842,844,846,848,851],{"class":290,"line":291},[288,843,295],{"class":294},[288,845,651],{"class":307},[288,847,630],{"class":307},[288,849,850],{"class":298}," --delete",[288,852,853],{"class":307}," main\n",[138,855,856],{},"Por fim, atualize o seu ponteiro local para a branch padrão do remoto:",[160,858,860],{"className":282,"code":859,"language":284,"meta":166,"style":166},"git remote set-head origin --auto\n",[142,861,862],{"__ignoreMap":166},[288,863,864,866,868,871,873],{"class":290,"line":291},[288,865,295],{"class":294},[288,867,625],{"class":307},[288,869,870],{"class":307}," set-head",[288,872,630],{"class":307},[288,874,875],{"class":298}," --auto\n",[138,877,878,879,881,882,884],{},"Se a ",[142,880,228],{}," foi criada com um README, ela tem um histórico sem relação com o seu. Não faça merge dela na ",[142,883,183],{},"; apenas apague.",[138,886,887],{},[147,888,375],{},[160,890,893],{"className":891,"code":892,"language":165,"meta":166},[163],"Check which branch is the GitHub default with\n`gh repo view --json defaultBranchRef`. If it is not `stage`, run\n`gh repo edit --default-branch stage`. Then run\n`git ls-remote --heads origin`. If `main` exists, tell me and WAIT for my\nconfirmation before running `git push origin --delete main`. Finish with\n`git remote set-head origin --auto`.\n",[142,894,892],{"__ignoreMap":166},[155,896,898],{"id":897},"etapa-6-travas-no-github-se-o-seu-plano-tiver","Etapa 6: travas no GitHub (se o seu plano tiver)",[138,900,901,902,905,906,908],{},"A trava local ",[142,903,904],{},"--ff-only"," não custa nada e não depende de plano. No GitHub, a proteção de branches e os rulesets dependem do seu plano e da visibilidade do repositório (os rulesets estão documentados para os planos GitHub Team e GitHub Enterprise). Se o seu plano oferecer, proteja a ",[142,907,192],{}," bloqueando force pushes e restringindo exclusões. Se não, o processo e a trava local bastam, desde que você nunca faça force-push.",[155,910,912],{"id":911},"etapa-7-o-dia-a-dia","Etapa 7: o dia a dia",[138,914,915,916,918],{},"Trabalhando sozinho, faça commit na ",[142,917,183],{}," e envie:",[160,920,922],{"className":282,"code":921,"language":284,"meta":166,"style":166},"git switch stage\ngit add -A\ngit commit -m \"feat: describe the change\"\ngit push\n",[142,923,924,932,940,955],{"__ignoreMap":166},[288,925,926,928,930],{"class":290,"line":291},[288,927,295],{"class":294},[288,929,692],{"class":307},[288,931,358],{"class":307},[288,933,934,936,938],{"class":290,"line":302},[288,935,295],{"class":294},[288,937,462],{"class":307},[288,939,465],{"class":298},[288,941,942,944,946,948,950,953],{"class":290,"line":327},[288,943,295],{"class":294},[288,945,529],{"class":307},[288,947,532],{"class":298},[288,949,318],{"class":317},[288,951,952],{"class":307},"feat: describe the change",[288,954,324],{"class":317},[288,956,957,959],{"class":290,"line":346},[288,958,295],{"class":294},[288,960,961],{"class":307}," push\n",[138,963,964,965,967],{},"Trabalhando em equipe, use branches curtas e pull requests para a ",[142,966,183],{},":",[160,969,971],{"className":282,"code":970,"language":284,"meta":166,"style":166},"git switch -c feat\u002Fbilling-copy\ngit push -u origin feat\u002Fbilling-copy\n",[142,972,973,984],{"__ignoreMap":166},[288,974,975,977,979,981],{"class":290,"line":291},[288,976,295],{"class":294},[288,978,692],{"class":307},[288,980,695],{"class":298},[288,982,983],{"class":307}," feat\u002Fbilling-copy\n",[288,985,986,988,990,992,994],{"class":290,"line":302},[288,987,295],{"class":294},[288,989,651],{"class":307},[288,991,654],{"class":298},[288,993,630],{"class":307},[288,995,983],{"class":307},[138,997,998,999,218,1005,783,1008,783,1011,783,1014,1017],{},"Use ",[272,1000,1004],{"href":1001,"rel":1002},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[1003],"nofollow","Conventional Commits",[142,1006,1007],{},"feat:",[142,1009,1010],{},"fix:",[142,1012,1013],{},"docs:",[142,1015,1016],{},"chore:","). O próprio histórico do Nuxfire os segue, o que deixa as notas de release quase de graça.",[155,1019,1021],{"id":1020},"etapa-8-o-portão-antes-do-primeiro-lançamento","Etapa 8: o portão antes do primeiro lançamento",[138,1023,1024,1025,1027],{},"Nada chega à ",[142,1026,192],{}," sem passar pelas mesmas verificações, sempre:",[160,1029,1031],{"className":282,"code":1030,"language":284,"meta":166,"style":166},"bun install\nbun run test\nbun run doctor -- --stage production\n",[142,1032,1033,1041,1051],{"__ignoreMap":166},[288,1034,1035,1038],{"class":290,"line":291},[288,1036,1037],{"class":294},"bun",[288,1039,1040],{"class":307}," install\n",[288,1042,1043,1045,1048],{"class":290,"line":302},[288,1044,1037],{"class":294},[288,1046,1047],{"class":307}," run",[288,1049,1050],{"class":307}," test\n",[288,1052,1053,1055,1057,1060,1063,1066],{"class":290,"line":327},[288,1054,1037],{"class":294},[288,1056,1047],{"class":307},[288,1058,1059],{"class":307}," doctor",[288,1061,1062],{"class":298}," --",[288,1064,1065],{"class":298}," --stage",[288,1067,698],{"class":307},[138,1069,498,1070,1073,1074,1077],{},[142,1071,1072],{},"doctor"," é a verificação prévia do deploy: valida seu token da Cloudflare, seus valores ",[142,1075,1076],{},"BRAND_*",", os segredos do banco e a zona do domínio, e diz a correção exata de cada problema antes que você gaste minutos em um deploy que vai falhar.",[138,1079,1080,1081,1084,1085,967],{},"Para um primeiro produto, faça o deploy de um ",[147,1082,1083],{},"estágio de validação"," antes da produção. Um estágio que não é de produção ganha seus próprios Workers, conexão de banco e segredos, e responde em ",[142,1086,1087],{},"\u003Cstage>.dev.\u003Cseu-domínio>",[160,1089,1091],{"className":282,"code":1090,"language":284,"meta":166,"style":166},"bun run deploy -- --stage stage\n",[142,1092,1093],{"__ignoreMap":166},[288,1094,1095,1097,1099,1102,1104,1106],{"class":290,"line":291},[288,1096,1037],{"class":294},[288,1098,1047],{"class":307},[288,1100,1101],{"class":307}," deploy",[288,1103,1062],{"class":298},[288,1105,1065],{"class":298},[288,1107,358],{"class":307},[138,1109,498,1110,1113,1114,783,1118,232,1122,1126,1127,506,1130,1133,1134,1137],{},[142,1111,1112],{},"--"," é necessário para que a flag chegue ao script. O token e os segredos estão em ",[272,1115,1117],{"href":1116},"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fcloudflare-access","Acesso à Cloudflare",[272,1119,1121],{"href":1120},"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fsecrets","Secrets",[272,1123,1125],{"href":1124},"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fdeploy","Deploy",". Um pré-requisito só da produção vale conhecer desde já: o domínio raiz e o ",[142,1128,1129],{},"www",[147,1131,1132],{},"não"," podem ter nenhum registro A, AAAA ou CNAME no seu DNS, senão a Cloudflare rejeita o domínio personalizado (erro ",[142,1135,1136],{},"100117",").",[138,1139,1140],{},[147,1141,375],{},[160,1143,1146],{"className":1144,"code":1145,"language":165,"meta":166},[163],"Run `bun install`, `bun run test` and\n`bun run doctor -- --stage production`. Report every failure with its\nexact message and the fix. Do NOT deploy anything.\n",[142,1147,1145],{"__ignoreMap":166},[155,1149,1151],{"id":1150},"etapa-9-o-primeiro-lançamento","Etapa 9: o primeiro lançamento",[138,1153,1154,1155,1157],{},"Tudo está verde na ",[142,1156,183],{},". Promova-a:",[160,1159,1161],{"className":282,"code":1160,"language":284,"meta":166,"style":166},"git status\ngit push origin stage\n",[142,1162,1163,1170],{"__ignoreMap":166},[288,1164,1165,1167],{"class":290,"line":291},[288,1166,295],{"class":294},[288,1168,1169],{"class":307}," status\n",[288,1171,1172,1174,1176,1178],{"class":290,"line":302},[288,1173,295],{"class":294},[288,1175,651],{"class":307},[288,1177,630],{"class":307},[288,1179,358],{"class":307},[138,1181,498,1182,1185,1186,1188,1189,967],{},[142,1183,1184],{},"git status"," precisa dizer que a árvore de trabalho está limpa. Agora avance a ",[142,1187,192],{}," por fast-forward para exatamente o mesmo commit, sem sair da ",[142,1190,183],{},[160,1192,1194],{"className":282,"code":1193,"language":284,"meta":166,"style":166},"git push origin stage:production\n",[142,1195,1196],{"__ignoreMap":166},[288,1197,1198,1200,1202,1204],{"class":290,"line":291},[288,1199,295],{"class":294},[288,1201,651],{"class":307},[288,1203,630],{"class":307},[288,1205,1206],{"class":307}," stage:production\n",[138,1208,1209,1210,1212],{},"Esse push só é aceito se for um fast-forward puro. Confirme que as duas branches são idênticas e mude para a ",[142,1211,192],{},", porque é dela que você faz o deploy:",[160,1214,1216],{"className":282,"code":1215,"language":284,"meta":166,"style":166},"git fetch origin\ngit diff --stat stage origin\u002Fproduction\ngit switch production\ngit pull --ff-only\n",[142,1217,1218,1227,1242,1250],{"__ignoreMap":166},[288,1219,1220,1222,1225],{"class":290,"line":291},[288,1221,295],{"class":294},[288,1223,1224],{"class":307}," fetch",[288,1226,834],{"class":307},[288,1228,1229,1231,1233,1236,1239],{"class":290,"line":302},[288,1230,295],{"class":294},[288,1232,472],{"class":307},[288,1234,1235],{"class":298}," --stat",[288,1237,1238],{"class":307}," stage",[288,1240,1241],{"class":307}," origin\u002Fproduction\n",[288,1243,1244,1246,1248],{"class":290,"line":327},[288,1245,295],{"class":294},[288,1247,692],{"class":307},[288,1249,698],{"class":307},[288,1251,1252,1254,1257],{"class":290,"line":346},[288,1253,295],{"class":294},[288,1255,1256],{"class":307}," pull",[288,1258,741],{"class":298},[138,1260,498,1261,1264],{},[142,1262,1263],{},"diff"," precisa imprimir nada. Rode a verificação prévia mais uma vez e faça o deploy:",[160,1266,1268],{"className":282,"code":1267,"language":284,"meta":166,"style":166},"bun run doctor -- --stage production\nbun run deploy -- --stage production\n",[142,1269,1270,1284],{"__ignoreMap":166},[288,1271,1272,1274,1276,1278,1280,1282],{"class":290,"line":291},[288,1273,1037],{"class":294},[288,1275,1047],{"class":307},[288,1277,1059],{"class":307},[288,1279,1062],{"class":298},[288,1281,1065],{"class":298},[288,1283,698],{"class":307},[288,1285,1286,1288,1290,1292,1294,1296],{"class":290,"line":302},[288,1287,1037],{"class":294},[288,1289,1047],{"class":307},[288,1291,1101],{"class":307},[288,1293,1062],{"class":298},[288,1295,1065],{"class":298},[288,1297,698],{"class":307},[138,1299,1300],{},"Só depois que o deploy der certo, marque a release com uma tag e volte a trabalhar:",[160,1302,1304],{"className":282,"code":1303,"language":284,"meta":166,"style":166},"git tag -a v1.0.0 -m \"First production release\"\ngit push origin v1.0.0\ngit switch stage\n",[142,1305,1306,1328,1339],{"__ignoreMap":166},[288,1307,1308,1310,1313,1316,1319,1321,1323,1326],{"class":290,"line":291},[288,1309,295],{"class":294},[288,1311,1312],{"class":307}," tag",[288,1314,1315],{"class":298}," -a",[288,1317,1318],{"class":307}," v1.0.0",[288,1320,532],{"class":298},[288,1322,318],{"class":317},[288,1324,1325],{"class":307},"First production release",[288,1327,324],{"class":317},[288,1329,1330,1332,1334,1336],{"class":290,"line":302},[288,1331,295],{"class":294},[288,1333,651],{"class":307},[288,1335,630],{"class":307},[288,1337,1338],{"class":307}," v1.0.0\n",[288,1340,1341,1343,1345],{"class":290,"line":327},[288,1342,295],{"class":294},[288,1344,692],{"class":307},[288,1346,358],{"class":307},[138,1348,1349,1350,1352,1353,1355],{},"Se o deploy falhar, não edite a ",[142,1351,192],{},". Corrija adiante na ",[142,1354,183],{},", rode o portão de novo e repita o fast-forward. A branch pode ficar brevemente à frente do que está no ar, e a ausência da tag mostra exatamente isso.",[138,1357,1358],{},[147,1359,375],{},[160,1361,1364],{"className":1362,"code":1363,"language":165,"meta":166},[163],"Release checklist for the first release. Stop at the first failure:\n1. `git status` must be clean and on `stage`.\n2. `git push origin stage`.\n3. `git push origin stage:production`. If it is rejected, STOP and show\n   me `git log --oneline stage..production`. Never force.\n4. `git switch production && git pull --ff-only`.\n5. `bun run doctor -- --stage production`.\n6. Ask me for explicit confirmation, then run\n   `bun run deploy -- --stage production`.\n7. Only after a successful deploy: `git tag -a v1.0.0 -m \"First\n   production release\"` and `git push origin v1.0.0`.\n8. `git switch stage`.\n",[142,1365,1363],{"__ignoreMap":166},[155,1367,1369],{"id":1368},"etapa-10-impeça-as-duas-branches-de-se-afastarem","Etapa 10: impeça as duas branches de se afastarem",[138,1371,1372,1373,1375,1376,1378],{},"O modo de falha que pega todo mundo uma vez: uma correção cai na ",[142,1374,192],{}," (ou um deploy sai da ",[142,1377,183],{},") e as branches deixam de descrever o mesmo código sem ninguém notar. A verificação é uma linha, e deve sempre imprimir nada:",[160,1380,1382],{"className":282,"code":1381,"language":284,"meta":166,"style":166},"git fetch origin\ngit log --oneline stage..origin\u002Fproduction\n",[142,1383,1384,1392],{"__ignoreMap":166},[288,1385,1386,1388,1390],{"class":290,"line":291},[288,1387,295],{"class":294},[288,1389,1224],{"class":307},[288,1391,834],{"class":307},[288,1393,1394,1396,1399,1402],{"class":290,"line":302},[288,1395,295],{"class":294},[288,1397,1398],{"class":307}," log",[288,1400,1401],{"class":298}," --oneline",[288,1403,1404],{"class":307}," stage..origin\u002Fproduction\n",[138,1406,1407,1408,1410,1411,1413],{},"Se imprimir commits, a ",[142,1409,192],{}," tem trabalho que a ",[142,1412,183],{}," não tem. Uma promoção será rejeitada, e isso está correto. Traga o trabalho de volta, publique e avance de novo:",[160,1415,1417],{"className":282,"code":1416,"language":284,"meta":166,"style":166},"git switch stage\ngit merge origin\u002Fproduction\ngit push origin stage\ngit push origin stage:production\n",[142,1418,1419,1427,1436,1446],{"__ignoreMap":166},[288,1420,1421,1423,1425],{"class":290,"line":291},[288,1422,295],{"class":294},[288,1424,692],{"class":307},[288,1426,358],{"class":307},[288,1428,1429,1431,1434],{"class":290,"line":302},[288,1430,295],{"class":294},[288,1432,1433],{"class":307}," merge",[288,1435,1241],{"class":307},[288,1437,1438,1440,1442,1444],{"class":290,"line":327},[288,1439,295],{"class":294},[288,1441,651],{"class":307},[288,1443,630],{"class":307},[288,1445,358],{"class":307},[288,1447,1448,1450,1452,1454],{"class":290,"line":346},[288,1449,295],{"class":294},[288,1451,651],{"class":307},[288,1453,630],{"class":307},[288,1455,1206],{"class":307},[138,1457,1458,1459,1462],{},"Se o merge relatar conflitos, resolva-os, rode o portão de novo e commite antes de enviar. Nunca resolva isso com ",[142,1460,1461],{},"--force",": você apagaria justamente os commits que quer preservar.",[138,1464,1465],{},[147,1466,375],{},[160,1468,1471],{"className":1469,"code":1470,"language":165,"meta":166},[163],"Run `git fetch origin`, then `git log --oneline stage..origin\u002Fproduction`.\nIf it prints anything: merge origin\u002Fproduction into stage, resolve any\nconflicts together with me, run `bun run test`, push stage, then\nfast-forward production with `git push origin stage:production`.\nNever use --force.\n",[142,1472,1470],{"__ignoreMap":166},[155,1474,1476],{"id":1475},"voltando-atrás","Voltando atrás",[138,1478,1479,1480,1482],{},"Não reescreva a ",[142,1481,192],{},". Faça o deploy do código de uma tag anterior:",[160,1484,1486],{"className":282,"code":1485,"language":284,"meta":166,"style":166},"git tag --sort=-creatordate\ngit switch --detach v1.0.0\nbun run deploy -- --stage production\ngit switch stage\n",[142,1487,1488,1497,1508,1522],{"__ignoreMap":166},[288,1489,1490,1492,1494],{"class":290,"line":291},[288,1491,295],{"class":294},[288,1493,1312],{"class":307},[288,1495,1496],{"class":298}," --sort=-creatordate\n",[288,1498,1499,1501,1503,1506],{"class":290,"line":302},[288,1500,295],{"class":294},[288,1502,692],{"class":307},[288,1504,1505],{"class":298}," --detach",[288,1507,1338],{"class":307},[288,1509,1510,1512,1514,1516,1518,1520],{"class":290,"line":327},[288,1511,1037],{"class":294},[288,1513,1047],{"class":307},[288,1515,1101],{"class":307},[288,1517,1062],{"class":298},[288,1519,1065],{"class":298},[288,1521,698],{"class":307},[288,1523,1524,1526,1528],{"class":290,"line":346},[288,1525,295],{"class":294},[288,1527,692],{"class":307},[288,1529,358],{"class":307},[138,1531,1532,1533,1536,1537,1539],{},"Isso restaura o ",[147,1534,1535],{},"código",". As migrações do banco são aplicadas a cada deploy e não são desfeitas, então planeje mudanças de schema primeiro como aditivas (adicione uma coluna, publique o código que a usa, remova a antiga depois). Em seguida, corrija adiante na ",[142,1538,183],{}," e promova uma nova release.",[138,1541,1542],{},[147,1543,375],{},[160,1545,1548],{"className":1546,"code":1547,"language":165,"meta":166},[163],"Do NOT touch the `production` branch. Show me\n`git tag --sort=-creatordate | head`, ask which tag to restore, run\n`git switch --detach \u003Ctag>`, and ask for my explicit confirmation before\n`bun run deploy -- --stage production`. Afterwards run `git switch stage`.\n",[142,1549,1547],{"__ignoreMap":166},[155,1551,1553],{"id":1552},"quando-algo-dá-errado","Quando algo dá errado",[1555,1556,1557,1573],"table",{},[1558,1559,1560],"thead",{},[1561,1562,1563,1567,1570],"tr",{},[1564,1565,1566],"th",{},"O que você vê",[1564,1568,1569],{},"O que significa",[1564,1571,1572],{},"O que fazer",[1574,1575,1576,1595,1610,1626,1645,1659],"tbody",{},[1561,1577,1578,1584,1592],{},[1579,1580,1581],"td",{},[142,1582,1583],{},"[rejected] stage -> production (non-fast-forward)",[1579,1585,189,1586,1588,1589,1591],{},[142,1587,192],{}," tem commits que a ",[142,1590,183],{}," não tem",[1579,1593,1594],{},"Etapa 10. Nunca use force.",[1561,1596,1597,1602,1607],{},[1579,1598,1599],{},[142,1600,1601],{},"fatal: Not possible to fast-forward, aborting.",[1579,1603,1604,1605],{},"A trava local impediu um merge na ",[142,1606,192],{},[1579,1608,1609],{},"Mesma causa e mesma solução acima",[1561,1611,1612,1617,1620],{},[1579,1613,1614,1615],{},"O GitHub não deixa apagar a ",[142,1616,228],{},[1579,1618,1619],{},"Em geral, ela ainda é a branch padrão",[1579,1621,1622,1623,1625],{},"Troque a padrão para ",[142,1624,183],{}," primeiro (Etapa 5)",[1561,1627,1628,1637,1642],{},[1579,1629,1630,1631,1633,1634],{},"Um arquivo ",[142,1632,513],{}," aparece em ",[142,1635,1636],{},"git diff --cached",[1579,1638,1639,1640],{},"Falta uma regra no ",[142,1641,406],{},[1579,1643,1644],{},"Corrija antes do commit, nunca depois",[1561,1646,1647,1650,1653],{},[1579,1648,1649],{},"Você fez o deploy da branch errada",[1579,1651,1652],{},"O deploy publica a árvore em checkout",[1579,1654,1655,1658],{},[142,1656,1657],{},"git branch --show-current"," antes de todo deploy",[1561,1660,1661,1667,1670],{},[1579,1662,1663,1664,1666],{},"Erro de domínio ",[142,1665,1136],{}," no primeiro deploy de produção",[1579,1668,1669],{},"O hostname já tem um registro DNS",[1579,1671,1672],{},"Apague o registro A, AAAA ou CNAME e faça o deploy de novo",[155,1674,1676],{"id":1675},"checklist","Checklist",[241,1678,1681,1696,1708,1719,1731,1743,1752],{"className":1679},[1680],"contains-task-list",[176,1682,1685,1690,1691,232,1693,1695],{"className":1683},[1684],"task-list-item",[1686,1687],"input",{"disabled":1688,"type":1689},true,"checkbox"," O repositório é privado e só existem ",[142,1692,183],{},[142,1694,192],{}," no remoto",[176,1697,1699,1701,1702,1704,1705,1707],{"className":1698},[1684],[1686,1700],{"disabled":1688,"type":1689}," A ",[142,1703,183],{}," é a branch padrão e a ",[142,1706,228],{}," não existe mais",[176,1709,1711,506,1713,1716,1717],{"className":1710},[1684],[1686,1712],{"disabled":1688,"type":1689},[142,1714,1715],{},"git config branch.production.mergeOptions"," imprime ",[142,1718,904],{},[176,1720,1722,1724,1725,1727,1728,1730],{"className":1721},[1684],[1686,1723],{"disabled":1688,"type":1689}," Nenhum arquivo ",[142,1726,513],{},", exceto ",[142,1729,509],{},", está versionado",[176,1732,1734,506,1736,232,1739,1742],{"className":1733},[1684],[1686,1735],{"disabled":1688,"type":1689},[142,1737,1738],{},"bun run test",[142,1740,1741],{},"bun run doctor -- --stage production"," estão verdes",[176,1744,1746,506,1748,1751],{"className":1745},[1684],[1686,1747],{"disabled":1688,"type":1689},[142,1749,1750],{},"git diff --stat stage origin\u002Fproduction"," imprime nada antes do deploy",[176,1753,1755,1757],{"className":1754},[1684],[1686,1756],{"disabled":1688,"type":1689}," A release só foi marcada com tag depois que o deploy deu certo",[138,1759,1760,1761,1763,1764,232,1766,150],{},"De volta à configuração: siga para ",[272,1762,1117],{"href":1116}," para criar o token de API, depois ",[272,1765,1121],{"href":1120},[272,1767,1125],{"href":1124},[1769,1770,1771],"style",{},"html pre.shiki code .sR7ES, html code.shiki .sR7ES{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sFhLe, html code.shiki .sFhLe{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}",{"title":166,"searchDepth":302,"depth":302,"links":1773},[1774,1775,1776,1777,1778,1780,1782,1784,1785,1786,1787,1788,1789,1790,1791],{"id":157,"depth":302,"text":158},{"id":238,"depth":302,"text":239},{"id":278,"depth":302,"text":279},{"id":384,"depth":302,"text":385},{"id":558,"depth":302,"text":1779},"Etapa 3: crie o repositório no GitHub e envie a stage",{"id":671,"depth":302,"text":1781},"Etapa 4: crie a production",{"id":754,"depth":302,"text":1783},"Etapa 5: torne a stage a branch padrão e remova a main",{"id":897,"depth":302,"text":898},{"id":911,"depth":302,"text":912},{"id":1020,"depth":302,"text":1021},{"id":1150,"depth":302,"text":1151},{"id":1368,"depth":302,"text":1369},{"id":1475,"depth":302,"text":1476},{"id":1552,"depth":302,"text":1553},{"id":1675,"depth":302,"text":1676},"DevOps","2026-09-25","Um manual de nível sênior para quem acabou de adquirir o Nuxfire: crie o repositório, torne a stage a branch padrão, remova a main, promova para production por fast-forward e publique sua primeira versão com segurança.","md","\u002Fimages\u002Fblog\u002Fgit-branching-stage-production.svg","pt-br",{},"\u002Fimages\u002Fblog\u002Fgit-branching-stage-production.png","\u002Fblog\u002Fgit-branches-stage-production-primeiro-lancamento","14 min",{"title":131,"description":1794},"blog\u002Fgit-branches-stage-production-primeiro-lancamento",[1805,1806,1807,1808,1125,1809],"Git","GitHub","Branching","Release","SST",{"en":1811,"pt-br":1812,"es":1813},"git-branching-stage-production-first-release","git-branches-stage-production-primeiro-lancamento","git-ramas-stage-production-primer-lanzamiento","D9JQpAP_iVq5OXP1v3ulPn14KXjRyp-5w_8__oAJClg",1794055329842]