[{"data":1,"prerenderedAt":2327},["ShallowReactive",2],{"doc:\u002Fgit":3},{"id":4,"title":5,"body":6,"description":2320,"extension":2321,"meta":2322,"navigation":2323,"path":2324,"seo":2325,"stem":555,"__hash__":2326},"docs\u002Fgit.md","Git: commits, ramas y flujos",{"type":7,"value":8,"toc":2292},"minimark",[9,14,23,34,39,50,114,125,129,140,143,216,223,230,235,303,310,314,325,331,364,376,382,386,447,456,460,529,536,540,615,618,632,639,643,684,694,721,733,737,834,840,844,894,901,907,911,980,996,1000,1007,1013,1016,1032,1043,1047,1127,1136,1179,1183,1189,1192,1210,1213,1217,1223,1229,1232,1280,1283,1337,1340,1401,1408,1455,1459,1471,1580,1583,1626,1632,1635,1650,1656,1664,1668,1743,1746,1750,1760,1870,1887,1891,1942,1945,1949,1983,1986,1990,2149,2153,2210,2213,2270,2273,2279,2282,2288],[10,11,13],"h1",{"id":12},"git-commits-ramas-y-flujos-de-trabajo","Git: commits, ramas y flujos de trabajo",[15,16,17,18,22],"p",{},"Git es un ",[19,20,21],"strong",{},"sistema de control de versiones",": guarda el historial de un\nproyecto para que puedas volver atrás, comparar cambios y trabajar con otras\npersonas sin pisarse. No es una carpeta en la nube ni un botón de \"guardar\":\nes una base de datos de estados del proyecto.",[15,24,25,26,29,30,33],{},"Este documento va de menos a más. Primero, qué es un commit y qué es una rama\n(los dos conceptos sin los cuales nada de lo demás se entiende). Después, cómo\nusarlos. Al final, dos formas de organizar el trabajo en equipo: ",[19,27,28],{},"GitHub\nFlow"," y ",[19,31,32],{},"Git Flow",".",[35,36,38],"h2",{"id":37},"el-modelo-mental","El modelo mental",[40,41,46],"pre",{"className":42,"code":44,"language":45},[43],"language-text","directorio de trabajo   →   staging area   →   repositorio   →   remoto\n   (tus archivos)           (git add)        (git commit)      (git push)\n","text",[47,48,44],"code",{"__ignoreMap":49},"",[51,52,53,66],"table",{},[54,55,56],"thead",{},[57,58,59,63],"tr",{},[60,61,62],"th",{},"Lugar",[60,64,65],{},"Qué hay",[67,68,69,80,91,104],"tbody",{},[57,70,71,77],{},[72,73,74],"td",{},[19,75,76],{},"directorio de trabajo",[72,78,79],{},"los archivos tal como los ves y editas",[57,81,82,88],{},[72,83,84,87],{},[19,85,86],{},"staging area"," (índice)",[72,89,90],{},"lo que va a entrar en el próximo commit",[57,92,93,98],{},[72,94,95],{},[19,96,97],{},"repositorio local",[72,99,100,101],{},"el historial de commits, en ",[47,102,103],{},".git\u002F",[57,105,106,111],{},[72,107,108],{},[19,109,110],{},"remoto",[72,112,113],{},"la copia en GitHub, GitLab o el servidor que uses, para compartir y respaldar",[15,115,116,117,120,121,124],{},"Cuando guardas un archivo con ",[47,118,119],{},"Ctrl+S",", pisas la versión anterior. Git hace lo\ncontrario: ",[19,122,123],{},"agrega"," un estado nuevo al historial y deja el anterior intacto.\nEso es lo que permite volver atrás.",[35,126,128],{"id":127},"qué-es-un-commit","Qué es un commit",[15,130,131,132,135,136,139],{},"Un ",[19,133,134],{},"commit"," es una ",[19,137,138],{},"foto del proyecto completo"," en un momento dado, con una\netiqueta que la identifica. No guarda \"solo las líneas que cambiaron\": guarda el\nestado de todos los archivos que estaban en el staging area, más los datos de\nquién lo hizo y cuándo.",[15,141,142],{},"Cada commit contiene:",[51,144,145,155],{},[54,146,147],{},[57,148,149,152],{},[60,150,151],{},"Dato",[60,153,154],{},"Para qué sirve",[67,156,157,167,177,191,206],{},[57,158,159,164],{},[72,160,161],{},[19,162,163],{},"snapshot",[72,165,166],{},"el contenido de los archivos en ese momento",[57,168,169,174],{},[72,170,171],{},[19,172,173],{},"autor y fecha",[72,175,176],{},"saber quién hizo el cambio y cuándo",[57,178,179,184],{},[72,180,181],{},[19,182,183],{},"mensaje",[72,185,186,187,190],{},"explicar ",[19,188,189],{},"por qué"," se hizo",[57,192,193,203],{},[72,194,195,198,199,202],{},[19,196,197],{},"hash"," (por ejemplo ",[47,200,201],{},"a1b2c3d",")",[72,204,205],{},"un identificador único para nombrarlo",[57,207,208,213],{},[72,209,210],{},[19,211,212],{},"commit padre",[72,214,215],{},"el commit anterior, que forma una cadena",[15,217,218,219,222],{},"Pensalo como ",[19,220,221],{},"guardar la partida"," de un videojuego: no modificas la partida\nanterior, creas una nueva. Si algo sale mal, cargas la anterior.",[15,224,225,226,229],{},"Los commits se encadenan. La rama en la que estás apunta al último commit, y\nese commit apunta a su padre. ",[47,227,228],{},"HEAD"," es el nombre que Git le da a \"el commit\ndonde estás parado ahora\".",[231,232,234],"h3",{"id":233},"por-qué-te-conviene-commitear","Por qué te conviene commitear",[51,236,237,247],{},[54,238,239],{},[57,240,241,244],{},[60,242,243],{},"Ventaja",[60,245,246],{},"Qué te resuelve",[67,248,249,257,271,279,287,295],{},[57,250,251,254],{},[72,252,253],{},"Volver atrás",[72,255,256],{},"si rompiste algo, recuperas un estado que funcionaba",[57,258,259,262],{},[72,260,261],{},"Entender el pasado",[72,263,264,29,267,270],{},[47,265,266],{},"git log",[47,268,269],{},"git diff"," muestran qué cambió y cuándo",[57,272,273,276],{},[72,274,275],{},"Probar sin miedo",[72,277,278],{},"puedes experimentar sabiendo que hay una red de seguridad",[57,280,281,284],{},[72,282,283],{},"Trabajar en paralelo",[72,285,286],{},"otras personas pueden partir del mismo historial",[57,288,289,292],{},[72,290,291],{},"Respaldar",[72,293,294],{},"el remoto guarda una copia fuera de tu máquina",[57,296,297,300],{},[72,298,299],{},"Revisar",[72,301,302],{},"un cambio chico se lee y se discute mucho mejor que uno gigante",[15,304,305,306,309],{},"La regla práctica: ",[19,307,308],{},"commitea seguido y en pasos con sentido",". Un commit que\nmezcla \"arreglo el login\", \"cambio el color del botón\" y \"actualizo la\ndocumentación\" no se puede revertir sin arrastrar lo demás.",[35,311,313],{"id":312},"qué-es-una-rama","Qué es una rama",[15,315,316,317,320,321,324],{},"Una ",[19,318,319],{},"rama"," es un ",[19,322,323],{},"nombre que apunta a un commit",". Nada más. No es una copia\nde la carpeta ni un proyecto paralelo: es una etiqueta móvil que dice \"esta\nlínea de trabajo va por aquí\".",[40,326,329],{"className":327,"code":328,"language":45},[43],"main      A ── B ── C\n                    \\\nfeature             D ── E\n",[47,330,328],{"__ignoreMap":49},[332,333,334,344,352],"ul",{},[335,336,337,340,341,33],"li",{},[47,338,339],{},"main"," apunta a ",[47,342,343],{},"C",[335,345,346,340,349,33],{},[47,347,348],{},"feature",[47,350,351],{},"E",[335,353,354,355,358,359,29,362,33],{},"Las dos ramas comparten los commits ",[47,356,357],{},"A",", ",[47,360,361],{},"B",[47,363,343],{},[15,365,366,367,369,370,372,373,375],{},"Cuando haces un commit estando en ",[47,368,348],{},", el puntero ",[47,371,348],{}," avanza al\ncommit nuevo. ",[47,374,339],{}," se queda donde estaba. Por eso crear una rama es\ninstantáneo: solo se crea un nombre nuevo.",[15,377,131,378,381],{},[19,379,380],{},"merge"," es unir dos líneas de trabajo: traer los commits de una rama a la\notra y crear un commit que las conecta (o reubicar los commits, si se usa\nrebase).",[231,383,385],{"id":384},"por-qué-te-conviene-usar-ramas","Por qué te conviene usar ramas",[51,387,388,396],{},[54,389,390],{},[57,391,392,394],{},[60,393,243],{},[60,395,246],{},[67,397,398,408,416,424,431,439],{},[57,399,400,403],{},[72,401,402],{},"Aislar un cambio",[72,404,405,407],{},[47,406,339],{}," sigue funcionando mientras pruebas algo",[57,409,410,413],{},[72,411,412],{},"Experimentar",[72,414,415],{},"si la idea no sirve, borras la rama y listo",[57,417,418,421],{},[72,419,420],{},"Revisar mejor",[72,422,423],{},"el cambio completo se ve junto, separado del resto",[57,425,426,428],{},[72,427,283],{},[72,429,430],{},"dos personas no se pisan en la misma línea",[57,432,433,436],{},[72,434,435],{},"Revertir sin drama",[72,437,438],{},"si el cambio salió mal, se revierte esa rama",[57,440,441,444],{},[72,442,443],{},"Ordenar el historial",[72,445,446],{},"cada rama cuenta una historia con principio y fin",[15,448,449,451,452,455],{},[47,450,339],{}," (o ",[47,453,454],{},"master"," en proyectos viejos) es la rama principal: la que se supone\nque siempre funciona. Las demás son temporales y se borran después de integrarse.",[35,457,459],{"id":458},"por-qué-conviene-usar-git-y-no-solo-guardar-como","Por qué conviene usar Git (y no solo \"guardar como\")",[51,461,462,472],{},[54,463,464],{},[57,465,466,469],{},[60,467,468],{},"Sin Git",[60,470,471],{},"Con Git",[67,473,474,484,494,502,513,521],{},[57,475,476,481],{},[72,477,478],{},[47,479,480],{},"trabajo_final_v2_este_si.zip",[72,482,483],{},"un historial legible de commits",[57,485,486,489],{},[72,487,488],{},"no sabes qué cambió entre versiones",[72,490,491,493],{},[47,492,269],{}," responde en segundos",[57,495,496,499],{},[72,497,498],{},"dos personas se pisan los archivos",[72,500,501],{},"ramas separadas y merges controlados",[57,503,504,507],{},[72,505,506],{},"un error borra horas de trabajo",[72,508,509,512],{},[47,510,511],{},"git reflog"," recupera casi todo",[57,514,515,518],{},[72,516,517],{},"no hay respaldo fuera de tu máquina",[72,519,520],{},"el remoto guarda una copia",[57,522,523,526],{},[72,524,525],{},"no puedes explicar por qué cambió algo",[72,527,528],{},"el mensaje del commit lo explica",[15,530,531,532,535],{},"Git no te obliga a trabajar de una sola forma. Te da las piezas; el ",[19,533,534],{},"flujo de\ntrabajo"," es el acuerdo de cómo usarlas en equipo.",[35,537,539],{"id":538},"configuración-inicial-una-sola-vez","Configuración inicial (una sola vez)",[40,541,545],{"className":542,"code":543,"language":544,"meta":49,"style":49},"language-sh shiki shiki-themes github-light github-dark","git config --global user.name \"Tu Nombre\"\ngit config --global user.email \"tu@email.com\"\ngit config --global init.defaultBranch main\ngit config --global pull.rebase false\n","sh",[47,546,547,570,585,600],{"__ignoreMap":49},[548,549,552,556,560,564,567],"span",{"class":550,"line":551},"line",1,[548,553,555],{"class":554},"sScJk","git",[548,557,559],{"class":558},"sZZnC"," config",[548,561,563],{"class":562},"sj4cs"," --global",[548,565,566],{"class":558}," user.name",[548,568,569],{"class":558}," \"Tu Nombre\"\n",[548,571,573,575,577,579,582],{"class":550,"line":572},2,[548,574,555],{"class":554},[548,576,559],{"class":558},[548,578,563],{"class":562},[548,580,581],{"class":558}," user.email",[548,583,584],{"class":558}," \"tu@email.com\"\n",[548,586,588,590,592,594,597],{"class":550,"line":587},3,[548,589,555],{"class":554},[548,591,559],{"class":558},[548,593,563],{"class":562},[548,595,596],{"class":558}," init.defaultBranch",[548,598,599],{"class":558}," main\n",[548,601,603,605,607,609,612],{"class":550,"line":602},4,[548,604,555],{"class":554},[548,606,559],{"class":558},[548,608,563],{"class":562},[548,610,611],{"class":558}," pull.rebase",[548,613,614],{"class":562}," false\n",[15,616,617],{},"Verificá:",[40,619,621],{"className":542,"code":620,"language":544,"meta":49,"style":49},"git config --list\n",[47,622,623],{"__ignoreMap":49},[548,624,625,627,629],{"class":550,"line":551},[548,626,555],{"class":554},[548,628,559],{"class":558},[548,630,631],{"class":562}," --list\n",[15,633,634,635,638],{},"El nombre y el email quedan ",[19,636,637],{},"dentro de cada commit",". Si están mal, todos tus\ncommits muestran la identidad equivocada.",[35,640,642],{"id":641},"crear-o-traer-un-repositorio","Crear o traer un repositorio",[40,644,646],{"className":542,"code":645,"language":544,"meta":49,"style":49},"git init                    # empieza uno nuevo en la carpeta actual\ngit clone URL               # trae uno existente\ngit clone git@github.com:usuario\u002Frepo.git   # por SSH\n",[47,647,648,659,672],{"__ignoreMap":49},[548,649,650,652,655],{"class":550,"line":551},[548,651,555],{"class":554},[548,653,654],{"class":558}," init",[548,656,658],{"class":657},"sJ8bj","                    # empieza uno nuevo en la carpeta actual\n",[548,660,661,663,666,669],{"class":550,"line":572},[548,662,555],{"class":554},[548,664,665],{"class":558}," clone",[548,667,668],{"class":558}," URL",[548,670,671],{"class":657},"               # trae uno existente\n",[548,673,674,676,678,681],{"class":550,"line":587},[548,675,555],{"class":554},[548,677,665],{"class":558},[548,679,680],{"class":558}," git@github.com:usuario\u002Frepo.git",[548,682,683],{"class":657},"   # por SSH\n",[15,685,686,689,690,693],{},[47,687,688],{},".gitignore"," le dice a Git qué ",[19,691,692],{},"no"," trackear. Para un proyecto en C, lo\nmínimo:",[40,695,699],{"className":696,"code":697,"language":698,"meta":49,"style":49},"language-gitignore shiki shiki-themes github-light github-dark","a.out\n*.o\nprograma\n.DS_Store\n","gitignore",[47,700,701,706,711,716],{"__ignoreMap":49},[548,702,703],{"class":550,"line":551},[548,704,705],{},"a.out\n",[548,707,708],{"class":550,"line":572},[548,709,710],{},"*.o\n",[548,712,713],{"class":550,"line":587},[548,714,715],{},"programa\n",[548,717,718],{"class":550,"line":602},[548,719,720],{},".DS_Store\n",[722,723,724],"blockquote",{},[15,725,726,727,729,730,33],{},"Si ya commiteaste un archivo que ahora está en ",[47,728,688],{},", Git lo sigue\ntrackeando. Hay que sacarlo del índice: ",[47,731,732],{},"git rm --cached archivo",[35,734,736],{"id":735},"el-ciclo-diario","El ciclo diario",[40,738,740],{"className":542,"code":739,"language":544,"meta":49,"style":49},"git status                  # ¿qué cambió?\ngit diff                    # cambios sin stage\ngit diff --staged           # cambios en stage\ngit add archivo.c           # prepara UN archivo\ngit add .                   # prepara todo (revisa con status antes)\ngit commit -m \"Add main\"    # guarda la foto\ngit log --oneline --graph   # historial resumido\n",[47,741,742,752,762,774,787,800,817],{"__ignoreMap":49},[548,743,744,746,749],{"class":550,"line":551},[548,745,555],{"class":554},[548,747,748],{"class":558}," status",[548,750,751],{"class":657},"                  # ¿qué cambió?\n",[548,753,754,756,759],{"class":550,"line":572},[548,755,555],{"class":554},[548,757,758],{"class":558}," diff",[548,760,761],{"class":657},"                    # cambios sin stage\n",[548,763,764,766,768,771],{"class":550,"line":587},[548,765,555],{"class":554},[548,767,758],{"class":558},[548,769,770],{"class":562}," --staged",[548,772,773],{"class":657},"           # cambios en stage\n",[548,775,776,778,781,784],{"class":550,"line":602},[548,777,555],{"class":554},[548,779,780],{"class":558}," add",[548,782,783],{"class":558}," archivo.c",[548,785,786],{"class":657},"           # prepara UN archivo\n",[548,788,790,792,794,797],{"class":550,"line":789},5,[548,791,555],{"class":554},[548,793,780],{"class":558},[548,795,796],{"class":558}," .",[548,798,799],{"class":657},"                   # prepara todo (revisa con status antes)\n",[548,801,803,805,808,811,814],{"class":550,"line":802},6,[548,804,555],{"class":554},[548,806,807],{"class":558}," commit",[548,809,810],{"class":562}," -m",[548,812,813],{"class":558}," \"Add main\"",[548,815,816],{"class":657},"    # guarda la foto\n",[548,818,820,822,825,828,831],{"class":550,"line":819},7,[548,821,555],{"class":554},[548,823,824],{"class":558}," log",[548,826,827],{"class":562}," --oneline",[548,829,830],{"class":562}," --graph",[548,832,833],{"class":657},"   # historial resumido\n",[15,835,836,839],{},[47,837,838],{},"git status"," es el comando que más vas a usar. Si alguna vez no sabes qué está\npasando, empieza por ahí: te dice en qué rama estás, qué está modificado y qué\nestá listo para commitear.",[231,841,843],{"id":842},"buenos-mensajes-de-commit","Buenos mensajes de commit",[51,845,846,856],{},[54,847,848],{},[57,849,850,853],{},[60,851,852],{},"Malo",[60,854,855],{},"Mejor",[67,857,858,870,882],{},[57,859,860,865],{},[72,861,862],{},[47,863,864],{},"cambios",[72,866,867],{},[47,868,869],{},"Fix off-by-one in pagination",[57,871,872,877],{},[72,873,874],{},[47,875,876],{},"arreglo",[72,878,879],{},[47,880,881],{},"Handle empty input without crashing",[57,883,884,889],{},[72,885,886],{},[47,887,888],{},"asd",[72,890,891],{},[47,892,893],{},"Add helper to print one character",[15,895,896,897,900],{},"La convención más usada: ",[19,898,899],{},"imperativo, en inglés, menos de 50 caracteres"," en la\nprimera línea; si hace falta explicar, deja una línea en blanco y un párrafo.",[40,902,905],{"className":903,"code":904,"language":45},[43],"Add guard clause for invalid sizes\n\nWithout it, negative heights make the row condition meaningless\nand the loop never ends.\n",[47,906,904],{"__ignoreMap":49},[35,908,910],{"id":909},"ramas-y-merges","Ramas y merges",[40,912,914],{"className":542,"code":913,"language":544,"meta":49,"style":49},"git switch -c feature\u002Fguard-clause   # crea y cambia\ngit switch main                      # vuelve a main\ngit branch                           # lista ramas\ngit merge feature\u002Fguard-clause       # trae los cambios a la rama actual\ngit branch -d feature\u002Fguard-clause   # borra la rama ya mergeada\n",[47,915,916,932,944,954,966],{"__ignoreMap":49},[548,917,918,920,923,926,929],{"class":550,"line":551},[548,919,555],{"class":554},[548,921,922],{"class":558}," switch",[548,924,925],{"class":562}," -c",[548,927,928],{"class":558}," feature\u002Fguard-clause",[548,930,931],{"class":657},"   # crea y cambia\n",[548,933,934,936,938,941],{"class":550,"line":572},[548,935,555],{"class":554},[548,937,922],{"class":558},[548,939,940],{"class":558}," main",[548,942,943],{"class":657},"                      # vuelve a main\n",[548,945,946,948,951],{"class":550,"line":587},[548,947,555],{"class":554},[548,949,950],{"class":558}," branch",[548,952,953],{"class":657},"                           # lista ramas\n",[548,955,956,958,961,963],{"class":550,"line":602},[548,957,555],{"class":554},[548,959,960],{"class":558}," merge",[548,962,928],{"class":558},[548,964,965],{"class":657},"       # trae los cambios a la rama actual\n",[548,967,968,970,972,975,977],{"class":550,"line":789},[548,969,555],{"class":554},[548,971,950],{"class":558},[548,973,974],{"class":562}," -d",[548,976,928],{"class":558},[548,978,979],{"class":657},"   # borra la rama ya mergeada\n",[722,981,982],{},[15,983,984,987,988,991,992,995],{},[47,985,986],{},"git checkout"," todavía funciona, pero ",[47,989,990],{},"switch"," (ramas) y ",[47,993,994],{},"restore","\n(archivos) son más claros y no se confunden entre sí. Usa esos.",[231,997,999],{"id":998},"conflictos","Conflictos",[15,1001,1002,1003,1006],{},"Un conflicto aparece cuando dos ramas cambiaron ",[19,1004,1005],{},"la misma línea",". Git no\nadivina: te deja el archivo marcado así:",[40,1008,1011],{"className":1009,"code":1010,"language":45},[43],"\u003C\u003C\u003C\u003C\u003C\u003C\u003C HEAD\n    return (0);\n=======\n    return (1);\n>>>>>>> feature\u002Fotra\n",[47,1012,1010],{"__ignoreMap":49},[15,1014,1015],{},"Se resuelve a mano:",[1017,1018,1019,1022,1027],"ol",{},[335,1020,1021],{},"Editas el archivo y dejas el resultado final (borras las marcas).",[335,1023,1024],{},[47,1025,1026],{},"git add archivo",[335,1028,1029],{},[47,1030,1031],{},"git commit",[15,1033,1034,1035,1038,1039,1042],{},"Regla de oro: ",[19,1036,1037],{},"no borres el trabajo del otro sin entenderlo",". Si dudas, mira\n",[47,1040,1041],{},"git log --merge"," o pregunta antes de elegir.",[35,1044,1046],{"id":1045},"remoto-subir-y-bajar","Remoto: subir y bajar",[40,1048,1050],{"className":542,"code":1049,"language":544,"meta":49,"style":49},"git remote -v                       # ¿a dónde apunta?\ngit remote add origin URL           # conecta un repo local con GitHub\ngit push -u origin main             # primera subida (crea el tracking)\ngit push                            # las siguientes\ngit fetch                           # trae novedades SIN tocar tu rama\ngit pull                            # fetch + merge en tu rama actual\n",[47,1051,1052,1065,1081,1098,1107,1117],{"__ignoreMap":49},[548,1053,1054,1056,1059,1062],{"class":550,"line":551},[548,1055,555],{"class":554},[548,1057,1058],{"class":558}," remote",[548,1060,1061],{"class":562}," -v",[548,1063,1064],{"class":657},"                       # ¿a dónde apunta?\n",[548,1066,1067,1069,1071,1073,1076,1078],{"class":550,"line":572},[548,1068,555],{"class":554},[548,1070,1058],{"class":558},[548,1072,780],{"class":558},[548,1074,1075],{"class":558}," origin",[548,1077,668],{"class":558},[548,1079,1080],{"class":657},"           # conecta un repo local con GitHub\n",[548,1082,1083,1085,1088,1091,1093,1095],{"class":550,"line":587},[548,1084,555],{"class":554},[548,1086,1087],{"class":558}," push",[548,1089,1090],{"class":562}," -u",[548,1092,1075],{"class":558},[548,1094,940],{"class":558},[548,1096,1097],{"class":657},"             # primera subida (crea el tracking)\n",[548,1099,1100,1102,1104],{"class":550,"line":602},[548,1101,555],{"class":554},[548,1103,1087],{"class":558},[548,1105,1106],{"class":657},"                            # las siguientes\n",[548,1108,1109,1111,1114],{"class":550,"line":789},[548,1110,555],{"class":554},[548,1112,1113],{"class":558}," fetch",[548,1115,1116],{"class":657},"                           # trae novedades SIN tocar tu rama\n",[548,1118,1119,1121,1124],{"class":550,"line":802},[548,1120,555],{"class":554},[548,1122,1123],{"class":558}," pull",[548,1125,1126],{"class":657},"                            # fetch + merge en tu rama actual\n",[15,1128,1129,29,1132,1135],{},[47,1130,1131],{},"fetch",[47,1133,1134],{},"pull"," no son lo mismo:",[51,1137,1138,1151],{},[54,1139,1140],{},[57,1141,1142,1145,1148],{},[60,1143,1144],{},"Comando",[60,1146,1147],{},"Qué hace",[60,1149,1150],{},"Cuándo",[67,1152,1153,1166],{},[57,1154,1155,1160,1163],{},[72,1156,1157],{},[47,1158,1159],{},"git fetch",[72,1161,1162],{},"actualiza el remoto, no toca tus archivos",[72,1164,1165],{},"quieres ver antes de mezclar",[57,1167,1168,1173,1176],{},[72,1169,1170],{},[47,1171,1172],{},"git pull",[72,1174,1175],{},"fetch + merge",[72,1177,1178],{},"estás seguro y quieres avanzar",[35,1180,1182],{"id":1181},"antes-de-elegir-un-flujo","Antes de elegir un flujo",[15,1184,131,1185,1188],{},[19,1186,1187],{},"flujo de trabajo"," es un acuerdo del equipo sobre cómo se usan las ramas,\nlos commits y los remotos. No hay uno universal ni uno \"correcto\": depende de\ncómo publicas el software, cuánta gente hay y cada cuánto despliegas.",[15,1190,1191],{},"Dos aclaraciones para que los nombres no confundan:",[332,1193,1194,1204],{},[335,1195,1196,1199,1200,1203],{},[19,1197,1198],{},"Pull Request (PR)"," o ",[19,1201,1202],{},"Merge Request (MR)",": una propuesta para integrar\nuna rama a otra. Muestra el diff completo, permite comentar línea por línea,\nejecutar pruebas automáticas y pedir aprobación antes de mezclar.",[335,1205,1206,1209],{},[19,1207,1208],{},"Merge",": la acción de integrar esa rama. La plataforma puede ofrecer\ndistintas estrategias: merge normal (conserva los commits), squash (los\naplasta en uno) o rebase (los reubica).",[15,1211,1212],{},"Git es la herramienta; GitHub, GitLab, Bitbucket y compañía son plataformas\nque agregan revisión y automatización encima. El flujo se puede aplicar en\ncualquiera.",[35,1214,1216],{"id":1215},"github-flow-recomendado-para-empezar","GitHub Flow (recomendado para empezar)",[15,1218,1219,1220,1222],{},"Una rama por cambio, un Pull Request, y ",[47,1221,339],{}," siempre desplegable. Es el flujo\nmás simple que sigue siendo serio: no hay ramas permanentes de más, no hay\nceremonia y cualquiera puede entender dónde está cada cosa.",[40,1224,1227],{"className":1225,"code":1226,"language":45},[43],"main ────●──────────●──────────●────►\n          \\        \u002F  \\        \u002F\n           ●──●──●     ●──●──●\n          feature\u002Fa   feature\u002Fb\n",[47,1228,1226],{"__ignoreMap":49},[15,1230,1231],{},"Los pasos:",[1017,1233,1234,1245,1254,1260,1268,1274],{},[335,1235,1236,1241,1242],{},[19,1237,1238,1239],{},"Actualizá ",[47,1240,339],{},": ",[47,1243,1244],{},"git switch main && git pull",[335,1246,1247,1250,1251],{},[19,1248,1249],{},"Crea una rama"," con nombre descriptivo: ",[47,1252,1253],{},"git switch -c fix\u002Fvalidar-entrada",[335,1255,1256,1259],{},[19,1257,1258],{},"Commitea en pasos chicos",", cada uno con sentido propio.",[335,1261,1262,1241,1265],{},[19,1263,1264],{},"Sube la rama",[47,1266,1267],{},"git push -u origin fix\u002Fvalidar-entrada",[335,1269,1270,1273],{},[19,1271,1272],{},"Abre un Pull Request"," en la plataforma que uses y pide revisión.",[335,1275,1276,1279],{},[19,1277,1278],{},"Fusiona"," cuando esté aprobado y las pruebas pasen. Borra la rama.",[15,1281,1282],{},"Por qué funciona tan bien:",[51,1284,1285,1293],{},[54,1286,1287],{},[57,1288,1289,1291],{},[60,1290,243],{},[60,1292,246],{},[67,1294,1295,1305,1313,1321,1329],{},[57,1296,1297,1300],{},[72,1298,1299],{},"Un solo lugar estable",[72,1301,1302,1304],{},[47,1303,339],{}," siempre se puede desplegar",[57,1306,1307,1310],{},[72,1308,1309],{},"Cambios chicos",[72,1311,1312],{},"se revisan rápido y se revierten fácil",[57,1314,1315,1318],{},[72,1316,1317],{},"Revisión antes de integrar",[72,1319,1320],{},"el error se detecta antes de llegar a producción",[57,1322,1323,1326],{},[72,1324,1325],{},"Historia legible",[72,1327,1328],{},"cada PR cuenta un cambio con su contexto",[57,1330,1331,1334],{},[72,1332,1333],{},"Poco protocolo",[72,1335,1336],{},"no hay que memorizar cinco tipos de rama",[15,1338,1339],{},"Reglas que hacen que funcione:",[51,1341,1342,1352],{},[54,1343,1344],{},[57,1345,1346,1349],{},[60,1347,1348],{},"Regla",[60,1350,1351],{},"Por qué",[67,1353,1354,1364,1372,1380,1393],{},[57,1355,1356,1361],{},[72,1357,1358,1360],{},[47,1359,339],{}," siempre funciona",[72,1362,1363],{},"cualquiera puede desplegar en cualquier momento",[57,1365,1366,1369],{},[72,1367,1368],{},"ramas cortas (horas o días, no semanas)",[72,1370,1371],{},"menos conflictos y revisiones más fáciles",[57,1373,1374,1377],{},[72,1375,1376],{},"un PR = un cambio",[72,1378,1379],{},"se revisa mejor y se puede revertir solo",[57,1381,1382,1387],{},[72,1383,1384,1385],{},"el PR explica el ",[19,1386,189],{},[72,1388,1389,1390],{},"el código ya muestra el ",[19,1391,1392],{},"qué",[57,1394,1395,1398],{},[72,1396,1397],{},"pruebas verdes antes de mergear",[72,1399,1400],{},"no se discute, se verifica",[15,1402,1403,1404,1407],{},"Con GitHub CLI (",[47,1405,1406],{},"gh",") los últimos pasos son más rápidos:",[40,1409,1411],{"className":542,"code":1410,"language":544,"meta":49,"style":49},"gh pr create --fill        # abre el PR con los datos del commit\ngh pr checks               # estado de las pruebas\ngh pr merge --squash       # mergea aplastando los commits\n",[47,1412,1413,1429,1441],{"__ignoreMap":49},[548,1414,1415,1417,1420,1423,1426],{"class":550,"line":551},[548,1416,1406],{"class":554},[548,1418,1419],{"class":558}," pr",[548,1421,1422],{"class":558}," create",[548,1424,1425],{"class":562}," --fill",[548,1427,1428],{"class":657},"        # abre el PR con los datos del commit\n",[548,1430,1431,1433,1435,1438],{"class":550,"line":572},[548,1432,1406],{"class":554},[548,1434,1419],{"class":558},[548,1436,1437],{"class":558}," checks",[548,1439,1440],{"class":657},"               # estado de las pruebas\n",[548,1442,1443,1445,1447,1449,1452],{"class":550,"line":587},[548,1444,1406],{"class":554},[548,1446,1419],{"class":558},[548,1448,960],{"class":558},[548,1450,1451],{"class":562}," --squash",[548,1453,1454],{"class":657},"       # mergea aplastando los commits\n",[35,1456,1458],{"id":1457},"git-flow-para-releases-versionados","Git Flow (para releases versionados)",[15,1460,1461,1462,1467,1468,1470],{},"Tiene más ramas y más ceremonia. Se usa cuando publicas versiones (v1.2.0) y\nnecesitas congelar una versión mientras sigues desarrollando. La diferencia con\nGitHub Flow es que aquí ",[19,1463,1464],{},[47,1465,1466],{},"develop"," es la rama de integración y ",[47,1469,339],{}," queda\nreservada a lo que ya está en producción.",[51,1472,1473,1489],{},[54,1474,1475],{},[57,1476,1477,1480,1483,1486],{},[60,1478,1479],{},"Rama",[60,1481,1482],{},"Para qué",[60,1484,1485],{},"Sale de",[60,1487,1488],{},"Vuelve a",[67,1490,1491,1505,1522,1540,1560],{},[57,1492,1493,1497,1500,1503],{},[72,1494,1495],{},[47,1496,339],{},[72,1498,1499],{},"solo código en producción",[72,1501,1502],{},"—",[72,1504,1502],{},[57,1506,1507,1511,1514,1518],{},[72,1508,1509],{},[47,1510,1466],{},[72,1512,1513],{},"integración del próximo release",[72,1515,1516],{},[47,1517,339],{},[72,1519,1520],{},[47,1521,339],{},[57,1523,1524,1529,1532,1536],{},[72,1525,1526],{},[47,1527,1528],{},"feature\u002F*",[72,1530,1531],{},"una funcionalidad",[72,1533,1534],{},[47,1535,1466],{},[72,1537,1538],{},[47,1539,1466],{},[57,1541,1542,1547,1550,1554],{},[72,1543,1544],{},[47,1545,1546],{},"release\u002F*",[72,1548,1549],{},"estabilizar una versión",[72,1551,1552],{},[47,1553,1466],{},[72,1555,1556,29,1558],{},[47,1557,339],{},[47,1559,1466],{},[57,1561,1562,1567,1570,1574],{},[72,1563,1564],{},[47,1565,1566],{},"hotfix\u002F*",[72,1568,1569],{},"arreglo urgente en producción",[72,1571,1572],{},[47,1573,339],{},[72,1575,1576,29,1578],{},[47,1577,339],{},[47,1579,1466],{},[15,1581,1582],{},"Qué significa cada una en la práctica:",[332,1584,1585,1592,1604,1611],{},[335,1586,1587,1591],{},[19,1588,1589],{},[47,1590,1466],{},": donde se junta todo lo que va a salir en la próxima versión.\nNo se despliega directamente.",[335,1593,1594,1598,1599,1601,1602,33],{},[19,1595,1596],{},[47,1597,1528],{},": una funcionalidad o un arreglo que todavía no está listo.\nSale de ",[47,1600,1466],{}," y vuelve a ",[47,1603,1466],{},[335,1605,1606,1610],{},[19,1607,1608],{},[47,1609,1546],{},": una rama para estabilizar la versión que viene. Ahí solo se\ncorrigen errores, no se agregan funciones nuevas.",[335,1612,1613,1617,1618,1601,1620,1622,1623,1625],{},[19,1614,1615],{},[47,1616,1566],{},": un arreglo urgente sobre lo que ya está en producción. Sale\nde ",[47,1619,339],{},[47,1621,339],{}," y a ",[47,1624,1466],{},", para que el arreglo no se pierda\nen la próxima versión.",[40,1627,1630],{"className":1628,"code":1629,"language":45},[43],"main     ──●──────────────●─────────●──►\n            \\            \u002F         \u002F\nrelease      ●──●──●────●         \u002F\n              \\                 \u002F\ndevelop    ────●──●──●──●──●───●────►\n                \\    \u002F\nfeature          ●──●\n",[47,1631,1629],{"__ignoreMap":49},[15,1633,1634],{},"Cuándo usarlo:",[332,1636,1637,1640,1643],{},[335,1638,1639],{},"Producto con versiones y soporte de varias a la vez.",[335,1641,1642],{},"Equipo grande con QA y fechas de release.",[335,1644,1645,1646,1649],{},"Necesitas un ",[47,1647,1648],{},"hotfix"," sin arrastrar lo que está a medio hacer.",[15,1651,1652,1653,1655],{},"Cuándo ",[19,1654,692],{}," usarlo:",[332,1657,1658,1661],{},[335,1659,1660],{},"Proyectos personales, prototipos o apps que despliegas varias veces por día.",[335,1662,1663],{},"Equipos chicos: el costo de coordinar cinco tipos de rama supera el beneficio.",[35,1665,1667],{"id":1666},"comparación-rápida","Comparación rápida",[51,1669,1670,1681],{},[54,1671,1672],{},[57,1673,1674,1676,1679],{},[60,1675],{},[60,1677,1678],{},"GitHub Flow",[60,1680,32],{},[67,1682,1683,1699,1710,1721,1732],{},[57,1684,1685,1688,1692],{},[72,1686,1687],{},"Ramas permanentes",[72,1689,1690],{},[47,1691,339],{},[72,1693,1694,1696,1697],{},[47,1695,339],{}," + ",[47,1698,1466],{},[57,1700,1701,1704,1707],{},[72,1702,1703],{},"Complejidad",[72,1705,1706],{},"baja",[72,1708,1709],{},"media\u002Falta",[57,1711,1712,1715,1718],{},[72,1713,1714],{},"Frecuencia de deploy",[72,1716,1717],{},"continua",[72,1719,1720],{},"por releases",[57,1722,1723,1726,1729],{},[72,1724,1725],{},"Ideal para",[72,1727,1728],{},"web, apps, equipos chicos",[72,1730,1731],{},"productos versionados",[57,1733,1734,1737,1740],{},[72,1735,1736],{},"Riesgo principal",[72,1738,1739],{},"PRs gigantes",[72,1741,1742],{},"ramas que viven meses",[15,1744,1745],{},"Empieza con GitHub Flow. Si algún día necesitas versiones con soporte, agregas\nGit Flow sin tirar nada de lo aprendido.",[35,1747,1749],{"id":1748},"deshacer-sin-romper-nada","Deshacer sin romper nada",[15,1751,1752,1753,1756,1757,33],{},"Esto es lo que más miedo da y lo que menos debería. La clave: distinguir si el\ncommit ya lo viste ",[19,1754,1755],{},"solo tú"," o ya está ",[19,1758,1759],{},"publicado",[51,1761,1762,1774],{},[54,1763,1764],{},[57,1765,1766,1769,1771],{},[60,1767,1768],{},"Quiero…",[60,1770,1144],{},[60,1772,1773],{},"¿Seguro en remoto?",[67,1775,1776,1789,1802,1817,1830,1845,1858],{},[57,1777,1778,1781,1786],{},[72,1779,1780],{},"descartar cambios de un archivo",[72,1782,1783],{},[47,1784,1785],{},"git restore archivo",[72,1787,1788],{},"sí (no toca historia)",[57,1790,1791,1794,1799],{},[72,1792,1793],{},"sacar algo del staging",[72,1795,1796],{},[47,1797,1798],{},"git restore --staged archivo",[72,1800,1801],{},"sí",[57,1803,1804,1807,1812],{},[72,1805,1806],{},"corregir el último commit",[72,1808,1809],{},[47,1810,1811],{},"git commit --amend",[72,1813,1814,1816],{},[19,1815,692],{}," si ya lo pusheaste",[57,1818,1819,1822,1827],{},[72,1820,1821],{},"deshacer el último commit, dejando cambios",[72,1823,1824],{},[47,1825,1826],{},"git reset --soft HEAD~1",[72,1828,1829],{},"solo local",[57,1831,1832,1835,1840],{},[72,1833,1834],{},"deshacer el último commit y los cambios",[72,1836,1837],{},[47,1838,1839],{},"git reset --hard HEAD~1",[72,1841,1842,1844],{},[19,1843,692],{},": borra trabajo",[57,1846,1847,1850,1855],{},[72,1848,1849],{},"revertir un commit publicado",[72,1851,1852],{},[47,1853,1854],{},"git revert SHA",[72,1856,1857],{},"sí: crea un commit nuevo",[57,1859,1860,1863,1867],{},[72,1861,1862],{},"recuperar algo \"perdido\"",[72,1864,1865],{},[47,1866,511],{},[72,1868,1869],{},"sí: es tu red de seguridad",[15,1871,1872,1874,1875,1878,1879,1882,1883,1886],{},[47,1873,511],{}," guarda ",[19,1876,1877],{},"todo"," movimiento de HEAD, incluso después de un\n",[47,1880,1881],{},"reset --hard",". Mientras no hayas hecho ",[47,1884,1885],{},"gc",", casi siempre se puede volver.",[35,1888,1890],{"id":1889},"guardar-trabajo-a-medias","Guardar trabajo a medias",[40,1892,1894],{"className":542,"code":1893,"language":544,"meta":49,"style":49},"git stash          # guarda cambios sin commitear y limpia el directorio\ngit stash list     # ver la pila\ngit stash pop      # recupera y borra de la pila\ngit stash apply    # recupera sin borrar\n",[47,1895,1896,1906,1918,1930],{"__ignoreMap":49},[548,1897,1898,1900,1903],{"class":550,"line":551},[548,1899,555],{"class":554},[548,1901,1902],{"class":558}," stash",[548,1904,1905],{"class":657},"          # guarda cambios sin commitear y limpia el directorio\n",[548,1907,1908,1910,1912,1915],{"class":550,"line":572},[548,1909,555],{"class":554},[548,1911,1902],{"class":558},[548,1913,1914],{"class":558}," list",[548,1916,1917],{"class":657},"     # ver la pila\n",[548,1919,1920,1922,1924,1927],{"class":550,"line":587},[548,1921,555],{"class":554},[548,1923,1902],{"class":558},[548,1925,1926],{"class":558}," pop",[548,1928,1929],{"class":657},"      # recupera y borra de la pila\n",[548,1931,1932,1934,1936,1939],{"class":550,"line":602},[548,1933,555],{"class":554},[548,1935,1902],{"class":558},[548,1937,1938],{"class":558}," apply",[548,1940,1941],{"class":657},"    # recupera sin borrar\n",[15,1943,1944],{},"Útil cuando tienes que cambiar de rama de urgencia. No es un sustituto de los\ncommits: si el trabajo importa, commitealo en una rama.",[35,1946,1948],{"id":1947},"etiquetas-y-releases","Etiquetas y releases",[40,1950,1952],{"className":542,"code":1951,"language":544,"meta":49,"style":49},"git tag -a v1.0.0 -m \"Primera versión\"\ngit push origin v1.0.0\n",[47,1953,1954,1972],{"__ignoreMap":49},[548,1955,1956,1958,1961,1964,1967,1969],{"class":550,"line":551},[548,1957,555],{"class":554},[548,1959,1960],{"class":558}," tag",[548,1962,1963],{"class":562}," -a",[548,1965,1966],{"class":558}," v1.0.0",[548,1968,810],{"class":562},[548,1970,1971],{"class":558}," \"Primera versión\"\n",[548,1973,1974,1976,1978,1980],{"class":550,"line":572},[548,1975,555],{"class":554},[548,1977,1087],{"class":558},[548,1979,1075],{"class":558},[548,1981,1982],{"class":558}," v1.0.0\n",[15,1984,1985],{},"Una etiqueta marca un commit con un nombre legible. Es lo que usa Git Flow para\nsaber qué versión está en producción.",[35,1987,1989],{"id":1988},"errores-frecuentes","Errores frecuentes",[51,1991,1992,2005],{},[54,1993,1994],{},[57,1995,1996,1999,2002],{},[60,1997,1998],{},"Mensaje \u002F síntoma",[60,2000,2001],{},"Causa",[60,2003,2004],{},"Solución",[67,2006,2007,2023,2040,2056,2074,2088,2105,2116,2134],{},[57,2008,2009,2014,2017],{},[72,2010,2011],{},[47,2012,2013],{},"not a git repository",[72,2015,2016],{},"estás fuera de la carpeta del repo",[72,2018,2019,2022],{},[47,2020,2021],{},"cd"," al repo",[57,2024,2025,2030,2036],{},[72,2026,2027],{},[47,2028,2029],{},"nothing to commit",[72,2031,2032,2033],{},"no hay cambios, o no hiciste ",[47,2034,2035],{},"add",[72,2037,2038],{},[47,2039,838],{},[57,2041,2042,2048,2051],{},[72,2043,2044,2047],{},[47,2045,2046],{},"non-fast-forward"," al pushear",[72,2049,2050],{},"el remoto tiene commits que no tienes",[72,2052,2053,2055],{},[47,2054,1172],{}," y vuelve a pushear",[57,2057,2058,2063,2066],{},[72,2059,2060],{},[47,2061,2062],{},"detached HEAD",[72,2064,2065],{},"miraste un commit viejo sin rama",[72,2067,2068,1199,2071],{},[47,2069,2070],{},"git switch -",[47,2072,2073],{},"git switch main",[57,2075,2076,2081,2084],{},[72,2077,2078],{},[47,2079,2080],{},"Your branch is behind",[72,2082,2083],{},"te falta traer cambios",[72,2085,2086],{},[47,2087,1172],{},[57,2089,2090,2095,2098],{},[72,2091,2092,2093],{},"conflicto en ",[47,2094,1172],{},[72,2096,2097],{},"mismas líneas tocadas",[72,2099,2100,2101,358,2103],{},"resuelve, ",[47,2102,2035],{},[47,2104,134],{},[57,2106,2107,2110,2113],{},[72,2108,2109],{},"commiteaste un secreto",[72,2111,2112],{},"quedó en la historia",[72,2114,2115],{},"rota la clave; no alcanza con borrar el archivo",[57,2117,2118,2123,2126],{},[72,2119,2120],{},[47,2121,2122],{},"Permission denied (publickey)",[72,2124,2125],{},"SSH mal configurado",[72,2127,2128,2129],{},"ver ",[2130,2131,2133],"a",{"href":2132},"\u002Fssh","SSH",[57,2135,2136,2141,2144],{},[72,2137,2138,2139],{},"borraste trabajo con ",[47,2140,1881],{},[72,2142,2143],{},"no hay papelera",[72,2145,2146,2148],{},[47,2147,511],{}," y vuelve al commit",[35,2150,2152],{"id":2151},"flujo-mínimo-para-empezar","Flujo mínimo para empezar",[40,2154,2156],{"className":542,"code":2155,"language":544,"meta":49,"style":49},"git init\ngit add .\ngit commit -m \"Add initial project structure\"\ngit remote add origin git@github.com:laura\u002Fmi-proyecto.git\ngit push -u origin main\n",[47,2157,2158,2165,2174,2185,2198],{"__ignoreMap":49},[548,2159,2160,2162],{"class":550,"line":551},[548,2161,555],{"class":554},[548,2163,2164],{"class":558}," init\n",[548,2166,2167,2169,2171],{"class":550,"line":572},[548,2168,555],{"class":554},[548,2170,780],{"class":558},[548,2172,2173],{"class":558}," .\n",[548,2175,2176,2178,2180,2182],{"class":550,"line":587},[548,2177,555],{"class":554},[548,2179,807],{"class":558},[548,2181,810],{"class":562},[548,2183,2184],{"class":558}," \"Add initial project structure\"\n",[548,2186,2187,2189,2191,2193,2195],{"class":550,"line":602},[548,2188,555],{"class":554},[548,2190,1058],{"class":558},[548,2192,780],{"class":558},[548,2194,1075],{"class":558},[548,2196,2197],{"class":558}," git@github.com:laura\u002Fmi-proyecto.git\n",[548,2199,2200,2202,2204,2206,2208],{"class":550,"line":789},[548,2201,555],{"class":554},[548,2203,1087],{"class":558},[548,2205,1090],{"class":562},[548,2207,1075],{"class":558},[548,2209,599],{"class":558},[15,2211,2212],{},"Y a partir de ahí, por cada cambio:",[40,2214,2216],{"className":542,"code":2215,"language":544,"meta":49,"style":49},"git switch -c feature\u002Fvalidar-entrada\n# trabajas, compilas, pruebas\ngit add .\ngit commit -m \"Validate input before processing\"\ngit push -u origin feature\u002Fvalidar-entrada\n# abres el PR, revisas, mergeas\n",[47,2217,2218,2229,2234,2242,2253,2265],{"__ignoreMap":49},[548,2219,2220,2222,2224,2226],{"class":550,"line":551},[548,2221,555],{"class":554},[548,2223,922],{"class":558},[548,2225,925],{"class":562},[548,2227,2228],{"class":558}," feature\u002Fvalidar-entrada\n",[548,2230,2231],{"class":550,"line":572},[548,2232,2233],{"class":657},"# trabajas, compilas, pruebas\n",[548,2235,2236,2238,2240],{"class":550,"line":587},[548,2237,555],{"class":554},[548,2239,780],{"class":558},[548,2241,2173],{"class":558},[548,2243,2244,2246,2248,2250],{"class":550,"line":602},[548,2245,555],{"class":554},[548,2247,807],{"class":558},[548,2249,810],{"class":562},[548,2251,2252],{"class":558}," \"Validate input before processing\"\n",[548,2254,2255,2257,2259,2261,2263],{"class":550,"line":789},[548,2256,555],{"class":554},[548,2258,1087],{"class":558},[548,2260,1090],{"class":562},[548,2262,1075],{"class":558},[548,2264,2228],{"class":558},[548,2266,2267],{"class":550,"line":802},[548,2268,2269],{"class":657},"# abres el PR, revisas, mergeas\n",[15,2271,2272],{},"Ese ciclo —rama, commits chicos, push, PR, merge— es GitHub Flow. Si el equipo\nusa otra plataforma, cambia el nombre del botón, no el concepto.",[15,2274,2275,2276,33],{},"Siguiente parada: ",[2130,2277,2278],{"href":2132},"SSH sin miedo",[2280,2281],"hr",{},[15,2283,2284],{},[2285,2286,2287],"em",{},"Hecho con amor para Laura, por Bogdan.",[2289,2290,2291],"style",{},"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 pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":49,"searchDepth":572,"depth":572,"links":2293},[2294,2295,2298,2301,2302,2303,2304,2307,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319],{"id":37,"depth":572,"text":38},{"id":127,"depth":572,"text":128,"children":2296},[2297],{"id":233,"depth":587,"text":234},{"id":312,"depth":572,"text":313,"children":2299},[2300],{"id":384,"depth":587,"text":385},{"id":458,"depth":572,"text":459},{"id":538,"depth":572,"text":539},{"id":641,"depth":572,"text":642},{"id":735,"depth":572,"text":736,"children":2305},[2306],{"id":842,"depth":587,"text":843},{"id":909,"depth":572,"text":910,"children":2308},[2309],{"id":998,"depth":587,"text":999},{"id":1045,"depth":572,"text":1046},{"id":1181,"depth":572,"text":1182},{"id":1215,"depth":572,"text":1216},{"id":1457,"depth":572,"text":1458},{"id":1666,"depth":572,"text":1667},{"id":1748,"depth":572,"text":1749},{"id":1889,"depth":572,"text":1890},{"id":1947,"depth":572,"text":1948},{"id":1988,"depth":572,"text":1989},{"id":2151,"depth":572,"text":2152},"Qué es un commit, qué es una rama, y cómo organizar el trabajo con GitHub Flow o Git Flow.","md",{},true,"\u002Fgit",{"title":5,"description":2320},"ZnyhBTbJPNvLNyDIqZ2i5uUzS0phjnDwwuDPO2wbSLQ",1793539815759]