(DVCS) keeps track of software revisions and allows many developers to work on a given project without necessarily being connected to a common network." http://en.wikipedia.org/wiki/Distributed_revision_control
es una copia total independiente Portabilidad Acceso total a todo el repositorio Múltiples usuarios trabajando simultáneamente Poder viajar en el tiempo Libertad total en nuestro repositorio! Todo se referencia mediante hashes únicos Poder colaborar en diferentes proyectos Historial detallado, no como en VSS Ramas locales diferentes de las remotas
son puramente del autor de este documento y están basadas en su experiencia trabajando con las herramientas documentadas. No se pretende intentar cambiar la mentalidad ni la percepción de ninguna persona ni mucho menos desprestigiar alguna de estas herramientas. "No importa qué herramienta uses, importa que uses una y ésta se adapte a tus necesidades." Alejandro el informático
tracks content, not files Más rápido No es un solo binario, sino que se trata de un binario que llama diferentes herramientas lo cual lo hace muy extensible s t a s h b l a m e r e b a s e Mejor algoritmo para manejar m e r g e De fácil configuración, tanto de servidor como cliente
Menos espacio en disco h g Numeración consecutiva auxiliar Mejor clones que ramas Más lento Más espacio en disco No es tan "fácilmente" extensible "Más fácil de aprender" g i t VS h g
Más difícil de configurar Únicamente centralizado Dependencia total del servidor Dependencia de la red, VPN Únicamente se obtienen los cambios, no el repositorio entero No podemos hacer commits si el repositorio no está actualizado Cada b r a n c h es en realidad un clon Más lento Mucho más espacio en disco g i t VS s v n
herramientas para trabajar Gestores de proyectos, tareas, tickets... Github Bitbucket Gitosis / Gitolite Muy potente De fácil configuración Mejor rendimiento
configuración personales, .gitconfig, .hgrc, .vimrc, etc. Diferentes ficheros, PSD, DOC, ODT... Sistemas de logs Clon de Github, http://gitlabhq.com/ Sistemas de tickets distribuidos https://github.com/jeffWelling/ticgit http://ditz.rubyforge.org/ Ficheros de configuración Diferentes perfiles Originales deploys en servicios de terceros: Heroku Github pages Blogs Octopress Jekyll Bases de datos distribuidas http://code.google.com/p/gimd/ https://github.com/bestpractical/prophet Herramientas tipo dropbox con hosting propio http://sparkleshare.org/ Wikis http://atonie.org/2008/02/gitwiki http://ikiwiki.info/ http://gitit.net/ MÚLTIPLES USOS
: El fichero ~/.gitconfig y el fichero /path/to/repo/.git/config Configuración por CLI Los dos métodos nos permiten tener configuraciones locales y generales.
i t , por ejemplo: $ g i t f i x como alias de $ g i t c h e c k o u t - b f i x Colores Definir los colores para los logs y los diff Archivos ignorados Ignorar ficheros a nivel personal/usuario o general Core Espacios, tabulaciones, terminaciones de línea Merge Definir la herramienta para usar
a m e = J o h n D o e e m a i l = j o h n @ d o e . c o m [ a l i a s ] f i x = g i t c h e c k o u t - b f i x [ d i f f ] t o o l = v i m d i f f [ c o l o r " d i f f " ] o l d = r e d n e w = b l u e
f i g [ - - g l o b a l ] u s e r . n a m e " J o h n D o e " $ g i t c o n f i g [ - - g l o b a l ] u s e r . e m a i l " j o h n @ d o e . c o m " $ g i t c o n f i g [ - - g l o b a l ] a l i a s . f i x c h e c k o u t - b f i x $ g i t c o n f i g [ - - g l o b a l ] c o l o r . d i f f a u t o $ g i t c o n f i g [ - - g l o b a l ] c o r e . e d i t o r v i m
un repositorio único y personal o compartido con otros desarrolladores(centralizado). Personal $ g i t i n i t { n a m e } compartido $ g i t i n i t - - b a r e { n a m e }
e El b a r e indica si se trata de un repositorio el cual permitirá que se hagan commits de otras personas. De esta manera diferentes personas pueden hacer p u s h /p u l l sin romper el working directory de otros desarrolladores. $ l s b r a n c h e s c o n f i g d e s c r i p t i o n H E A D h o o k s i n f o o b j e c t s r e f s
Fichero para definir los archivos o directorios que no queremos que se guarden en el repositorio. Por ejemplo, añadimos lo siguiente: $ v i m . g i t i g n o r e t m p / b i n / * . l o g
definen el estado de nuestros ficheros. Fichero no registrado $ g i t s t a t u s Añadir los cambios para registrarlos $ g i t a d d { f i l e } [ - a ] Commit $ g i t c o m m i t [ - m " A D D { f i l e } " ]
# O n b r a n c h m a s t e r # # I n i t i a l c o m m i t # # U n t r a c k e d f i l e s : # ( u s e " g i t a d d < f i l e > . . . " t o i n c l u d e i n w h a t w i l l b e c o m m i t t e d ) # # m a i n . c n o t h i n g a d d e d t o c o m m i t b u t u n t r a c k e d f i l e s p r e s e n t ( u s e " g i t a d d " t o t r a c k )
n . c Si queremos añadir solo algunas partes del fichero debemos ejecutar: # O n b r a n c h m a s t e r # # I n i t i a l c o m m i t # # C h a n g e s t o b e c o m m i t t e d : # ( u s e " g i t r m - - c a c h e d > f i l e > . . . " t o u n s t a g e ) # # n e w f i l e : m a i n . c # g i t a d d - p m a i n . c
[ - m ] A D D m a i n . c f o r o u r f i r s t c o m m i t # P l e a s e e n t e r t h e c o m m i t m e s s a g e f o r y o u r c h a n g e s . # L i n e s s t a r t i n g w i t h ' # ' w i l l b e i g n o r e d , # a n d a n e m p t y m e s s a g e a b o r t s t h e c o m m i t . # O n b r a n c h m a s t e r # # I n i t i a l c o m m i t # # C h a n g e s t o b e c o m m i t t e d : # ( u s e " g i t r m - - c a c h e d > f i l e > . . . " t o u n s t a g e ) # # n e w f i l e : m a i n . c #
de ver qué cambios se han realizado y quién ha sido el autor. El histórico en modo gráfico siempre se ha de leer de abajo hacia arriba. H E A D hace referencia a la rama o estado en el que nos encontramos actualmente. $ g i t l o g c o m m i t 1 a 3 0 2 4 d f 8 5 5 6 0 d 6 b 6 1 5 a 7 a 3 9 5 c 4 2 a 9 9 1 8 0 e d 5 4 c b A u t h o r : J o h n D o e < j o h n @ d o e . c o m > D a t e : S a t O c t 1 5 1 8 : 0 0 : 0 0 2 0 1 1 + 0 2 0 0 A D D m a i n . c f o r o u r f i r s t c o m m i t 6 . * b c f b 7 b 1 - ( H E A D , m a s t e r ) M E R G E m e s s a g e d e s c r i p t i o n 5 . | \ 4 . | * 9 a 8 c 9 8 3 - ( d e v e l o p ) C H A N G E m e s s a g e t e x t 3 . * | c a 8 0 c c 9 - C H A N G E j u s t c h a n g e t h e m e s s a g e 2 . | / 1 . * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t
repositorio para poder trabajar sin tocar el desarrollo principal, la rama master que es la rama por defecto que se crea. Por tanto podemos decir que todo en g i t son ramas. En g i t una rama no crea una copia entera del proyecto, g i t tracks content, not files. Remember?
[ - d | - D ] { n a m e } Crear una rama $ g i t b r a n c h { n a m e } Eliminar una rama de manera segura, si ya hemos obtenido los cambios $ g i t b r a n c h - d { n a m e } Eliminar una rama definitivamente $ g i t b r a n c h - D { n a m e } * c a 8 0 c c 9 - ( H E A D , m a s t e r ) C H A N G E j u s t c h a n g e t h e m e s s a g e | * 9 a 8 c 9 8 3 - ( d e v e l o p ) C H A N G E m e s s a g e t e x t | / * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t
u t Nos permite cambiar de rama o restaurar nuestro Working directory o fichero. Crear una rama y cambiar automáticamente $ g i t c h e c k o u t - b { n a m e } cambiar a una rama $ g i t c h e c k o u t { n a m e } Restaurar el Working directory o fichero. $ g i t c h e c k o u t - f [ f i l e n a m e ]
revision control, is a fundamental operation that reconciles multiple changes made to a revisioncontrolled collection of files." En la mayoría de casos únicamente hemos de ejecutar: $ g i t m e r g e t o o l
0 c c 9 - ( H E A D , m a s t e r ) C H A N G E j u s t c h a n g e t h e m e s s a g e | * 9 a 8 c 9 8 3 - ( d e v e l o p ) C H A N G E m e s s a g e t e x t | / * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t $ g i t m e r g e d e v e l o p A u t o - m e r g i n g m a i n . c C O N F L I C T ( c o n t e n t ) : M e r g e c o n f l i c t i n m a i n . A u t o m a t i c m e r g e f a i l e d ; f i x c o n f l i c t s a n d t h e n c o m m i t t h e r e s u l t .
la herramienta definida o la primera que encuentra que sea capaz de manejar situaciones de m e r g e $ g i t m e r g e t o o l * b c f b 7 b 1 - ( H E A D , m a s t e r ) M E R G E m e s s a g e d e s c r i p t i o n | \ | * 9 a 8 c 9 8 3 - ( d e v e l o p ) C H A N G E m e s s a g e t e x t * | c a 8 0 c c 9 - C H A N G E j u s t c h a n g e t h e m e s s a g e | / * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t
} commits anteriores, perdiendo todo el que teníamos hasta ahora y dejando el repositorio en aquel estado. $ g i t r e s e t H E A D ^ { n } [ - - s o f t | - - h a r d ] * b c f b 7 b 1 - ( H E A D , m a s t e r ) M E R G E m e s s a g e d e s c r i p t i o n | \ | * 9 a 8 c 9 8 3 - C H A N G E m e s s a g e t e x t * | c a 8 0 c c 9 - C H A N G E j u s t c h a n g e t h e m e s s a g e | / * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t $ g i t r e s e t H E A D ^ 1 * c a 8 0 c c 9 - ( H E A D , m a s t e r ) C H A N G E j u s t c h a n g e t h e m e s s a g e | * 9 a 8 c 9 8 3 - ( d e v e l o p ) C H A N G E m e s s a g e t e x t | / * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t
poder ver cómo estaba el repositorio en un commit determinado y hacer las acciones pertinentes. $ g i t c h e c k o u t { h a s h } * b c f b 7 b 1 - ( H E A D , m a s t e r ) M E R G E m e s s a g e d e s c r i p t i o n | \ | * 9 a 8 c 9 8 3 - C H A N G E m e s s a g e t e x t * | c a 8 0 c c 9 - C H A N G E j u s t c h a n g e t h e m e s s a g e | / * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t $ g i t c h e c k o u t - b c a 8 0 c c 9 * b c f b 7 b 1 - ( m a s t e r ) M E R G E m e s s a g e d e s c r i p t i o n | \ | * 9 a 8 c 9 8 3 - ( d e v e l o p ) C H A N G E m e s s a g e t e x t * | c a 8 0 c c 9 - ( H E A D , t e m p ) C H A N G E j u s t c h a n g e t h e m e s s a g e | / * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t
revertir y crear un nuevo commit con el estado de aquel commit. $ g i t r e v e r t { h a s h } $ g i t r e v e r t 1 9 6 e 3 f 4 * 5 6 6 8 7 4 d - ( H E A D , m a s t e r ) R e v e r t " A D D f 1 f i l e " * 1 f e 4 b 7 9 - A D D m o r e c o m m e n t s * 6 4 2 5 1 7 8 - A D D c o m m e n t s * 1 9 6 e 3 f 4 - A D D f 1 f i l e * b c f b 7 b 1 - M E R G E m e s s a g e d e s c r i p t i o n | \ | * 9 a 8 c 9 8 3 - ( d e v e l o p ) C H A N G E m e s s a g e t e x t * | c a 8 0 c c 9 - C H A N G E j u s t c h a n g e t h e m e s s a g e | / * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t
empezar a trabajar. Tenemos diferentes sistemas, dependiendo del protocolo: s s h g i t h t t p [ s ] c l o n e g i t @ g i t h u b . c o m : a i n f o r m a t i c o / j e c o o k i e . g i t g i t c l o n e g i t : / / g i t h u b . c o m / a i n f o r m a t i c o / j e c o o k i e . g i t g i t c l o n e h t t p s : / / g i t h u b . c o m / a i n f o r m a t i c o / j e c o o k i e . g i t
t utilizan las ramas para poder separar el desarrollo en diferentes piezas. develop: el desarrollo continuo fix: hacer fixes en el desarrollo feature: crear nuevas funcionalidades master: la versión estable del proyecto, rama por defecto http://nvie.com/posts/asuccessfulgitbranchingmodel/
desarrollos locales como remotos. Cuando se desarrolla una nueva funcionalidad, se realiza un fix o un test, se piden los cambios de la rama master y si hace falta se hace un merge, se prueban los cambios y se suben a la rama principal. Normalmente se acostumbra a tener una persona encargada de hacer los m e r g e a master y controlar el flujo de commits de los desarrolladores.
a g b u n d l e p a t c h b l a m e s u b m o d u l e r e b a s e c h e r r y - p i c k Hooks Trabajando en remoto Gitweb Gitosis / Gitolite Github Bitbucket
s a v e { d e s c } ] $ g i t s t a s h l i s t $ g i t s t a s h s h o w [ - p ] s t a s h @ { n } $ g i t s t a s h b r a n c h { n a m e } [ s t a s h @ { n } ] $ g i t s t a s h a p p l y [ s t a s h @ { n } ] $ g i t s t a s h p o p [ s t a s h @ { n } ] $ g i t s t a s h d r o p s t a s h @ { n } $ g i t s t a s h c l e a r s t a s h Guarda el estado del repositorio modificado en una pila de cambios que se pueden aplicar en cualquier momento.
s a v e { d e s c } ] Guardamos el estado actual del repositorio modificado. $ g i t s t a s h s a v e a d d m a i n d e c l a r a t i o n S a v e d w o r k i n g d i r e c t o r y a n d i n d e x s t a t e O n d e v e l o p : a d d m a i n d e c l a r a t i o n H E A D i s n o w a t 1 a 3 0 2 4 d A D D m a i n . c f o u r o u r f i r s t c o m m i t * T e n e m o s l o s c a m b i o s i n i c i a l e s m á s l o s u r g e n t e s m á s l o s g u a r d a d o s e n l a p i l a | * A p l i c a m o s l o s c a m b i o s d e l s t a s h | \ | | | | * | R e a l i z a m o s l o s c a m b i o s u r g e n t e s | * G u a r d a m o s l o s c a m b i o s e n e l s t a s h | / * C a m b i o s a c t u a l e s
i s t Listamos el estado de la pila de cambios. $ g i t s t a s h l i s t s t a s h @ { 0 } : O n d e v e l o p : a d d m a i n d e c l a r a t i o n s t a s h @ { 1 } : O n f i x : f i x i n g b u g # 1 6 3 3 8 s t a s h @ { 2 } : O n t e s t : h o l d f o r s o c k e t s t e s t * 8 7 8 b 4 9 d - ( r e f s / s t a s h ) O n m a s t e r : s a v e a d d m a i n d e c l a r a t i o n | \ | * 1 0 b 9 1 6 6 - i n d e x o n m a s t e r : b c f b 7 b 1 M E R G E m e s s a g e d e s c r i p t i o n | / * b c f b 7 b 1 - ( H E A D , m a s t e r ) M E R G E m e s s a g e d e s c r i p t i o n | \ | * 9 a 8 c 9 8 3 - ( d e v e l o p ) C H A N G E m e s s a g e t e x t * | c a 8 0 c c 9 - C H A N G E j u s t c h a n g e t h e m e s s a g e | / * c a f f 1 d 7 - A D D m a i n . c f o r o u r f i r s t c o m m i t
h o w [ - p ] s t a s h @ { n } Listamos los cambios hechos en el estado n de la pila. $ g i t s t a s h s h o w - p s t a s h @ { 0 } d i f f - - g i t a / m a i n . c b / m a i n . c i n d e x e 6 9 d e 2 9 . . 9 d 9 f 7 b e 1 0 0 6 4 4 - - - a / m a i n . c + + + b / m a i n . c @ @ - 0 , 0 + 1 , 7 @ @ + # i n c l u d e < s t d i o . h > + + i n t m a i n ( v o i d ) + { + p r i n t f ( " \ n H e l l o W o r l d . \ n " ) ; + r e t u r n 0 ; + } $ g i t s t a s h s h o w s t a s h @ { 0 } m a i n . c | 7 + + + + + + + 1 f i l e s c h a n g e d , 7 i n s e r t i o n s ( + ) , 0 d e l e t i o n s ( - )
r a n c h { n a m e } [ s t a s h @ { n } ] Trasladamos los cambios del estado n a la rama { n a m e } y borramos el estado de la pila. $ g i t s t a s h b r a n c h t e s t s t a s h @ { 0 } S w i t c h e d t o a n e w b r a n c h ' t e s t ' # O n b r a n c h t e s t # C h a n g e d b u t n o t u p d a t e d : # ( u s e " g i t a d d > f i l e > . . . " t o u p d a t e w h a t w i l l b e c o m m i t t e d ) # ( u s e " g i t c h e c k o u t - - > f i l e > . . . " t o d i s c a r d c h a n g e s i n w o r k i n g d i r e c t o r y ) # # m o d i f i e d : m a i n . c # n o c h a n g e s a d d e d t o c o m m i t ( u s e " g i t a d d " a n d / o r " g i t c o m m i t - a " ) D r o p p e d s t a s h @ { 0 } ( 4 a 1 f b 8 c 4 1 1 9 8 a 8 9 6 6 a 7 7 b 5 0 6 b 4 5 4 7 4 5 f b a a 2 5 8 7 e )
p p l y [ s t a s h @ { n } ] Aplicamos los cambios de el estado n . $ g i t s t a s h a p p l y # O n b r a n c h d e v e l o p # C h a n g e d b u t n o t u p d a t e d : # ( u s e " g i t a d d > f i l e > . . . " t o u p d a t e w h a t w i l l b e c o m m i t t e d ) # ( u s e " g i t c h e c k o u t - - > f i l e > . . . " t o d i s c a r d c h a n g e s i n w o r k i n g d i r e c t o r y ) # # m o d i f i e d : m a i n . c # n o c h a n g e s a d d e d t o c o m m i t ( u s e " g i t a d d " a n d / o r " g i t c o m m i t - a " )
o p [ s t a s h @ { n } ] Igual que $ g i t s t a s h a p p l y [ s t a s h @ { n } ] pero elimina el estado de la pila $ g i t s t a s h p o p s t a s h @ { 0 } # O n b r a n c h d e v e l o p # C h a n g e d b u t n o t u p d a t e d : # ( u s e " g i t a d d > f i l e > . . . " t o u p d a t e w h a t w i l l b e c o m m i t t e d ) # ( u s e " g i t c h e c k o u t - - > f i l e > . . . " t o d i s c a r d c h a n g e s i n w o r k i n g d i r e c t o r y ) # # m o d i f i e d : m a i n . c # n o c h a n g e s a d d e d t o c o m m i t ( u s e " g i t a d d " a n d / o r " g i t c o m m i t - a " ) D r o p p e d s t a s h @ { 0 } ( 4 a 1 f b 8 c 4 1 1 9 8 a 8 9 6 6 a 7 7 b 5 0 6 b 4 5 4 7 4 5 f b a a 2 5 8 7 e )
r o p s t a s h @ { n } Elimina el estado n de la pila. $ g i t s t a s h d r o p s t a s h @ { 0 } D r o p p e d s t a s h @ { 0 } ( 4 a 1 f b 8 c 4 1 1 9 8 a 8 9 6 6 a 7 7 b 5 0 6 b 4 5 4 7 4 5 f b a a 2 5 8 7 e )
e identificar un punto en concreto de todo el histórico de nuestro repositorio. Normalmente se usan para identificar releases. Tag identificable $ g i t t a g v 0 . 1 b 5 4 7 e 8 4 Tag con comentarios $ g i t t a g - a v 0 . 1 - m " T h e f i r s t s t a b l e v e r s i o n " b 5 4 7 e 8 4 Tag firmado con PGP $ g i t t a g - s v 0 . 1 - m " T h e f i r s t s t a b l e v e r s i o n " b 5 4 7 e 8 4
{ p a t t e r n } ] $ g i t t a g - l v 0 . * v 0 . 1 v 0 . 2 $ g i t s h o w v 0 . 1 t a g v 0 . 1 T a g g e r : J o h n D o e < j o h n @ d o e . c o m > D a t e : S a t O c t 1 5 1 8 : 0 0 : 0 0 2 0 1 1 + 0 2 0 0 T h e f i r s t s t a b l e v e r s i o n c o m m i t b 5 4 7 e 8 4 6 9 4 e a d d 4 5 9 6 7 c 3 5 0 4 c 1 2 b b 1 9 b d 1 9 c e 7 8 3 A u t h o r : J o h n D o e < j o h n @ d o e . c o m > D a t e : S a t O c t 1 5 1 8 : 0 0 : 0 0 2 0 1 1 + 0 2 0 0 A D D b a s i c m a i n d e c l a r a t i o n t o m a i n f i l e d i f f - - g i t a / m a i n . c b / m a i n . c i n d e x e 6 9 d e 2 9 . . 9 d 9 f 7 b e 1 0 0 6 4 4 - - - a / m a i n . c + + + b / m a i n . c @ @ - 0 , 0 + 1 , 7 @ @ + # i n c l u d e < s t d i o . h > + + i n t m a i n ( v o i d ) + { + p r i n t f ( " \ n H e l l o W o r l d . \ n " ) ; + r e t u r n 0 ; + }
d l e es un paquete que contiene todo o parte de nuestro repositorio y es fácil de transportar y clonar. 1. $ g i t b u n d l e c r e a t e { n a m e } [ - - a l l | { t a g } | { b r a n c h } | { g i t _ d a t e _ f o r m a t } ] 2. $ g i t p u l l | c l o n e { n a m e } [ { b r a n c h } ]
h es un fichero que contiene los cambios de uno o más commits para aplicarlos en un repositorio. 1. $ g i t f o r m a t - p a t c h [ { t a g } | { h a s h } ] [ - - s t d o u t > f i l e ] 2. $ g i t a p p l y - - s t a t { n a m e } F r o m 5 7 7 8 6 9 2 5 2 e b d 0 c 3 c 0 5 3 7 1 5 f e 7 0 2 e 0 6 1 b 8 4 4 1 a 6 a 3 M o n S e p 1 7 0 0 : 0 0 : 0 0 2 0 0 1 F r o m : J o h n D o e < j o h n @ d o e . c o m > D a t e : S a t , 1 5 O c t 2 0 1 1 1 8 : 0 0 : 0 0 + 0 2 0 0 S u b j e c t : [ P A T C H ] A D D m a i n d e c l a r a t i o n d o c u m e n t a t i o n - - - m a i n . c | 8 + + + + + + + + 1 f i l e s c h a n g e d , 8 i n s e r t i o n s ( + ) , 0 d e l e t i o n s ( - ) d i f f - - g i t a / m a i n . c b / m a i n . c i n d e x 9 d 9 f 7 b e . . 6 a f 0 1 7 0 1 0 0 6 4 4 - - - a / m a i n . c + + + b / m a i n . c @ @ - 1 , 5 + 1 , 1 3 @ @ # i n c l u d e < s t d i o . h > + / * * + * T h e m a i n d e c l a r a t i o n + * + * @ a u t h o r J o h n D o e < j o h n @ d o e . c o m > + * + * @ r e t u r n i n t + * + * * / i n t m a i n ( v o i d ) { p r i n t f ( " \ n H e l l o W o r l d . \ n " ) ; }
nos permite ver por cada línea de código quién ha sido el autor o el último en modificar ésta. Se acabaron echar las culpas a otro. $ g i t b l a m e m a i n . c ^ c a f f 1 d 7 ( A l e j a n d r o E l I n f o r m á t i c o 2 0 1 2 - 0 9 - 2 7 0 0 : 0 0 : 0 0 + 0 2 0 0 1 ) # i n c l u d e < s t d i o . h > ^ c a f f 1 d 7 ( A l e j a n d r o E l I n f o r m á t i c o 2 0 1 2 - 0 9 - 2 7 0 0 : 0 0 : 0 0 + 0 2 0 0 2 ) ^ c a f f 1 d 7 ( J o h n D o e 2 0 1 2 - 0 9 - 2 6 0 0 : 0 0 : 0 0 + 0 2 0 0 3 ) i n t m a i n ( v o i d ) ^ c a f f 1 d 7 ( J o h n D o e 2 0 1 2 - 0 9 - 2 6 0 0 : 0 0 : 0 0 + 0 2 0 0 4 ) { b c f b 7 b 1 c ( J o h n D o e 2 0 1 2 - 0 9 - 2 5 0 0 : 0 0 : 0 0 + 0 2 0 0 5 ) p r i n t f ( " \ n ' H e l l o W o r l d ' i s j u s t a n e x a m . . . ^ c a f f 1 d 7 ( J o h n D o e 2 0 1 2 - 0 9 - 2 5 0 0 : 0 0 : 0 0 + 0 2 0 0 6 ) r e t u r n 0 ; ^ c a f f 1 d 7 ( A l e j a n d r o E l I n f o r m á t i c o 2 0 1 2 - 0 9 - 2 7 0 0 : 0 0 : 0 0 + 0 2 0 0 7 ) }
permite tener un repositorio g i t dentro de un otro repositorio, por ejemplo un proyecto principal para el cual se desarrollan plugins. Una nota importante sobre s u b m o d u l e es que estos no se mantienen sincronizados automáticamente, lo hemos de hacer manualmente y para cada cambio que se haga en el s u b m o d u l e hemos de hacer un commit en nuestro repositorio principal.
Añadir un s u b m o d u l e . $ g i t s u b m o d u l e a d d s s h : / / s e r v e r / p a t h / t o / r e p o { d e s t i n a t i o n } I n i t i a l i z e d e m p t y G i t r e p o s i t o r y i n / p a t h / t o / r e p o / { d e s t i n a t i o n } [ . . . ] $ g i t s t # O n b r a n c h d e v e l o p # C h a n g e s t o b e c o m m i t t e d : # ( u s e " g i t r e s e t H E A D < f i l e > . . . " t o u n s t a g e ) # # n e w f i l e : . g i t m o d u l e s # n e w f i l e : { d e s t i n a t i o n } #
Cuando hacemos un clon de un repositorio que tiene asociado uno o más s u b m o d u l e , estos no estarán inicializados por lo tanto hemos de: 1. $ g i t s u b m o d u l e i n i t 2. $ g i t s u b m o d u l e u p d a t e
historial para combinar diferentes commits o reordenarlos. Por ejemplo: Podemos obtener: NOTA: no debemos usar r e b a s e en commits que ya hayan sido publicados. E - - - F - - - G f o o / b a r / A - - - B - - - C - - - D m a s t e r A - - - B - - - C - - - D - - - E - - - F m a s t e r
k Nos permite mover commits a lo largo del historial o entre diferentes ramas. Un uso común es mover algún commit de una rama a otra para poder continuar el desarrollo. Podemos obtener: E - - - F - - - G f o o / b a r / A - - - B - - - C - - - D m a s t e r E - - - F - - - G f o o / b a r / A - - - B - - - C - - - D - - - F ' m a s t e r
un determinado evento. Estos scripts es encuentran en el directorio . g i t / h o o k s de nuestro repositorio. podemos agrupar los hooks en: 1. Hooks del lado del cliente 2. Hooks del lado del servidor
lo tanto ninguna persona los puede modificar ni se transfieren en un clon, p u s h o p u l l . p r e - c o m m i t Se ejecuta antes de escribir el mensaje de commit. Líneas finales, lint... p r e p a r e - c o m m i t - m s g Se ejecuta antes del editor del mensaje y después del mensaje por defecto del commit. Podemos editar el mensaje por defecto c o m m i t - m s g Se ejecuta antes de guardar el mensaje. Nos permite verificar las directrices de los mensajes p o s t - c o m m i t Se ejecuta una vez acabado todo el proceso del commit. Normalmente para notificaciones
y p a t c h - m s g Verificar las directrices de los mensajes p r e - a p p l y p a t c h Se ejecuta antes de aplicar un p a t c h p o s t - a p p l y p a t c h Se ejecuta después de aplicar el p a t c h
e - r e b a s e Se ejecuta antes de hacer r e b a s e . Evitar r e b a s e en commits que han estado subidos p o s t - c h e c k o u t Se ejecuta después de hacer c h e c k o u t . Para inicializar el working directory, compilar, documentación... p o s t - m e r g e Se ejecuta después de aplicar un m e r g e correctamente. Cambiar permisos, copiar ficheros...
antes y después de hacer p u s h . p r e - r e c e i v e Se ejecuta antes de hacer p u s h . Normalmente para controlar permisos p o s t - r e c e i v e Se ejecuta una vez acabado el proceso de p u s h . Notificaciones, parsear el mensaje de commit y cerrar tickets... u p d a t e Igual que p r e - r e c e i v e pero controla los ramas para separado
h TRABAJANDO EN REMOTO Cuando trabajamos en remoto hacemos p u s h a un repositorio de tipo b a r e cuando ya tenemos una posible versión final de nuestros cambios. Normalmente en local se trabaja en ramas y una vez acabado el trabajo hacemos m e r g e con nuestra rama master con tal de hacer p u s h desde ésta hacia a una rama de test o implementación que será revisada y después combinada con la rama master remota. Tenemos diferentes maneras de enviar los nuestros cambios:
lectura Al tratarse de un protocolo muy usado, puede funcionar bajo cortafuegos corporativos INCONVENIENTES Muy ineficiente, genera mucho tráfico No hay control de credenciales TRABAJANDO EN REMOTO - HTTP[S] Pensado para repositorios de solo lectura, y en determinados casos en repositorios de escritura. g i t [ p u l l | p u s h ] h t t p [ s ] : / / s e r v i d o r / p a t h / t o / r e p o } [ { r a m a } ]
Se necesita configurar un daemon g i t Difícil de configurar No hay autenticación, por tanto no hay control de acceso Puerto no estándar, 9418 TRABAJANDO EN REMOTO - GIT PROTOCOL Idealmente el git protocol está pensado para tener repositorios readonly, ya que no hay control de usuarios y permisos. g i t [ p u l l | p u s h ] g i t : / / { s e r v i d o r } / p a t h / t o / r e p o . g i t [ { b r a n c h } ]
necesita la configuración del s s h Control específico para cada usuario, mediante hooks INCONVENIENTES No hay acceso anónimo/público Sin configuración de acceso por repositorio, cualquier usuario puede hacer cambios en cualquier repositorio El usuario ha de tener un cuenta s s h en el servidor Vulnerabilidades del servicio Violaciones de políticas de seguridad TRABAJANDO EN REMOTO - s s h Podemos hacer p u l l o p u s h mediante el protocolo s s h . g i t [ p u l l | p u s h ] s s h : / / { [ u s u a r i o @ ] s e r v i d o r / p a t h / t o / r e p o } [ { r a m a } ]
los servidores que usamos, con el fin de facilitar nuestra gestión. $ g i t r e m o t e a d d { n a m e } s s h : / / s e r v e r / p a t h / t o / r e p o A partir de este momento podemos hacer: $ g i t p u s h { n a m e } { b r a n c h } Al clonar g i t automáticamente crea el remote origin, que es aquel destino desde el que nos hemos clonado el repositorio.
nuestro repositorio, normalmente para acceso local o de red local pero también puede servir de acceso público si se configura junto con nuestro servidor web. Nos permite ver los commits, d i f f , l o g , b r a n c h , t a g ... en nuestro navegador web. http://git.kernel.org GITWEB $ g i t i n s t a w e b [ - - h t t p d = l i g h t t p d | a p a c h e 2 | w e b r i c k ] [ - - s t o p ]
Permisos específicos por usuario, grupo, b r a n c h , t a g y repositorio Alias para el path de cada repositorio Gitosis https://github.com/res0nat0r/gitosis Gitolite https://github.com/sitaramc/gitolite GITOSIS / GITOLITE Son un conjunto de scripts que nos permiten tener un control exhaustivo de los usuarios y sus permisos para cada repositorio.
principalmente con el desarrollo Open Source, pero con características Premium. Muy extendido en la red Una gran de comunidad de desarrolladores detrás Se puede colaborar fácilmente con otros proyectos, Fork y Pull request Wiki, Issue tracking system Colaboradores, organizaciones Seguir continuamente los cambios de los proyectos Mejorar nuestro CV Se integra con muchos gestores de tareas o proyectos https://github.com/ @ainformatico GITHUB
de 2011 proporciona soporte para g i t . Proporciona repositorios privados ilimitados Todavía poco conocido en el mundo git, pero contiene muchos proyectos importantes Wiki, Issue tracking system Fork y Pull request Dominios propios Colaboradores, organizaciones Se integra con otras herramientas de Atlassian https://bitbucket.org/ @ainformatico BITBUCKET
, http://bit.ly/33872n Convertir s v n a g i t , http://bit.ly/qa7c0B Sistema de tickets distribuidos, https://github.com/jeffWelling/ticgit Más información, http://bit.ly/2V6CFi $ g i t i n i t n e w - p r o j e c t