Home

Git Magic

image

Contents

1. Luego ve al nuevo directorio y escribe git commit a m Descripci n de mis cambios git pull El procedimiento para pasarle tus cambios a los dem s depende de cu l es tu otro sistema de control de versiones El nuevo directorio contiene los archivos con tus cambios Ejecuta los comandos que sean necesarios para subirlos al repositorio central del otro sistema de control de versiones El comando git svn automatiza lo anterior para repositorios de Subversion y tambi n puede ser usado para exportar un proyecto de Git a un repositorio de Subversion http google opensource blogspot com 2008 03 export git project to google code html 12 Capitulo 4 Magia Con Los Branches El hacer branches ramificar y merges unir de manera instant nea son dos de las prestaciones m s letales de Git Problema Factores externos necesitan inevitablemente de cambios de contexto Un bug severo se manifiesta en la ltima versi n sin previo aviso El plazo para alguna prestaci n se acorta Un desarrollador que tiene que ayudar en una secci n indispensable del proyecto est por tomar licencia En cualquier caso debes soltar abruptamente lo que est s haciendo y enfocarte en una tarea completamente diferente Interrumpir tu l nea de pensamiento puede ser negativo para tu productividad y cuanto m s engorroso sea el cambiar contextos mayor es la p rdida Con los sistemas centralizados debemos descargar una nueva copia Los sistemas distri
2. E NN 19 5 Qos A Ms e adi 19 5 3 Los Cambios Locales Al Final oooonnnnococuccconooancnnononananonnonnnnnononononanononnnnnnonononn nn E EK E Se 20 5 4 Reeseribiendo la Aistoriasssc ccccivcscciccescsecsieciedecesasseosecaeceeesscecevesesedecdseevectseacvescentescesecatecteedeetes 20 D D Haciendo FAM 21 5 6 D nde Nos Equivocamos coccconcccccconnnoncnnconncnnonnnnnnonn non nrnno nacen non ne onn non cnn nnn ran nen non nc enn corno nannn ricino 22 37 QUI N Se EQUIVOCO erica iii ld 23 iii 3 8 Experiencia Personal sci Bien ena Si ene ae ee 23 6 Git MUU SAMO AAA sensssuasedsdsssctesvassedescoesse 25 OL Z QUIEN SOY YO ence die Niet esis sek aR Ai ae ER ne eae 25 6 2Git Sobre SSH ALT at dd Nudie iebvcasteedoctes 25 6 3 Git Sobre Cualquier COSA ooonocnnocnccnoonionconconncnncononnncnn non oronc nn con non no on conc cnn nn cnn nro non nc rn conc conan arica 26 6 4 Parches La Moneda Global c ccccccssccccecssssccecesessceceeessuececcecssaeeeeceseascecesessaeceecesessseeeeesenees 26 6 5 Lo Siento Nos Hemos MOViId0 cccccssccecesssececessssceceecesuececcecssasececesesceceecesseaeecesersseseseseees 27 60R ama REM add ee deb ode pe dd eo e A 28 6 7 M ltiples Remotes siran aeeoe id diia dedo 29 6 8 MiS Preferencias ate 29 7 Gran Maestr a en Git sssceriessossessissesdnsonsedecinisnbesnlessoseasnassvesenshscebasesdecsedessecovasnsinessnonsdenesdadesiosesnesonse 31 1 1 Lanzamientos de C di
3. Eeen K EE ee EKET T EE EVE EE KEE Eor EE y 9 3 2 Control Cl sico de Fuentes EEE E EEE EE E E E E S 9 3 3 Bifurcando fork UN proyecto 0 le eee eee eseesee cee ceceseeseeeeceeeeseeeaecaaesaesaeceeceseeeseeesaessaesaeenees 10 3 4 Respaldos Definitivos iis citaciones ener ninio citan ETE EE E EEE A E iS 10 3 5 Multitask A La Velocidad De La LUZ occcnonooccnonononcnnnonononnnnnonnnononnonononnnnconononanoconnnrnnonononananonos 11 3 6 Control Guerrillero De Versiones cccccccsssccceceessceccecesscececenessseceeeneececcecssuseeecessasseseecssasaeees 11 4 Magia Con Los Branches ovosicionamosiosoninovionocadioniniacosicioninnscicciniaradinnan cod ccias eee scosse ainia coincida cocer aci ricunss 13 Ll Lata Delta A 13 4 2 Trabajo SUCIO iia al 14 4 3 Arreglos Rapidossscvissssiscseesssancsnck Abas saserescasessabbans osaitin e ob anat laos sica 15 4 4 Flujo De Trabajo Ininterrumpido ooooccnccnnonionconcnnnconcononnonononcnnnonnnon non no cnn cnn nnnn nano nn non non nc enc cnncnnnnns 15 4 5 Reorganizando Una Mezcla o cs csciscesseijsiseesess sees cnscsscusseseesneedesgsssdesves donsisenscasepssegnesven SNESE S aie 16 4 6 Administrando branches A A 17 437 Branches Temporales A TO 17 4 8 Trabaja como Quaesas comico ini ta dau ebbescie ceebob inte ESTESE EEE EEEE E 17 5 Lecciones de Historia ccsscsssssscssssesssossessecsssssesconssenssessossecsscssessesssecsonsseasesseossossessnessssssnsoessosssoses 19 Del A
4. Microsoft Windows ido iia ia a a r E A 43 A 3 Archivos No Relacionados cccnooooccnconoooncnnonononocononanannnnnnonnnnnononononnnnnconnnnnonononn no EETA 43 A4 Qui n Edita Qu in I Eear iae een iieri 43 AS Historia POr Archivo ansore dll 44 A6 Clonadoimciaks ienn A a See A a A E dee desk E da teed Gee REN 44 Act Proyectos Volatilidad oie 44 AS Contador Global llocs 45 ALO SUDAITECIOFIOS VAC OS ileccssec decsvodensdbiieesesdcceedeseveescsveddvesbesvassousiecses sucevcesestecesendsvaneostacsodecstveddeees 45 ACTO Commit Inictal 225 605 he sessed cee wee hai Ben ca ase Be ia veda te ts ok Cea ee 46 AALS Rarezas DeLa tddi ia 46 B Translating This Guide ccsccscsscsssssseccssssssssscsssssssceseesecssecsessesssssssssscssesssceseesesssesssssssssesseesseree 47 Prologo Git http git or cz es la navaja suiza del control de versiones Una herramienta de control de revisiones confiable vers til y multiprop sito que por su extraordinaria flexibilidad es complicada de aprender y m s a n de dominar Estoy documentando lo que he aprendido hasta ahora en estas p ginas porque inicialmente tuve dificultades para comprender el manual de usuario de Git http www kernel org pub software scm git docs user manual html Tal como observ Arthur C Clarke cualquier tecnologia suficientemente avanzada es indistinguible de la magia Este es un gran modo de acercarce a Git los novatos pueden ignorar su funcionamiento interno
5. contiene la historia de la actividad en todas las ramas mientras que el archivo HEAD tiene cada hash que alguna vez ha tomado Este ltimo puede usarse para encontrar hashes de commits en branches que se han borrado de manera accidental El comando reflog provee una interfaz amigable para estos logs Prueba git reflog En lugar de cortar y pegar hashes del reflog intenta git checkout 10 minutes ago O prueba un checkout del 5to commit que visitaste hacia atr s git checkout 5 Ver la secci n Specifying Revisions de git help rev parse por mas datos 33 Capitulo 7 Gran Maestria en Git Podrias querer configurar un periodo de gracia mayor para los commits condenados Por ejemplo git config gc pruneexpire 30 days significa que un commmit eliminado se va a perder de forma permanente solo cuando hayan pasado 30 dais y se ejecute git gc Tambi n podr as querer deshabilitar invocaciones autom ticas de git ge git config gc auto 0 en cuyo caso los commits solo ser n borrados cuando ejecutes git ge de forma manual 7 6 Construyendo sobre Git Siguiendo la tradici n UNIX el dise o de Git permite ser facilmente usado como un componente de bajo nivel de otros programas como GUI e interfaces web interfaces de linea de comandos alternativas herramientas de manejo de patches herramientas de importaci n y conversi n etc De hecho algunos de los comandos de Git son ellos mismos scripts parados s
6. deber a ser inmutable incluso con sus defectos Otros sienten que los rboles deber an estar presentables antes de ser mostrados en p blico Git satisface ambos puntos de vista Al igual que el clonar hacer branches y hacer merges reescribir la historia es simplemente otro poder que Git te da Est en tus manos usarlo con sabidur a 5 1 Me corrijo Hiciste un commit pero preferir as haber escrito un mensaje diferente Entonces escribe git commit amend para cambiar el ltimo mensaje Te olvidaste de agregar un archivo Ejecuta git add para agregarlo y luego corre el comando de arriba Quieres incluir algunas ediciones mas en ese ltimo commit Edita y luego escribe git commit amend a 5 2 Y Algo Mas Supongamos que el problema anterior es diez veces peor Luego de una larga sesi n hiciste unos cuantos commits Pero no est s conforme con la forma en que est n organizados y a algunos de los mensajes de esos commits les vendr a bien una reescritura Entonces escribe git rebase i HEAD 10 y los ltimos 10 commits van a aparecer en tu EDITOR favorito Un fragmento de muestra pick 5c6eb73 Added repo or cz link pick a311a64 Reordered analogies in Work How You Want 19 Capitulo 5 Lecciones de Historia pick 100834f Added push target to Makefile Entonces Elimina commits borrando l neas e Reordena commits reordenando l neas e Reemplaza pick por edit para marcar un commit pa
7. n preocupados de destruir archivos no monitoreados Si tienes la certeza de que todos los archivos y directorios sin monitorear son prescindibles se pueden borrar sin piedad con git clean f d 35 Capitulo 7 Gran Maestria en Git La pr xima vez ese comando molesto va a funcionar 7 8 Mejora Tu Imagen P blica Los errores est pidos abundan en la historia de muchos proyectos El m s preocupante son los archivos perdidos por el olvido de ejecutar git add Por suerte nunca perd datos cruciales por omisi n accidental dado que muy rara vez elimino directorios de trabajo originales Lo normal es que note el error un par de commits mas adelante por lo que el nico da o es un poco de historia perdida y el tener que admitir la culpa Tambi n me preocupo por no tenes espacios en blanco al final de las l neas Aunque son inofensivos procuro que nunca aparezcan en la historia p blica Adem s si bien nunca me sucedi me preocupo por no dejar conflictos de merge sin resolver Usualmente los descubro al compilar el proyecto pero hay algunos casos en los que se puede no notar Es til comprar un seguro contra la idiotez usando un hook para alertarme de estos problemas cd git hooks cp pre commit sample pre commit En versiones mas viejas de Git chmod x pre commit Ahora Git aborta un commit si se detectan espacios in tiles en blanco o conflictos de merge sin resolver Para esta gu a eventualmente agregu
8. n se vuelve irrecuperable ejecuta git reset hard para volver a donde estabas Para volver a salvar el estado git commit a m Otro respaldo 2 1 1 Agrega Elimina Renombra El comando anterior solo seguir la pista de los archivos que estaban presentes la primera vez que ejecutaste git add Si a ades nuevos archivos o subdirectorios deber s decirle a Git git add ARCHIVOSNUEVOS De manera similar si quieres que Git se olvide de determinados archivos porque por ejemplo los borraste git rm ARCHIVOSVIEJOS Renombrar un archivo es lo mismo que eliminar el nombre anterior y agregar el nuevo Tambi n puedes usar git mv que tiene la misma sintaxis que el comando mv Por ejemplo git mv ARCHIVOVIEJO ARCHIVONUEVO Capitulo 2 Trucos B sicos 2 2 Deshacer Rehacer Avanzado Algunas veces solo quieres ir hacia atr s y olvidarte de todos los cambios a partir de cierto punto porque estaban todos mal Entonces git log te muestra una lista de commits recientes y sus hashes SHA1 A continuaci n escribe git reset hard SHA1_HASH para recuperar el estado de un commit dado y borrar para siempre cualquier recuerdo de commits mas nuevos Otras veces quieres saltar a un estado anterior temporalmente En ese caso escribe git checkout SHA1_HASH Esto te lleva atr s en el tiempo sin tocar los commits m s nuevos Sin embargo como en los viajes en el tiempo de las pel culas d
9. par de juegos guardados en su m quina Cuando un jugador quer a progresar obten a la ltima versi n del servidor principal jugaba un rato guardaba y volv a a subir al servidor para que todos los dem s pudieran usarlo Qu pasa si un jugador quer a obtener un juego anterior por alg n motivo Tal vez el juego actual est en un estado donde es imposible ganar porque alguien olvid obtener un objeto antes de pasar el nivel tres por que que se quiere obtener el ltimo juego guardado donde todav a es posible completarlo O tal vez quieren comparar dos estados antiguos para ver cu nto trabajo hizo un jugador en particular Puede haber varias razones para querer ver una revisi n antigua pero el resultado es siempre el mismo Tienen que pedirle esa vieja partida al servidor central Mientras mas juegos guardados se quieran m s se necesita esa comunicaci n La nueva generaci n de sistemas de control de versiones de la cual Git es miembro se conoce como sistemas distribu dos y se puede pensar en ella como una generalizaci n de sistemas centralizados Cuando los jugadores descargan del servidor central obtienen todos los juegos guardados no solo el ltimo Es como si tuvieran un mirror del servidor central Esta operaci n inicial de clonado puede ser cara especialmente si el historial es largo pero a la larga termina siendo mejor Un beneficio inmediato es que cuando se quiere una versi n vieja por el motivo que sea la c
10. para evitar demoras incluso m s largas 24 Capitulo 6 Git Multijugador Inicialmente usaba Git en un proyecto privado donde yo era el nico desarrollador Entre los comandos relacionados a la naturaleza distribuida de Git s lo necesitaba pull y clone as yo pod a mantener el mismo proyecto en diferentes lugares M s tarde quize publicar mi c digo con Git e incluir cambios de los contribuyentes Tuve que aprender a administrar proyectos con m ltiples desarrolladores de todo el mundo Afortunadamente esta es la fortaleza de Git y podr a decirse que su raz n de ser 6 1 Qui n Soy Yo Cada commit tiene un nombre de autor y email los cuales son mostrados por git log Por defecto Git usa la configuraci n del sistema para rellenar estos campos Para decirle expl citamente escribe git config global user name John Doe git config global user email johndoe example com Omite la bandera global para poner estas opciones s lo para el repositorio actual 6 2 Git Sobre SSH HTTP Sup n que tienes acceso SSH a un servidor web pero Git no est instalado Aunque es menos eficiente que su protocolo nativo Git se puede comuncar por HTTP Descarga compila e instala Git en tu cuenta y crea un repositorio en tu directorio web GIT_DIR proj git git init cd proj git git bare update server info cp hooks post update sample hooks post update minim Ur En versiones antiguas de Git el comando cp falla y deb
11. quieras trabajar en todos los aspectos de un proyecto sobre la misma branch Quieres dejar los trabajos en progreso para ti y quieres que otros vean tus commits solo cuando han sido pulcramente organizados Inicia un par de branches git checkout b prolijo git checkout b mezcla A continuaci n trabaja en lo que sea soluciona bugs agrega prestaciones agrega c digo temporal o lo que quieras haciendo commits seguidos a medida que avanzas Entonces git checkout prolijo git cherry pick SHA1_HASH 16 Capitulo 4 Magia Con Los Branches aplica un commit dado a la branch prolijo Con cherry picks apropiados puedes construir una rama que contenga solo el c digo permanente y los commits relacionados juntos en un grupo 4 6 Administrando branches Lista todas las branches escribiendo git branch Siempre hay una branch llamada master y es en la que comienzas por defecto Algunos aconsejan dejar la rama master sin tocar y el crear nuevas branches para tus propios cambios Las opciones d y m te permiten borrar y mover renombrar branches Mira en git help branch La branch master es una convenci n til Otros pueden asumir que tu repositorio tiene una branch con este nombre y que contiene la versi n oficial del proyecto Puedes renombrar o destruir la branch master pero tambi n podr as respetar esta costumbre 4 7 Branches Temporales Despu s de un rato puedes notar que est s creando branches de c
12. source then create a directory corresponding to the target language s IETF tag see the W3C article on internationalization http www w3 org International articles language tags Overview en php For example English is en and Japanese is ja In the new directory and translate the txt files from the en subdirectory For instance to translate the guide into Klingon http en wikipedia org wiki Klingon_language you might type git clone git repo or cz gitmagic git cd gitmagic mkdir tlh tlh is the IETF language code for Klingon cd tlh cp en intro txt edit intro txt Translate the file and so on for each text file Edit the Makefile and add the language code to the TRANSLATIONS variable You can now review your work incrementally make tlh firefox book tlh index html Commit your changes often then let me know when they re ready GitHub has an interface that facilitates this fork the gitmagic project push your changes then ask me to merge 47
13. 3fd5c8d Check this file does indeed contain the above by typing echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 git cat file batch With zpipe it s easy to verify the hash zpipe d lt git objects 05 b217bb859794d08bb9e4f7f04cbda4b207fbe9 shalsum Hash verification is trickier via cat file because its output contains more than the raw uncompressed object file This file is a tree object a list of tuples consisting of a file type a filename and a hash In our example the file type is 100644 which means rose is a normal file and the hash is the blob object that contains the contents of rose Other possible file types are executables symlinks or directories In the last case the hash points to a tree object If you ran filter branch you ll have old objects you no longer need Although they will be jettisoned automatically once the grace period expires we ll delete them now to make our toy example easier to follow rm r git refs original git reflog expir expire now all git prune For real projects you should typically avoid commands like this as you are destroying backups If you want a clean repository it is usually best to make a fresh clone Also take care when directly manipulating git what if a Git command is running at the same time or a sudden power outage occurs In general refs should be deleted with git update ref d though usually it s safe to remove refs original by
14. 5 Lecciones de Historia n mero de tarjeta de cr dito en un archivo de texto y accidentalmente lo agregu al proyecto Borrar el archivo es insuficiente dado que se puede acceder a l en commits viejos Debemos eliminar el archivo de todos los commits git filter branch tree filter rm archivo secreto HEAD Ver git help filter branch donde se discute este ejemplo y se da un m todo m s r pido En general filter branch permite alterar grandes secciones de la historia con un solo comando Luego el directorio git refs original describe el estado de las cosas antes de la operaci n Revisa que el comando filter branch hizo lo que quer as y luego borra este directorio si deseas ejecutar m s comandos filter branch Por ltimo reemplaza los clones de tu proyecto con tu versi n revisada si pretendes interactuar con ellos en un futuro 5 5 Haciendo Historia Quieres migrar un proyecto a Git Si est siendo administrado con alguno de los sistemas m s conocidos hay grandes posibilidades de que alguien haya escrito un script para exportar la historia completa a Git Si no lo hay revisa git fast import que lee una entrada de texto en un formato espec fico para crear una historia de Git desde la nada T picamente un script que usa este comando se acomoda de apuro y se corre una sola vez migrando el proyecto de un solo tiro Como ejemplo pega el texto a continuaci n en un archivo temporal como ser tmp history c
15. Every version of your data is kept in the object database which lives in the subdirectory git objects the other residents of git hold lesser data the index branch names tags configuration options logs the current location of the head commit and so on The object database is elementary yet elegant and the source of Git s power Each file within git objects is an object There are 3 kinds of objects that concern us blob objects tree objects and commit objects 38 Capitulo 8 Secrets Revealed 8 7 Blobs First a magic trick Pick a filename any filename In an empty directory echo sweet gt YOUR_FILENAME git init git add find git objects type f UN a UY wm You ll see git objects aa 823728ea7d592acc69b36875a482cdf3fd5c8d How do I know this without knowing the filename It s because the SHA 1 hash of blob SP 6 NUL sweet LF is aa823728e47d592acc69b368752482cdf3fd5c8d where SP is a space NUL is a zero byte and LF is a linefeed You can verify this by typing printf blob 6 000sweet n shalsum Git is content addressable files are not stored according to their filename but rather by the hash of the data they contain in a file we call a blob object We can think of the hash as a unique ID for a file s contents so in a sense we are addressing files by their content The initial blob 6 is merely a header consisting of the object type and its length in bytes it simplifies inter
16. Git Magic Ben Lynn Git Magic por Ben Lynn Historial de revisiones August 2007 Revisado por BL Tabla de contenidos a A O v NETE oT OAE EEE E E E E E E E E E E E E E E E RNA CaP Lana dae oe v PAA BIN e CEE AAE E EA E EE A A EE EEA S v 3 Hosting Git oratute ea E E EEE ETEA A AA vi 1 Etre OGU AMARA O 1 Al Trabajar Es Ju gates ite ae ee a ae EE tes 1 1 27 Control De Versione S NA dls 1 1 3 Control Distribuido ii a Ad seo tad 2 1 3 1 Una Tonta SUperstici iia iii 2 1 4 Conflictos al fusiomar menor ves cosehence osu etenas ieee niece ies sacuccudevenduesvecueniadcesbucededesessuacdevbesteceeese 3 Zs TYUCOS B sicos aiscccscsessscscesssecsescesdessesetccssecessvscsstccesssgccescetdesshsetcussecsosvsosscsecsssgasusceddassesekcssescesveastdusssessees 4 21 Gulardando Estados a sevvecectsesesseacdeceestecsvess 4 2 1 1 Agrega Elimina Renombra eeceeeesceseeceecesseceececeecesseceeceesesesseeseaeeeecsceeeeeeseeeues 4 2 2 Deshacer Rehacer Avanzado jron arn avedeeverddesesetectasusesvontscuvesantesverseersess 4 PRPA WEI SEAT EID LO AEE EE E es iii ibid ds 6 2 3 Descargando ATCHIVOS sissies isesiorrorieoor sesoses neers usor S ru eKr doves KESEKESE SE EEE EV EE eE EE e 6 ZA LOMAS NUCVO is AE E EE EEEE E At EE EEE S EE ee JAN 6 2 95 PubliGacion Adi A a E a a EE a eOe E Eee 7 2 6 Que s lo g e hice hi paa ia 7 2 Te EJ OLCICIO ai 8 35 ClOMATIG A NON 9 31 Sincronizar Computadora S si t ensue periu ees ir EEr
17. SHA1 de 20 bytes de su HEAD en alg n lugar seguro Tiene que ser seguro no privado Por ejemplo publicarlo en un diario funcionar a bien porque es dif cil para un atacante el alterar cada copia de un diario 3 5 Multitask A La Velocidad De La Luz Digamos que quieres trabajar en varias prestaciones a la vez Haz commit de tu proyecto y ejecuta git clone un nuevo directorio Git se aprovecha de los hard links y de compartir archivos de la manera mas segura posible para crear este clon por lo que estar listo en un segundo y podr s trabajar en dos prestaciones independientes de manera simult nea Por ejemplo puedes editar un clon mientras el otro est compilando En cualquier momento puedes hacer commit y pull de los cambios desde el otro clon git pull el otro clon HEAD 3 6 Control Guerrillero De Versiones Est s trabajando en un proyecto que usa alg n otro sistema de control de versiones y extra as mucho a Git Entonces inicializa un repositorio de Git en tu directorio de trabajo git init git add git commit m Commit Inicial y luego cl nalo git clone un nuevo directorio Ahora debes trabajar en el nuevo directorio usando Git como te sea m s c modo Cada tanto querr s sincronizar con los dem s en ese caso ve al directorio original sincroniza usando el otro sistema de control de versiones y escribe 11 Capitulo 3 Clonando git add git commit m Sincronizo con los dem s
18. adoras Este es el motivo por el que us Git por primera vez Puedo tolerar hacer tarballs o usar rsync para backups y sincronizaci n b sica Pero algunas veces edito en mi laptop otras veces en mi desktop y ambas pueden no haberse comunicado en el medio Inicializa un repositorio de Git y haz haz commit de tus archivos en una m quina luego en la otra git clone otra computadora ruta a archivos para crear una segunda copia de los archivos y el repositorio Git De ahora en m s git commit a git pull otra computadora ruta a archivos HEAD va a traer pull el estado de los archivos desde la otra m quina hacia la que est s trabajando Si haz hecho cambios que generen conflictos en un archivo Git te va a avisar y deber as hacer commit luego de resolverlos 3 2 Control Cl sico de Fuentes Inicializa un repositorio de Git para tus archivos git init git add git commit m Commit Inicial En el servidor central inicializa un repositorio vac o de Git con alg n nombre y abre el Git daemon si es necesario GIT_DIR proj git git init Capitulo 3 Clonando git daemon detach podr a ya estar corriendo Algunos servidores publicos como repo or cz http repo or cz tienen un m todo diferente para configurar el repositorio inicialmente vac o de Git como llenar un formulario en una p gina Empuja push tu proyecto hacia el servidor central con git push git servidor central ruta al pr
19. an el tama o del repositorio de manera innecesaria En este caso el c digo fuente debe ser guardado en un repositorio de Git y el archivo binario debe ser mantenido de forma separada Para hacer la vida m s f cil uno puede distribu r un script que usa Git para clonar el c digo y rsync o un clon sin profundidad de Git para el firmware A 8 Contador Global Algunos sistemas de control de versiones centralizados mantienen un entero positivo que aumenta cuando un nuevo commit es aceptado Git se refiere a los cambios por su hash lo que es mejor en muchas circunstancias Pero a algunas personas les gusta tener este entero a mano Por suerte es f cil escribir scripts de forma que con cada update el repositorio central de git incrementa un entero tal vez en un tag y lo asocia con el hash del ltimo commit Cada clon podr a mantener esete contador pero esto ser a probablemente in til dado que solo el repositorio central y su contador son los que importan 45 Ap ndice A Defectos de Git A 9 Subdirectorios Vacios Los subdirectorios vacios no pueden ser administrados Crea archivos dummy para evitar este problema La implementaci n actual de Git y no su dise o es quien tiene la culpa de este problema Con suerte una vez que Git gane m s tracci n m s usuarios van a clamar por esta funcionalidad y va a ser implementada A 10 Commit Inicial El estereotipo de de un inform tico te rico cuenta desde 0 en lugar d
20. bu dos se comportan mejor dado que podemos clonar la versi n deseada localmente Pero el clonar igual implica copiar todo el directorio junto con toda la historia hasta el momento Aunque Git reduce el costousando hard links y el compartir archivos los archivos del proyecto deben ser recreados enteramente en el nuevo directorio Soluci n Git tiene una mejor herramienta para estas situaciones que es mucho m s r pida y eficiente en tama o que clonar git branch Con esta palabra m gica los archivos en tu directorio se transforman s bitamente de una versi n en otra Esta transformaci n puede hacer m s que simplemente ir hacia atr s o adelante en la historia Tus archivos pueden mutar desde la ltima versi n lanzada a la versi n experimental a la versi n en desarrollo a la versi n de un amigo y as sucesivamente 4 1 La Tecla Del Jefe Alguna vez jugaste uno de esos juegos donde con solo presionar un bot n la tecla del jefe la pantalla inmediatamente muestra una hoja de c lculo o algo as La idea es que si el jefe entra a la oficina mientras est s en el juego lo puedes esconder r pidamente En alg n directorio echo Soy m s inteligente que mi jefe gt miarchivo txt git init git add git commit m Commit inicial UN 1 UY Ur 13 Capitulo 4 Magia Con Los Branches Creamos un repositorio de Git que guarda un archivo de texto conteniendo un mensaje dado Ahora escribe git checkout b
21. cutfamos sobre cargar estados antiguos Al fin podemos contar toda la historia los archivos cambian al estado pedido pero debemos dejar la branch master Cualquier commit de aqu en adelante llevan tus archivos por un nuevo camino el podr ser nombrado posteriormente En otras palabras luego de traer un estado viejo Git autom ticamente te pone en una nueva branch sin nombre la cual puede ser nombrada y salvada con git checkout b 4 3 Arreglos Rapidos Estas en medio de algo cuando te piden que dejes todo y soluciones un bug reci n descubierto git commit a git checkout b arreglos SHA1_HASH Luego una vez que solucionaste el bug git commit a m Bug arreglado git push al repositorio central git checkout master y contin a con el trabajo en tu tarea original 4 4 Flujo De Trabajo Ininterrumpido Algunos proyectos requieren que tu c digo sea evaluado antes de que puedas subirlo Para hacer la vida m s f cil para aquellos que revisan tu c digo si tienes alg n cambio grande para hacer puedes partirlo en dos o mas partes y hacer que cada parte sea evaluada por separado Que pasa si la segunda parte no puede ser escrita hasta que la primera sea aprobada y subida En muchos sistemas de control de versiones deber as enviar primero el c digo a los evaluadores y luego esperar hasta que est aprobado antes de empezar con la segunda parte En realidad eso no es del todo cierto pero en estos sistema
22. e ciencia ficci n estar s en una realidad alternativa porque tus acciones fueron diferentes a las de la primera vez Esta realidad alternativa se llama branch rama y tendremos m s cosas para decir al respecto luego Por ahora solo recuerda que git checkout master te llevar al presente Tambi n para que Git no se queje siempre haz un commit o resetea tus cambios antes de ejecutar checkout Para retomar la analog a de los videojuegos git reset X hard carga un juego viejo y borra todos los que son mas nuevos que el que acabas de cargar e git checkout carga un juego viejo pero si contin as jugando el estado del juego se desviar de los juegos que salvaste la primera vez Cualquierpartido nuevo que guardes terminar en una branch separada representando la realidad alternativa a la que entraste Luego nos encargaremos de esto Puedes elegir el restaurar solo archivos o directorios en particular al agregarlos al final del comando You can choose only to restore particular files and subdirectories by appending them after the command git checkout SHA1_HASH algun archivo otro archivo Capitulo 2 Trucos B sicos Ten cuidado esta forma de checkout puede sobreescribir archivos sin avisar Para prevenir accidentes haz commit antes de ejecutar cualquier comando de checkout especialmente cuando estas aprendiendo a usar Git En general cuando te sientas inseguro del resultado de una operaci n sea o no de Git ejec
23. e desde 1 Lamentablemente con respecto a los commit Git no mantiene esta convenci n Muchos comandos son poco amigables antes del commit inicial Adicionalmente algunos casos borde deben ser manejados de forma especial como hacer rebase de una rama con un commit inicial distinto Git se beneficiar a al definiri el commit cero tan pronto como se construye un repositorio HEAD deber a ser un string conteniendo 20 bytes de 0 Este commit especial representa un rbol vac o sin padre que en alg n momento es parte de todos los repositorios de Git Entonces el correr git log por ejemplo informar a al usuario que no se han hecho commits a n en lugar de salir con un error fatal Algo similar pasar a con otras herramientas Cada commit inicial es de forma impl cita un descendiente de este commit cero Lamentablemente igual hay algunos casos que presentan problemas Si varias ramas con commits iniciales diferentes se mergean juntas entonces un rebase del resultado requiere una buena cantidad de intervenci n manual A 11 Rarezas De La Interfaz Para los commits A y B el significado de las expresiones A B y A B depende de si el comando espera dos puntas o un rango Ver git help diff y git help rev parse 46 Ap ndice B Translating This Guide I recommend the following steps for translating this guide so my scripts can quickly produce HTML and PDF versions and all translations can live in the same repository Clone the
24. emotes Sup n que otros dos desarrolladores est n trabajando en nuestro proyecto y queremos mantener pesta as en ambos Podemos seguir m s de un repositorio a la vez con git remote add other git example com some_repo git git pull other some_branch Ahora hemos mezclado una rama desde el segundo repositorio y tenemos acceso f cil a todas las ramas de todos los repositorios git diff origin experimental other some_branch 5 Pero Qu pasa si queremos comparar sus cambios sin afectar nuestro propio trabajo En otras palabras queremos examinar las ramas evitando que sis cambios invadan nuestro directorio de trabajo Entonces en vez de pull corre git fetch Fetch from origin the default git fetch other Fetch from the second programmer Esto s lo obtiene historias Aunque el directorio de trabajo permanece intacto podemos referirnos a cualquier rama de cualquier repositorio en un comando Git ya que ahora poseemos una copia local Recuerda que detr s de las c maras un pull es simplemente un fetch luego merge Usualmente hacemos pull porque queremos mezclar el ltimo commit despu s de un fetch esta situaci n es una excepci n notable Vea git help remote para saber c mo remover repositorios ignorar ciertas ramas y m s 6 8 Mis Preferencias En mis proyectos me gusta que los contribuyentes preparen los repositorios desde los cuales voy a hacer pull Algunos servicios de hosting Git te permiten ho
25. entral server goes down In contrast Git simply keeps the history of your project in the git directory in your working directory This is your own copy of the history so you can stay offline until you want to communicate with others You have total control over the fate of your files because Git can easily recreate a saved state from git at any time 8 2 Integrity Most people associate cryptography with keeping information secret but another equally important goal is keeping information safe Proper use of cryptographic hash functions can prevent accidental or malicious data corruption A SHAT hash can be thought of as a unique 160 bit ID number for every string of bytes you ll encounter in your life Actually more than that every string of bytes that any human will ever use over many lifetimes As a SHA 1 hash is itself a string of bytes we can hash strings of bytes containing other hashes This simple observation is surprisingly useful look up hash chains We ll later see how Git uses it to efficiently guarantee data integrity Briefly Git keeps your data in the git objects subdirectory where instead of normal filenames you ll find only IDs By using IDs as filenames as well as a few lockfiles and timestamping tricks Git transforms any humble filesystem into an efficient and robust database 37 Capitulo 8 Secrets Revealed 8 3 Intelligence How does Git know you renamed a file even though you never mentioned
26. es ejecutar chmod a x hooks post update Ahora t puedes publicar tus ltimas ediciones via SSH desde cualquier clon git push web server path to proj git master y cualquiera puede obtener tu proyecto con 25 Capitulo 6 Git Multijugador git clone http web server proj git 6 3 Git Sobre Cualquier Cosa Quieres sincronizar repositorios sin servidores o incluso sin conexi n de red Necesitas improvisar durante una emergencia Hemos visto c mo git fast export y git fast import pueden convertir repositorios a un nico archivo y viceversa Podr amos transportar tales archivos de ida y vuelta para enviar repositorios git sobre cualquier medio pero una herramienta m s eficiente es git bundle El emisor crea un paquete git bundle create somefile HEAD luego env a el paquete somef ile a la otra parte de alguna forma email pendrive una impresi n xxd y un esc ner OCR leyendo bits a trav s del tel fono se ales de humo etc El receptor recupera los commits del paquete escribiendo git pull somefile El receptor puede incluso hacer esto desde un repositorio vac o A pesar de su tama o somefile contiene el repositorio git original completo En proyectos m s grandes elimina la basura empaquetando s lo los cambios de los que carece el otro repositorio Por ejemplo sup n que el commit 1b6d es commit compartido m s reciente compartido por ambas partes git bundle create
27. gar de eso esta vez consideremos editar un documento Supongamos que Alice inserta una l nea al comienzo de un archivo y Bob agrega una l nea al final de su copia Ambos suben sus cambios La mayor a de los sistemas autom ticamente van a deducir un accionar razonable aceptar y hacer merge Nota del Traductor fusionar en ingl s de los cambios para que tanto la edici n de Alice como la de Bob sean aplicadas Ahora supongamos que Alice y Bob han hecho ediciones distintas sobre la misma l nea Entonces es imposible resolver el conflicto sin intervenci n humana Se le informa a la segunda persona en hacer upload que hay un conflicto de merge y ellos deben elegir entre ambas ediciones o cambiar la l nea por completo Pueden surgir situaciones m s complejas Los sistemas de control de versiones manejan autom ticamente los casos simples y dejan los m s complejos para los humanos Usualmente este comportamiento es configurable Capitulo 2 Trucos Basicos En lugar de sumergirte en un mar de comandos de Git usa estos ejemplos elementales para mojarte los pies A pesar de sus simplicidad todos son tiles De hecho en mis primeros meses con Git nunca fui m s all del material en este cap tulo 2 1 Guardando Estados Est s a punto de intentar algo dr stico Antes de hacerlo toma una instant nea de todos los archivos en el directorio actual con git init git add git commit m My first backup Ahora si tu edici
28. go niisiis ere eker skee ree iE EAEE E E EEan 31 1 2 Commit De Lo Que Cambio ote tees ete ee 31 7 3 M1 Commit Es Muy Grande l s aeiee e nereste r es ssssacbscccesedescogeds sgeastevess ioesssebicescnassdeeseevdssseastesees 31 7 3 1 C mbios en el stage sr ee oeoa e Ee a aie EE EEE EE EEE A oni E ERS 32 TE ANOA Pierdas La Cabeza E E E EA AS 32 TO CATANGO Cae LAS EAE E E E E E E E E EE AE E E ES AE O 33 1 6 Construyendo sobte Gib einna ida 34 TT Acrobacias Pelli iii dada 35 1 38 Mejora T Imagen P blica todita Dean E ca arar adios 36 8 Secrets Revealed escseescicesesedesvessosacscsssersadecberocdeseadesecectooeasuecevedecdesocdnsesSesbedssecesousesieestonsensesvesasesdosusvesooses 37 A O NOE 37 8 2 IME LILY fs soccis sheds r e Sei E rE E ae al mae ed abetted sth ee hoe ee eri nies 37 8 3 Intel Bence citadas 37 NS O 38 8 5 GIF S Or INS coins reos sides 38 8 6 The Object Database iisiiiesei ioir sesnees eres e outed a EeKoo EEEE EVES ESTECO K TEES 38 SBS SAREN EE AEE EE E E EE e SEE EERE ESEE 38 S582 ON 39 IS ada 40 8 10 Indistinguishable From Magic ccescessscesceesreesseeesceeeeeceneeeaceeseeceaeeeaecaeecseeeeaeceeeecseeeaaecses 41 As Defectos de Git sasescissccsissssccbessossasshusduascaseendeosse dovasenga soensesseenseeasouaoessbsoasdansseasasss oaescnesstassvacsooapeseososoens 43 A t Debilidades De SHAT feossccdssdncosesedssnecadescowesceeesocesdedlvndestucssthecstverdosdeseseeccsteddydneustascexsecoedtlessecs 43 AD
29. grosas En estos dias Git hace dif cil que el usuario destruya datos de manera accidental Pero si sabes lo que est s haciendo puedes hacer caso omiso de las trabas de seguridad para los comandos comunes Checkout Los cambios no commiteados hacen que checkout falle Para destruir tus cambios y hacer checkout de un commit dado usa la opci n de forzar git checkout f COMMIT Por otro lado si especificas una ruta espec fica para hacer checkout no hay chequeos de seguridad Las rutas suministradas son sobre escritas de forma silenciosa Hay que tener cuidado al usar checkout de esta forma Reset Reset tambi n falla en presencia de cambios sin commmitear Para hacerlo a la fuerza ejecuta git reset hard COMMIT Branch El borrado de una rama falla si esto causa que se pierdan cambios para forzarlo escribe git branch D BRANCH en lugar de d De forma similar intentar sobreescribir una rama moviendo otra falla si esto resultase en p rdida de datos Para forzar el mover una rama corre git branch M ORIGEN DESTINO en lugar de m A diferencia de checkout y reset estos dos comandos evitan la destrucci n de datos Los cambios est n a n guardados en el subdirectorio git y pueden obteners recuperando el has apropiado de git logs ver Cazando Cabezas arriba Por defecto ser n guardados por al menos dos semanas Clean Algunos comandos de Git se reh san a proceder porque est
30. hand 40 Capitulo 8 Secrets Revealed 8 9 Commits We ve explained 2 of the 3 objects The third is a commit object Its contents depend on the commit message as well as the date and time it was created To match what we have here we ll have to tweak it a little git commit amend m Shakespear Change the commit message git filter branch nv filter export GIT_AUTHOR_DATE Fri 13 Feb 2009 15 31 30 0800 GIT_AUTHOR_NAME Alice GIT_AUTHOR_EMATL alice example com GIT_COMMITTER_DATE Fri 13 Feb 2009 15 31 30 0800 GIT_COMMITTER_NAME Bob GIT_COMMITTER_EMAIL bobltexample com Rig timestamps and authors find git objects type f You should now see git objects 49 993fe130c4b3bf24857a15d7969c396b7bc187 which is the SHA 1 hash of its contents commit 158 NUL tree 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 LF author Alice lt alice example com gt 1234567890 0800 LF committer Bob lt bob example com gt 1234567890 0800 LF LF Shakespeare LF As before you can run zpipe or cat file to see for yourself This is the first commit so there are no parent commits but later commits will always contain at least one line identifying a parent commit 8 10 Indistinguishable From Magic Git s secrets seem too simple It looks like you could mix together a few shell scripts and add a dash of C code to cook it up in a matter of hours a melange of basic f
31. hora De todos modos dado que haz ido haciendo commits seguido Git puede se alar la ubicaci n del problema git bisect start git bisect bad SHA1_DE_LA_VERSION_MALA git bisect good SHA1_DE_LA_VERSION_BUENA T Git hace checkout de un estado a mitad de camino Prueba la funcionalidad y si a n est rota git bisect bad 22 Capitulo 5 Lecciones de Historia Si no lo esta reemplaza bad por good Git una vez mas te transporta a un estado en mitad de camino de las versiones buena y mala acortando las posibilidades Luego de algunas iteraciones esta b squeda binaria va a llevarte al commit que caus el problema Una vez que hayas terminado tu investigaci n vuelve a tu estado original escribiendo git bisect reset En lugar de testear cada cambio a mano automatiza la b squea escribiendo git bisect run COMANDO Git utiliza el valor de retorno del comando dado t picamente un script hecho solo para eso para decidir si un cambio es bueno o malo el comando deber a salir con c digo 0 si es bueno 125 si el cambio se deber a saltear y cualquier cosa entre 1 y 127 si es malo Un valor negativo aborta el bisect Puedes hacer mucho m s la p gina de ayuda explica como visualizar bisects examinar o reproducir el log de un bisect y eliminar cambios inocentes conocidos para que la b squeda sea m s r pida 5 7 Qui n Se Equivoc Como muchos otros sistemas de control de versi
32. igaciones destruyan el SHA1 A 2 Microsoft Windows Git en Microsoft Windows puede ser engorroso e Cygwin http cygwin com un ambiente similar a Linux para Windows contiene una versi n de Git para Windows http cygwin com packages git Git en MSys http code google com p msysgit es una alternativa que requiere un soporte m nimo para la ejecuci n aunqeu algunos de los comandos necesitan cierto trabajo A 3 Archivos No Relacionados Si tu proyecto es muy grande y contiene muchos archivos no relacionados que est n siendo cambiados de manera constante Git puede estar en desventaja ante otros sistemas porque no se monitorean archivos simples Git maneja proyectos enteros lo cual suele ser beneficioso Una soluci n es partir tu proyecto en pedazos cada uno consistiendo de archivos relacionados Usa git submodule si quieres mantener todo en un nico repositorio 43 Ap ndice A Defectos de Git A 4 Qui n Edita Qu Algunos sistemas de control de versiones te fuerzan a marcar un archivo de manera explicita antes de editarlo Si bien esto es especialmente molesto cuando esto involucra comunicarse con un servidor central tambi n tiene dos beneficios 1 Los diffs son r pidos porque solo se precisa examinar los archivos marcados 2 Uno puede descubrir qui n m s est trabajando en el archivo pregunt ndole al servidor central quien lo marc para edici n Con scripts apropiados se puede alcanzar l
33. ilesystem operations and SHA 1 hashing garnished with lock files and fsyncs for robustness In fact this accurately describes the earliest versions of Git Nonetheless apart from ingenious packing tricks to save space and ingenious indexing tricks to save time we now know how Git deftly changes a filesystem into a database perfect for version control For example if any file within the object database is corrupted by a disk error then its hash will no longer match alerting us to the problem By hashing hashes of other objects we maintain integrity at all levels Commits are atomic that is a commit can never only partially record changes we can only compute the hash of a commit and store it in the database after we already have stored all relevant trees blobs and parent commits The object database is immune to unexpected interruptions such as power outages 41 Capitulo 8 Secrets Revealed We defeat even the most devious adversaries Suppose somebody attempts to stealthily modify the contents of a file in an ancient version of a project To keep the object database looking healthy they must also change the hash of the corresponding blob object since it s now a different string of bytes This means they 1l have to change the hash of any tree object referencing the file and in turn change the hash of all commit objects involving such a tree in addition to the hashes of all the descendants of these commits This implies the hash of the
34. its git format patch 1b6d HEAD En el extremo receptor guarda el mensaje a un archivo luego escribe git am lt email txt Esto aplica el parche entrante y tambi n crea el commit incluyendo informaci n tal como el autor Con un cliente de correo puedes necesitar hacer clic en un bot n para ver el mensaje en su forma original antes de guardar el parche a un archivo Hay algunas ligeras diferencias para los clientes basados en casillas de correo pero si t usas uno de esos eres probablemente la persona que puede deducirlo f cilmente sin leer tutoriales 6 5 Lo Siento Nos Hemos Movido Despu s de clonar un repositorio correr git push o git pull har push hacia o pull desde la URL original C mo Git hace esto El secreto est en las opciones de configuraci n creadas con el clone Echemos un vistazo git config list 27 Capitulo 6 Git Multijugador La opci n remote origin url controla la URL fuente origin es un alias dado al repositorio fuente Al igual que con la convenci n de la rama master podemos cambiar o borrar este alias pero usualmente no hay raz n para hacerlo Si el repositorio original se mueve podemos actualizar la URL con git config remote origin url git new url proj git La opci n branch master merge especifica la rama remota por defecto en un git pull Durante la clonaci n inicial se configura a la rama actual del repositorio fuente incluso si el HEAD del
35. jef nada parece cambiar luego de esto echo Mi jefe es m s inteligente que yo gt miarchivo txt git commit a m Otro commit Parecer a que sobreescribimos nuestro archivo y le hicimos commit Pero es una ilusi n Escribe git checkout master cambia a la versi n original del archivo y presto El archivo de texto es restaurado Y si el jefe decide investigar este directorio escribimos git checkout jefe cambia a la versi n adecuada para los ojos del jefe Puedes cambiar entre ambas versiones del archivo cuantas veces quieras y hacer commit en ambas de manera independiente 4 2 Trabajo Sucio Supongamos que est s trabajando en alguna prestaci n y que por alguna raz n necesitas volver a una versi n vieja y poner temporalmente algunos print para ver como funciona algo Entonces git commit a git checkout SHA1_HASH Ahora puedes agregar cualquier c digo temporal horrible por todos lados Incluso puedes hacer commit de estos cambios Cuando termines git checkout master para volver a tu trabajo original Observa que arrastrar s cualquier cambio del que no hayas hecho commit Que pasa si quisieras cambiar los cambios temporales Facil git checkout b sucio y haz commit antes de volver a la branch master Cuando quieras volver a los cambios sucios simplemente escribe git checkout sucio 14 Capitulo 4 Magia Con Los Branches Mencionamos este comando en un capitulo anterior cuando dis
36. libro real impreso para poder citar sus generosas palabras en la tapa a modo de promoci n Hablando en serio aprecio enormemente cada mensaje El leerlos siempre ilumina mi nimo Pr logo 2 Licencia Esta gu a se publica bajo la GNU General Public License versi n 3 http www gnu org licenses gpl 3 0 html Naturalmente los fuentes se guardan en un repositorio Git y pueden ser obtenidos escribiendo git clone git repo or cz gitmagic git Crea el directorio gitmagic Ver debajo por otros mirrors 3 Hosting Git gratuito http repo or cz hospeda proyectos gratuitos incluyendo esta gu a http repo or cz w gitmagic git http gitorious org es un sitio que apunta al hosting de proyectos open source http github com hospeda proyectos open source gratis incluyendo esta gu a http github com blynn gitmagic tree master y proyectos privados por una cuota vi Capitulo 1 Introduccion Voy a usar una analog a para explicar el control de versiones Mira el art culo de wikipedia sobre control de versiones http es wikipedia org wiki Control_de_versiones para una explicaci n m s cuerda 1 1 Trabajar Es Jugar He jugado juegos de PC casi toda mi vida En cambio empec a usar sistemas de control de versiones siendo adulto Sospecho que no soy el nico y comparar ambas cosas puede hacer que estos conceptos sean m s f ciles de explicar y entender Piensa en editar tu c digo o documento o l
37. lo siguiente al inicio del hook pre commit pare prevenirme de la desatenci n if git ls files o grep txtS then echo FALLA Archivos txt sin monitorear exit 1 fi Varias operaciones de git soportan hooks ver git help hooks Se pueden escribir hooks para quejarse de errores ortogr ficos en los mensajes de commit agregar nuevos archivos indentar p rrafos agregar una entrada en una p gina reproducir un sonido etc Hab amos encontrado el hook post update antes cuando discut amos como usar Git sobre HTTP Este hook actualiza algunos archivos que Git necesita para comunicaci n no nativa 36 Capitulo 8 Secrets Revealed We take a peek under the hood and explain how Git performs its miracles I will skimp over details For in depth descriptions refer to the user manual http www kernel org pub software scm git docs user manual html 8 1 Invisibility How can Git be so unobtrusive Aside from occasional commits and merges you can work as if you were unaware that version control exists That is until you need it and that s when you re glad Git was watching over you the whole time Other version control systems force you to constantly struggle with red tape and bureaucracy Permissions of files may be read only unless you explicitly tell a central server which files you intend to edit The most basic commands may slow to a crawl as the number of users increases Work grinds to a halt when the network or the c
38. mbr r pidamente a l dando por ciertas varias funcionalidades Simplemente asum que otros sistemas eran similares elegir un sistema de control de versiones no deber a ser diferente de elegir un editor de texto o navegador web Cuando me vi obligado a usar un sistema centralizado me sorprend Una mala conexi n a internet importa poco con Git pero hace el desarrollo insoportable cuando se necesita que sea confiable como un disco local Adicionalmente me encontr condicionado a evitar ciertos comandos por las latencias involucradas lo que termin evitando que pudiera seguir mi flujo de trabajo deseado Cuando ten a que correr un comando lento la interrupci n de mi tren de pensamiento generaba una cantidad de da o desproporcionada Mientras esperaba que se complete la comunicaci n con el servidor hac a alguna otra cosa para pasar el tiempo como revisar el e mail o escribir documentaci n A la hora de volver a la tarea original el comando hab a terminado hace tiempo y yo perd a m s tiempo intentando recordar qu era lo que estaba haciendo Los humanos no son buenos para el cambio de contexto Tambi n hab a un interesante efecto tragediad de los comunes anticipando la congesti n de la red la gente consume m s ancho de banda que el necesario en varias operaciones intentando anticipar futuras demoras El esfuerzo combinado intensifica la congesti n alentando a las personas a consumir a n m s ancho de banda la pr xima vez
39. n el directorio actual y resolver los detalles por si mismo En lugar del segundo comando add corre git commit a si est s en condiciones de hacer commit Ver en git help ignore como especificar archivos que deber an ser ignorados Puedes hacer lo de arriba en un nico paso con git ls files d m o z xargs 0 git update index add remov Las opciones z y 0 previenen efectos secundarios adversos de archivos que contienen caracteres extra os Como este comando agrega archivos ignorados podr as querer usar la opci n x or X 7 3 Mi Commit Es Muy Grande Postergaste hacer un commit por demasiado tiempo Estabas enfervorizado escribiendo c digo y te olvidaste del control de fuentes hasta ahora Hiciste una serie de cambios no relacionados simplemente porque es tu estilo No te preocupes ejecuta git add p 31 Capitulo 7 Gran Maestria en Git Por cada edici n que hiciset Git va a mostrar el pedazo de c digo que fue cambiado y preguntar si deber a ser parte del pr ximo commit Contesta con y o n Hay otras opciones como posponer la decisi n escribe para saber m s Una vez satisfecho escribe git commit para hacer un commit que solo contiene los cambios seleccionados los cambios staged Aseg rate de omitir la opci n a o Git va a poner todo lo editado en el commit Que pasa si editaste varios archivos en varios lugares Revisar cada cambio uno por uno se vuelve frustran
40. nal bookkeeping Thus I could easily predict what you would see The file s name is irrelevant only the data inside is used to construct the blob object You may be wondering what happens to identical files Try adding copies of your file with any filenames whatsoever The contents of git objects stay the same no matter how many you add Git only stores the data once By the way the files within git objects are compressed with zlib so you should not stare at them directly Filter them through zpipe d http www zlib net zpipe c or type git cat file p aa823728ea7d592acc69b36875a482cd 3fd5c8d which pretty prints the given object 8 8 Trees But where are the filenames They must be stored somewhere at some stage Git gets around to the 39 Capitulo 8 Secrets Revealed filenames during a commit git commit Type some messag find git objects type f You should now see 3 objects This time I cannot tell you what the 2 new files are as it partly depends on the filename you picked We ll proceed assuming you chose rose If you didn t you can rewrite history to make it look like you did git filter branch tree filter mv YOUR_FILENAME rose find git objects type f Now you should see the file git objects 05 b217bb859794408bb9e4f 7f04cbda1b207fbe09 because this is the SHA 1 hash of its contents tree SP 32 NUL 100644 rose NUL 0Oxaa823728ea7d592acc69 b36875a482cdf
41. ndo consideran que es presentable Para hacer esto con Git en el directorio donde guardas tu script git init git add git commit m Primer lanzamiento Entonces puedes decirle a tus usuarios que ejecuten git clone tu maquina ruta al script para descargar tu script Esto asume que tienen acceso por ssh Si no es asi ejecuta git daemon y dile a tus usuarios que usen git clone git tu maquina ruta al script De ahora en mas cada vez que tu script est listo para el lanzamiento escribe git commit a m Siguiente lanzamiento y tus usuarios puede actualizar su versi n yendo al directorio que tiene tu script y ejecutando git pull Tus usuarios nunca terminar n usando una versi n de tu script que no quieres que vean Obviamente este truco funciona para lo que sea no solo scripts Capitulo 2 Trucos B sicos 2 6 Que es lo que hice Averigua que cambios hiciste desde el ltimo commit con git diff O desde ayer S git diff yesterday O entre una versi n en particular y 2 versiones hacia atr s git diff SHA1_HASH master 2 En cado caso la salida es un patch parche que puede ser aplicado con git apply Para ver cambios desde hace 2 semanas puedes intentar git whatchanged since 2 weeks ago Usualmente recorro la historia con qgit http sourceforge net projects qgit dada su interfaz pulida y fotog nica o tig http jonas nitro dk tig una interfaz en modo text
42. nea cuidadosamente organizada 7 4 No Pierdas La Cabeza El tag HEAD Cabeza es como un cursor que normalmente apunta al ltimo commit avanzando con cada nuevo commit Algunos comandos de Git te dejan moverlo Por ejemplo git reset HEAD 3 32 Capitulo 7 Gran Maestria en Git mueve el HEAD tres commits hacia atr s Por lo tanto todos los comandos de Git ahora act an como si no hubieras hecho esos ltimos tres commits mientras tus archivos permanecen en el presente Ver la pagina de ayuda para algunas aplicaciones Como hago para volver al futuro Los commits del pasado nada saben del futuro Teniendo el SHA 1 del HEAD original hacemos git reset SHA1 Pero supongamos que nunca lo anotaste No te preocupes para comandos como este Git guarda el HEAD original como un tag llamado ORIG_HEAD y puedes volver sano y salvo con S git reset ORIG_HEAD 7 5 Cazando Cabezas Quiz s ORIG_HEAD no es suficiente Quiz s acabas de descubrir que cometiste un error monumental y que hay que volver a un commit antiguo en una rama olvidada hace largo tiempo Por defecto Git guarda un commit por al menos 2 semanas incluso si le ordenaste destruir la rama que lo conten a El problema es encontra el hash apropiado Podr as mirar todos los hashes en git objects y usar prueba y error para encontrar el que buscas Pero hay una forma mucho m s f cil Git guarda el hash de cada commit que hace en git logs El subdirectorio refs
43. o mismo con Git Esto requiere cooperaci n del programador quien deber a ejecutar ciertos scripts cuando edita un archivo A 5 Historia Por Archivo Como Git guarda cambios por proyecto reconstruir la historia de un archivo dado requiere m s trabajo que en sistemas de control de versiones que administran archivos individuales El problema suele ser leve y vale tenerlo dado que otras operaciones son incre blemente eficientes Por ejemplo git checkout es m s r pido que cp a y los deltas de un proyecto completo comprimen mejor que colecciones de deltas por archivo A 6 Clonado inicial Cuando hay una historia larga crear un clon es m s costoso que hacer checkout de c digo en otros sistemas de control de versiones El costo inicial lo vale a la larga dado que la mayor a de las operaciones futuras van a ser r pidas y desconectado De todos modos en algunas situaciones seria preferible crear un clon sin profundidad usando la opci n depth Esto es mucho m s r pido pero el clon resultante tiene su funcionalidad reducida A 7 Proyectos Vol tiles Git fue escrito para ser r pido respecto al tama o de los cambios Los humanos hacen peque as ediciones de versi n a versi n Un bugfix de una l nea ac una nueva funcionalidad all comentarios retocados y as en adelante Pero si tus archivos son radicalmente diferentes en revisiones sucesivas entonces en cada commit tu historia crece necesariamente igual que tu pr
44. o que funciona bien a trav s conexiones lentas Como alternativa puedes instalar un servidor web ejecutar git instaweb y utilizar cualquier navegador web 2 7 Ejercicio Siendo A B C y D cuatro commits sucesivos donde B es el mismo que A pero con algunos archivos eliminados Queremos volver a agregar los archivos en D pero no en B C mo podemos hacer esto Hay por lo menos tres soluciones Asumiendo que estamos en D 1 La diferencia entre A y B son los archivos eliminados Podemos crear un patch representando esta diferencia y aplicarlo git diff BA git apply 2 Como en A tenemos los archivos guardados podemos recuperarlos git checkout A ARCHIVOS 3 Podemos ver el pasaje de A a B como un cambio que queremos deshacer git revert B Cu l alternativa es la mejor Cualquiera que prefieras Es f cil obtener lo que quieres con Git y normalmente hay varias formas de hacerlo Capitulo 3 Clonando En sistemas de control de versiones antiguos checkout es la operaci n standard para obtener archivos Obtienes un conjunto de archivos en estado guardado que solicistaste En Git y otros sistemas de control de versiones distribu dos clonar es la operaci n standard Para obtener archivos se crea un clon de un repositorio entero En otras palabras practicamente se crea una copia id ntica del servidor central Todo lo que se pueda hacer en el repositorio principal tambi n podr s hacerlo 3 1 Sincronizar Comput
45. o que sea como si fuera jugar un juego Una vez que progresaste mucho te gustar a guardar Para lograrlo haces click en el bot n de Guardar en tu editor de confianza Pero esto va a sobreescribir tu versi n antigua Es como esos viejos juegos que solo ten an un slot para guardar se pod a guardar pero nunca pod as volver a un estado anterior Esto era una pena porque tu versi n anterior pod a haber estado justo en una parte que era particularmente divertida y pod as querer volver a jugarla alg n d a O peor a n tu partida actual est en un estado donde es imposible ganar y tienes que volver a empezar 1 2 Control De Versiones Cuando est s editando puedes Guardar Como un archivo diferente o copiar el archivo a otro lugar antes de guardar si quieres probar versiones viejas Tambi n puedes usar compresi n para ahorrar espacio Esta es una forma primitiva y muy trabajosa de control de versiones Los videojuegos han mejorado esto hace ya tiempo muchas veces permitiendo guardar en varios slots fechados autom ticamente Hagamos que el problema sea un poco m s complejo Imagina que tienes un mont n de archivos que van juntos como el c digo fuente de un proyecto o archivos para un sitio web Ahora si quieres mantener una vieja versi n debes archivar un directorio completo Tener muchar versiones a mano es inconveniente y r pidamente se vuelve costoso Con algunos juegos una partida guardada en realidad consis
46. obre los hombros de gigantes Con unos pocos ajustes puedes personalizar Git para cubrir tus necesidades Un truco simple es usar los alias incluidos en git para acortar los comandos usados de forma m s frecuente git config global alias co checkout git config global get regexp alias muestra los alias actuales alias co checkout git co foo igual a git checkout foo Otro es imprimir la rama actual en el prompt o en el t tulo de la ventana Usar git symbolic ref HEAD muestra el nombre de la rama actual En la pr ctica es probable que quieras quitar el refs heads e ignorar los errores git symbolic ref HEAD 2 gt dev null cut b 12 El subdirectorio cont rib es la cueva de los tesoros de las herramientas hechas con Git Con tiempo algunas de ellas pueden ser promovidas a comandos oficiales En Debian y Ubuntu este directorio est en usr share doc git core contrib 34 Capitulo 7 Gran Maestria en Git Un residente popular es workdir git new workdir Usando symlinks inteligentes este script crea un nuevo directorio de trabajo cuya historia es compartida con el repositorio original git new workdir repositorio existente nuevo directorio El nuevo directorio y sus archivos interiores pueden ser vistos como un clon excepto que como la historia es compartida ambos rboles se mantienen sincronizados de forma autom tica No hay necesidad de merges push ni pull 7 7 Acrobacias Peli
47. official head differs to that of the bad repository By following the trail of mismatching hashes we can pinpoint the mutilated file as well as the commit where it was first corrupted In short so long as the 20 bytes representing the last commit are safe it s impossible to tamper with a Git repository What about Git s famous features Branching Merging Tags Mere details The current head is kept in the file git HEAD which contains a hash of a commit object The hash gets updated during a commit as well as many other commands Branches are almost the same they are files in git refs heads Tags too they live in git refs tags but they are updated by a different set of commands 42 Apendice A Defectos de Git Hay algunos problema con Git que barri bajo la alfombra Algunos pueden ser manejados con facilidad utilizando scripts y hooks otros requieren reorganizar or redefinir el proyecto y por las molestias que quedan uno simplemente va a tener que esperar O mejor a n unirse y ayudar A 1 Debilidades De SHA1 A medida que pasa el tiempo los cript grafos descubren m s y m s debilidades de SHA1 Al d a de hoy encontrar colisiones en los hashes es feasible para organizaciones con buenos fondos En unos a os quiz s incluso una PC t pica tendr suficiente poder de c mputo para corromper un repositorio de Git de manera silenciosa Esperemos que Git migre a una funci n de hash mejor antes de que nuevas invest
48. ommit refs heads master committer Alice lt alice example com gt Thu 01 Jan 1970 00 00 00 0000 data lt lt EOT Initial commit EOT 100644 inline hello c data lt lt EOT include lt stdio h gt int main printf Hello world n return 0 EOT 21 Capitulo 5 Lecciones de Historia commit refs heads master committer Bob lt bob example com gt Tue 14 Mar 2000 01 59 26 0800 data lt lt EOT Replace printf with write EO 100644 inline hello c data lt lt EOT include lt unistd h gt int main write 1 Hello world n 14 return 0 Luego crea un repositorio Git desde este archivo temporal escribiendo mkdir project cd project git init git fast import lt tmp history Puedes hacer checkout de la ltima versi n del proyecto con git checkout master El comando git fast export convierte cualquier repositorio de git al formato de git fast import y puedes estudiar su salida para escribir exportadores y tambi n para transportar repositorios de git en un formato legible por humanos De hecho estos comandos pueden enviar repositorios de archivos de texto sobre canales de solo texto 5 6 D nde Nos Equivocamos Acabas de descubrir una prestaci n rota en tu programa y est s seguro que hace unos pocos meses funcionaba Argh De donde sali este bug Si solo hubieras ido testeando a medida que desarrollabas Es demasiado tarde para eso a
49. omunicaci n con el servidor es innecesaria a7 1 3 1 Una Tonta Supersticion Una creencia popular err nea es que los sistemas distribu dos son poco apropiados para proyectos que requieren un repositorio central oficial Nada podr a estar m s lejos de la verdad Fotografiar a alguien no Capitulo 1 Introducci n hace que su alma sea robada clonar el repositorio central no disminuye su importancia Una buena aproximaci n inicial es que cualquier cosa que se puede hacer con un sistema de control de versiones centralizado se puede hacer mejor con un sistema de versiones distribu do que est bien dise ado Los recursos de red son simplemente m s costosos que los recursos locales Aunque luego veremos que hay algunas desventajas para un sistema distribu do hay menos probabilidad de hacer comparaciones erroneas al tener esto en cuenta Un proyecto peque o puede necesitar solo una fracci n de de las caracter sticas que un sistema as ofrece Pero usar as n meros romanos si solo necesitas usar n meros peque os Adem s tu proyecto puede crecer m s all de tus expectativas originales Usar Git desde el comienzo es como llevar una navaja suiza aunque solo pretendas usarla para abrir botellas El d a que necesites desesperadamente un destornillador vas a agradecer el tener m s que un simple destapador 1 4 Conflictos al fusionar Para este tema habr a que estirar demasiado nuestra analog a con un videojuego En lu
50. ones Git tiene un comando blame git blame ARCHIVO que anota cada l nea en el archivo dado mostrando qui n fue el ltimo en cambiarlo y cuando A diferencia de muchos otros sistemas de control de versiones esta operaci n trabaja desconectada leyendo solo del disco local 5 8 Experiencia Personal En un sistema de control de versiones centralizado la modificaci n de la historia es una operaci n dificultosa y solo disponible para administradores Clonar hacer branches y merges es imposible sin comunicaci n de red Lo mismo para operaciones b sicas como explorar la historia o hacer commit de un cambio En algunos sistemas los usuarios requieren conectividad de red solo para ver sus propios cambios o abrir un archivo para edici n Los sistemas centralizados no permiten trabajar desconectado y necesitan una infraestructura de red m s cara especialmente a medida que aumenta el n mero de desarrolladores Lo m s importante todas las operaciones son m s lentas de alguna forma usualmente al punto donde los usuarios evitan comandos avanzados a menos que sean absolutamente necesarios En casos extremos esto se da incluso para los comandos m s b sicos Cuando los usuarios deben correr comandos lentos la productividad sufre por culpa de un flujo de trabajo interrumpido 23 Capitulo 5 Lecciones de Historia Yo experiment estos fen menos de primera mano Git fue el primer sistema de control de versiones que us Me acostu
51. orta vida de manera frecuente por razones similares cada branch sirve simplemente para salvar el estado actual y permitirte saltar a un estado anterior para solucionar un bug de alta prioridad o algo Es an logo a cambiar el canal de la TV temporalmente para ver que otra cosa est n dando Pero en lugar de apretar un par de botones tienes que crear hacer checkout y eliminar branches y commits temporales Por suerte Git tiene un aatajo que es tan conveniente como un control remoto de TV git stash Esto guarda el estado actual en un lugar temporal un stash y restaura el estado anterior Tu directorio de trabajo se ve id ntico a como estaba antes de que comenzaras a editar y puedes solucionar bugs traer cambios desde otros repositorios etc Cuando quieras volver a los cambios del stash escribe git stash apply Puedes necesitar corregir conflictos Puedes tener varios stashes y manipularlos de varias maneras Mira git help stash Como es de imaginar Git mantiene branches de manera interna para lograr este truco m gico 17 Capitulo 4 Magia Con Los Branches 4 8 Trabaja como quieras Aplicaciones como Mozilla Firefox http www mozilla com permiten tener varias pesta as y ventanas abiertas Cambiar de pesta a te da diferente contenido en la misma ventana Los branches en git son como pesta as para tu directorio de trabajo Siguiendo esta analog a el clonar es como abrir una nueva ventana La posibilidad de ambas cosa
52. oyecto entero 44 Ap ndice A Defectos de Git No hay nada que ning n sistema de control de versiones pueda hacer sobre esto pero los usuarios standard de Git van a sufrir m s dado que las historias son clonadas La raz n por la que los cambios son tan grandes deber an ser examinadas Tal vez los formatos de los archivos deber an ser cambiados ediciones peque as deber an causar cambios menores en a lo sumo unos pocos archivos O tal vez una base de datos o una soluci n de backup archivado es lo que realmente se necesita no un sistema de control de versiones Por ejemplo un el control de versiones es poco adecuado para administrar fotos tomadas peri dicamente con una webcam Si los archivos deben cambiar constantemente y realmente se necesita que est n versionados una posibilidad es usar Git de una forma centralizada Uno puede crear clones sin profundidad lo cual acarrea poco y nada de la historia del proyecto Por supuesto muchas herramientas de git no van a estar disponibles y los arreglos deben ser enviados como patches Esto probablement no sea problema dado que no est claro por qu alguien quisiera un historial de archivos salvajemente inestables Otro ejemplo es un proyecto que depende de firmware que toma la forma de un archivo binario enorme La historia de este firmware no es de inter s para los usuarios y las actualizaciones comprimen de forma insatisfactoria por lo que las revisiones de firmware aumentar
53. oyecto git HEAD Ya estamos listos Para copiarse los fuentes un desarrollador escribe git clone git servidor central ruta al proyecto git Luego de hacer cambios el c digo en env a al servidor central con git commit a git push Si hubo actualizaciones en el servidor principal la ltima versi n debe ser tra da antes de enviar lo nuevo Para sincronizar con la ltima versi n git commit a git pull 3 3 Bifurcando fork un proyecto Harto de la forma en la que se maneja un proyecto Crees que podr as hacerlo mejor Entonces en tu servidor git clone git servidor principal ruta a archivos Luego avisale a todos de tu fork del proyecto en tu servidor Luego en cualquier momento puedes unir merge los cambios del proyecto original con git pull 3 4 Respaldos Definitivos Quieres varios respaldos redundantes a prueba de manipulaci n y geogr ficamente diversos Si tu proyecto tiene varios desarrolladores no hagas nada Cada clon de tu c digo es un backup efectivo No 10 Capitulo 3 Clonando s lo del estado actual sino que tambi n de la historia completa de tu proyecto Gracias al hashing criptogr fico si hay corrupci n en cualquiera de los clones va a ser detectado tan pronto como intente comunicarse con otros Si tu proyecto no es tan popular busca tantos servidores como puedas para hospedar tus clones El verdadero paranoico deber a siempre escribir el ltimo hash
54. ra arreglarlo e Reemplaza pick por squash para unir un commit con el anterior Si marcaste un commit para edici n entonces ejecuta git commit amend En caso contrario corre git rebase continue Por lo tanto es bueno hacer commits temprano y seguido siempre se puede acomodar despu s usando rebase 5 3 Los Cambios Locales Al Final Est s trabajando en un proyecto activo Haces algunos commits locales por un tiempo y entonces sincronizas con el rbol oficial usando un merge Este ciclo se repite unas cuantas veces antes de estar listo para hacer push hacia el rbol central El problema es que ahora la historia en tu clon local de Git es un entrevero de tus cambios y los cambios oficiales Preferir as ver todos tus cambios en una secci n contigua luego de todos los cambios oficiales Lo descrito arriba es un trabajo para git rebase En muchos casos se puede usar la bandera onto y evitar la interacci n Ver git help rebase para ejemplos detallados de este asombroso comando Se pueden partir commits Incluso se pueden reordenar las branches de un rbol 5 4 Reescribiendo la Historia Ocasionalmente se necesita algo equivalente a borrar gente de fotos oficiales pero para control de c digo para borrar cosas de la historia de manera Stalinesca Por ejemplo supongamos que queremos lanzar un proyecto pero involucra un archivo que deber a ser privado por alguna raz n Quiz s dej mi 20 Capitulo
55. repositorio fuente se mueve posteriormente a una rama diferente m s tarde un pull va a seguir fielmente la rama original Esta opci n s lo se aplica al repositorio en la primera vez que se clona que es guardado en la opci n branch master remote Si tiramos desde otros repositorios debemos decirle expl citamente que rama queremos git pull git example com other git master El ejemplo de m s arriba explica por qu algunos de nuestros ejemplos anteriores de push y pull no ten an argumentos 6 6 Ramas Remotas Cuando clonas un repositorio tambi n clonas todas sus ramas T puedes no haber notado esto porque Git los esconde debes consultar por ellos espec ficamente Esto evita que las ramas en el repositorio remoto interfieran con tus ramas y tambi n hace a Git m s f cil para los principiantes Lista las ramas remotas con git branch r Deber as ver algo como esto origin HEAD origin master origin experimental Estas representan ramas y el HEAD del repositorio remoto y pueden ser usados en los comandos regulares de Git Por ejemplo sup n que has hecho muchos commits y deseas compararlos con la ltima versi n tra da T podr as buscar en los registros logs por el hash SHA1 adecuado pero es mucho m s f cil escribir git diff origin HEAD 28 Capitulo 6 Git Multijugador O puedes ver lo que ha sucedido con la rama experimental git log origin experimental 6 7 Multiples R
56. s editar la Parte II antes de subir la Parte I involucra sufrimiento e infortunio En Git los branches y merges son indoloros un termino t cnico que significa r pidos y locales Entonces luego de que hayas hecho commit de la primera parte y la hayas enviado a ser revisada git checkout b parte2 Luego escribe la segunda parte del gran cambio sin esperar a que la primera sea aceptada Cuando la primera parte sea aprobada y subida 15 Capitulo 4 Magia Con Los Branches git checkout master git merge parte2 git branch d parte2 ya no se necesita esta branch y la segunda parte del cambio est lista para la evaluaci n Pero esperen Qu pasa si no fuera tan simple Digamos que tuviste un error en la primera parte el cual hay que corregir antes de subir los cambios No hay problema Primero vuelve a la branch master usando git checkout master Soluciona el error en la primera parte del cambio y espera que sea aprobado Si no lo es simplemente repite este paso Probablemente quieras hacer un merge de la versi n arreglada de la Parte I con la Parte It git checkout parte2 git merge master Ahora es igual que lo anterior Una vez que la primera parte sea aprobada git checkout master git merge parte2 git branch d parte2 y nuevamente la segunda parte est lista para ser revisada Es f cil extender este truco para cualquier cantidad de partes 4 5 Reorganizando Una Mezcla Quiz s
57. s es lo que mejora la experiencia del usuario En un nivel m s alto varios window managers en Linux soportan m ltiples escritorios Usar branches en Git es similar a cambiar a un escritorio diferente mientras clonar es similar a conectar otro monitor para ganar un nuevo escritorio Otro ejemplo es el programa screen http www gnu org software screen Esta joya permite crear destruir e intercambiar entre varias sesiones de terminal sobre la misma terminal En lugar de abrir terminales nuevas clone puedes usar la misma si ejecutas screen branch De hecho puedes hacer mucho m s con screen pero eso es un asunto para otro manual Usar clone branch y merge es r pido y local en Git anim ndote a usar la combinaci n que m s te favorezca Git te permite trabajar exactamente como prefieras 18 Capitulo 5 Lecciones de Historia Una consecuencia de la naturaleza distribuida de git es que la historia puede ser editada facilmente Pero si manipulas el pasado ten cuidado solo reescribe la parte de la historia que solamente t posees As como las naciones discuten eternamente sobre qui n cometi qu atrocidad si otra persona tiene un clon cuya versi n de la historia difiere de la tuya vas a tener problemas para reconciliar ambos rboles cuando stos interact en Por supuesto si tambi n controlas todos los dem s rboles puedes simplemente sobreescribirlos Algunos desarrolladores est n convencidos de que la historia
58. somefile HEAD 1b6d Si se hace a menudo uno puede olvidar f cilmente cual commit fue el ltimo enviado La p gina de ayuda sugiere usar tags para resolver esto Es decir despu s de que env as un paquete escribe git tag f lastbundle HEAD y crea nuevos paquetes de actualizaci n con git bundle create newbundle HEAD lastbundle 6 4 Parches La Moneda Global Los parches son representaciones de texto de tus cambios que pueden ser facilmente entendidos por computadores y humanos por igual Esto les da una calidad universal Puedes enviar por email un parche 26 Capitulo 6 Git Multijugador a los desarrolladores sin importar qu sistema de control de versiones est n usando Mientras tu audiencia pueda leer su email ella puede ver tus ediciones Similarmente por tu lado todo lo que requieres es una cuenta de correo no hay necesidad de crear un repositorio Git en linea Recuerda del primer capitulo git diff lb6d gt my patch obtiene un parche que puede se pegado en un email para discusi n En un repositorio Git escribe git apply lt my patch para aplicar el parche En un ambiente m s formal cuando los nombres de los autores y quiz s las firmas deben ser guardadas genera los parches correspondientes pasados un cierto punto escribiendo git format patch 1b6d Los archivos resultantes pueden ser enviados a git send email o enviado a mano Tambi n puedes especificar un rango de comm
59. spedar tu propia bifurcaci n de un proyecto con el clic de un bot n Despu s de que obtengo un rbol uso comandos Git para navegar y examinar los cambios los que idealmente est n bien organizados y biein descritos Mezclo mis propios cambios y quiz s hago m s 29 Capitulo 6 Git Multijugador ediciones Una vez satisfecho los empujo al repositorio principal Aunque rara vez recibo contribuciones creo que este enfoque escala bien Vea http torvalds family blogspot com 2009 06 happiness is warm scm html esta entrada de blog por Linus Torvalds Permanecer en el mundo Git es ligeramente mds conveniente que parchar archivos dado que me ahorra convertirlos a commits de Git Adem s Git maneja detalles como grabar el nombre y direcci n de email del autor as como la hora y fecha y le pide al autor desdribir sus propios cambios 30 Capitulo 7 Gran Maestria en Git Esta p gina con nombre pretencioso es el caj n donde dejar los trucos de Git no categorizados 7 1 Lanzamientos de C digo Para mis proyectos Git controla nicamente los ficheros que me gustar a archivar y enviar a los usuarios Para crear un tarball del c digo fuente ejecuto git archiv format tar prefix proj 1 2 3 HEAD 7 2 Commit De Lo Que Cambio Decirle a Git cuando agregaste eliminaste o renombraste archivos es complicado para ciertos proyectos En cambio puedes escribir git add git add u Git va a mirar los archivos e
60. te de un directorio lleno de archivos Estos videojuegos ocultan este detalle del jugador y presentan una interfaz conveniente para administrar diferentes versiones de este directorio Los sistemas de control de versiones no son diferentes Todos tienen lindas interfaces para administrar un Capitulo 1 Introducci n directorio de cosas Puedes guardar el estado del directorio tantas veces como quieras y tiempo despu s puedes cargar cualquiera de los estados guardados A diferencia de la mayor a de los juegos normalmente estos sistemas son inteligentes en cuanto la conservaci n del espacio Por lo general solo algunos pocos archivos cambian de versi n a versi n y no es un gran cambio Guardar las diferencias en lugar de nuevas copias ahorra espacio 1 3 Control Distribuido Ahora imagina un juego muy dif cil Tan dif cil para terminar que muchos jugadores experientes alrededor del mundo deciden agruparse e intercambiar sus juegos guardados para intentar terminarlo Los Speedruns son ejemplos de la vida real los jugadores se especializan en diferents niveles del mismo juego y colaboran para lograr resultados sorprendentes C mo armar as un sistema para que puedan descargar las partidas de los otros de manera simple Y para que suban las nuevas Antes cada proyecto usaba un control de versiones centralizado Un servidor en alg n lado conten a todos los juegos salvados Nadie m s los ten a Cada jugador ten a a lo sumo un un
61. te y adormecedor En este caso usa git add i cuya interfaz es menos clara pero m s flexible Con solo presionar un par de teclas puedes poner o sacar del stage varios archivos a la vez o revisar y seleccionar cambios solamente en archivos particulares Como alternativa se puede usar git commit interactive el cual hace commit luego de que terminas 7 3 1 Cambios en el stage Hasta ahora hemos evitado el famoso indice de git pero ahora debermos enfrentarlo para explicar lo de arriba El indice es un area temporal de montaje Git evita enviar datos directamente entre tu proyecto y su historia En su lugar Git primero escribe datos al ndice y luego copia los datos del ndice a su destino final Por ejemplo commit a es en realidad un proceso de 2 pasos El primer paso pone una foto del estado actual de cada archivo administrado en el ndice El segundo paso graba de forma permanente esa foto que est en el ndice Un commit hecho sin a solo efect a el segundo paso y solo tiene sentido luego de haber ejecutado comandos que de alguna forma alteran el ndice como git add Usualmente podemos ignorar el ndice y pretender que estamos leyendo y escribiendo directo en la historia En esta ocasi n queremos un control m s fino de lo que se escribe en la historia y nos vemos forzados a manipular el ndice Guardamos una foto de algunos pero no todos de nuestros cambios en el ndice y luego grabamos de forma permanenta esta instant
62. the fact explicitly Sure you may have run git mv but that is exactly the same as a git rm followed by a git add Git heuristically ferrets out renames and copies between successive versions In fact it can detect chunks of code being moved or copied around between files Though it cannot cover all cases it does a decent job and this feature is always improving If it fails to work for you try options enabling more expensive copy detection and consider upgrading 8 4 Indexing For every tracked file Git records information such as its size creation time and last modification time in a file known as the index To determine whether a file has changed Git compares its current stats with those cached in the index If they match then Git can skip reading the file again Since stat calls are considerably faster than file reads if you only edit a few files Git can update its state in almost no time We stated earlier that the index is a staging area Why is a bunch of file stats a staging area Because the add command puts files into Git s database and updates these stats while the commit command without options creates a commit based only on these stats and the files already in the database 8 5 Git s Origins This Linux Kernel Mailing List post http lkml org Ikml 2005 4 6 121 describes the chain of events that led to Git The entire thread is a fascinating archaeological site for Git historians 8 6 The Object Database
63. uta antes git commit a No te gusta cortar y pegar hashes Entonces usa git checkout Mi primer r para saltar al commit que comienza con el mensaje dado Tambi n puedes pedir el 5to estado hacia atr s git checkout master 5 2 2 1 Revirtiendo En una corte los eventos pueden ser eliminados del registro Igualmente puedes elegir commits espec ficos para deshacer git commit a git revert SHA1_HASH va a deshacer solo el commit con el hash dado Ejecutar git log revela que el revert es registrado como un nuevo commit 2 3 Descargando Archivos Obt n una copia de un proyecto administrado por git escribiendo git clone git servidor ruta a los archivos Por ejemplo para bajar todos los archivos que us para crear este sitio git clone git git or cz gitmagic git Pronto tendremos mas para decir acerca del comando clone Capitulo 2 Trucos B sicos 2 4 Lo Mas Nuevo Si ya descargaste una copia de un proyecto usando git clone puedes actualizarte a la ltima versi n con git pull 2 5 Publicaci n Al Instante Imagina que has escrito un script que te gustar a compartir con otros Puedes decirles que simplemente lo bajen de tu computadora pero si lo hacen mientras est s haciendo una modificaci n pueden terminar en problemas Es por esto que existen los ciclos de desarrollo Los programadores pueden trabajar en un proyecto de manera frecuente pero solo hacen p blico el c digo cua
64. y ver a Git como un artefacto que puede asombrar a los amigos y enfurecer a los enemigos con sus maravillosas habilidades En lugar de ser detallados proveemos instrucciones generales para efectos particulares Luego de un uso reiterado gradualmente ir s entendiendo como funciona cada truco y como adaptar las recetas a tus necesidades Otras ediciones Traducci n al chino http docs google com View id dfwthj68_675gz3bw8kj por JunJie Meng y JiangWei Una nica p gina book html HTML simple sin CSS Archivo PDF book pdf Listo para imprimir Paquete gitmagic para Debian http packages debian org search searchon names amp keywords gitmagic Consigue una copia r pida y local de este sitio Paquete para Ubuntu Jaunty Jackalope http packages ubuntu com jaunty gitmagic tambi n disponible til cuando este servidor est offline para mantenimiento http csdcf stanford edu status 1 Gracias Agradezco a Dustin Sallings Alberto Bertogli James Cameron Douglas Livingstone Michael Budde Richard Albury Tarmigan Derek Mahar y Frode Aannevik por sugerencias y mejoras Gracias a Daniel Baumann por crear y mantener el paquete para Debian Tambi n gracias a JunJie Meng y JiangWei por la traduccci n al chino Si me olvid de t por favor recu rdamelo porque suelo olvidarme de actualizar esta secci n Estoy muy agradecido por todos los que me han dado apoyo y elogios Me gustar a que este fuera un

Download Pdf Manuals

image

Related Search

Related Contents

How to use the Online Randomization System  Ben tass hino 12M3  Z7101 Installation and Owners Manual  PAIN SCREENING: - Vanderbilt University Medical Center  Paris : ESF.  Samsung SGH-C200 manual de utilizador  

Copyright © All rights reserved.
DMCA: DMCA_mwitty#outlook.com.