Gestión de Proyectos Con Git: CORE IWEB 2018-2019 Santiago Pavón Juan Quemada Versión: 2019-01-30
Gestión de Proyectos Con Git: CORE IWEB 2018-2019 Santiago Pavón Juan Quemada Versión: 2019-01-30
con Git
CORE IWEB 2018-2019
Santiago Pavón
Juan Quemada
Versión: 2019-01-30
1
Gestión de Versiones a mano
2
© Santiago Pavón - UPM-DIT
3
Introducción a GIT
4
GIT
GIT: gestor de versiones
• Desarrollado por Linus Torwalds para
Linux
- Desarrollo colaborativo de
proyectos
5
Políticas de Organización
Flujo de trabajo centralizado
6
Flujo de trabajo Integration-Manager
7
Flujo de trabajo Dictador - Tenientes
8
Servidores
Los desarrolladores tienen copias de los repositorios en sus ordenadores de
trabajo, pero además, los repositorios también suelen estar alojados en
ordenadores que hacen el papel de servidores.
9
GITHUB
Portal Web para alojar repositorios GIT
• Enfoque social y colaborativo
• Facilita la comunicación en un grupo y con terceros
10
Instalar GIT
En Ubuntu:
• Instalar el paquete git ejecutando:
$ sudo apt-get install git
En Mac:
• Instalar Xcode.
• Alternativa Home Brew.
En Windows:
• El instalador está en http://msysgit.github.com
- Al instalar indicar que queremos ejecutar git desde el terminal de
comandos.
- Se instalará cygwin con más comandos unix.
11
Historia de un Proyecto
Durante la vida de un proyecto se hacen cambios, generando
nuevas versiones de él.
12
Árbol de desarrollo
Proyectos software en equipo son complejos.
13
Información almacenada en .git
En el subdirectorio .git se almacena:
• objetos que representan los ficheros, los directorios, los
commit,...
• Referencias a repositorios remotos, ramas, ...
• Configuraciones
• ...
14
*de Scott Chanson: http://git-scm.org/book/
© Santiago Pavón - UPM-DIT
15
Árbol de Commits
La historia de versiones (commits) es un árbol.
• Cada commit apunta a su padre (o padres).
16
Comandos Básicos
17
Ayuda
Ayuda en línea de comandos:
$ git help # Muestra lista con los comandos existentes
Chuleta:
http://ndpsoftware.com/git-cheatsheet.html
18
Configurar GIT
Usar el comando git config para manejar la configuración de un proyecto.
19
Crear Proyecto desde Cero
El proyecto gestionado por GIT debe estar contenido en un directorio:
• El directorio de trabajo: contiene los ficheros y subdirectorios del proyecto.
demo$ git init # Crea un nuevo proyecto GIT vacío en directorio demo
# Se crea el subdirectorio .git con los ficheros del repositorio
demo$ git commit -m 'Primera version' # Congela una versión del proyecto en el repositorio
20
Clonar un Proyecto Existente
Para crear un duplicado de un proyecto git existente se usa el comando:
git clone <URL>
21
Secciones de un Proyecto GIT
Directorio de trabajo
• Contiene los ficheros con los que
estamos trabajando.
- Se habrán copiado (checkout) de una
versión del repositorio, o habrán sido
creados por nosotros.
metadatos, ...
22
Estado de los Ficheros
Estado de los ficheros del directorio de trabajo.
• Untracked. Ficheros que no están bajo el control de versiones.
• Tracked. Ficheros bajo el control de versiones:
- Unmodified: fichero no modificado, idéntico a la versión del repositorio.
- Modified: fichero con modificaciones no incluidas en el staging area.
- Staged: fichero con modificaciones a incluir en próximo commit.
Untracked files:
(use "git add <file>..." to include what will be committed) Ficheros no gestionados
merge.java por GIT y no excluidos
library/lib.js por .gitignore
24
.gitignore
En el fichero .gitignore se añade el nombre de los ficheros que no debe gestionar GIT.
• git status no los presentará como ficheros untracked.
• git add . no los añadirá al staging area.
Ejemplos:
private.txt excluir los ficheros con nombre private.txt
*.class excluir los ficheros bytecode de java
*.[oa] excluir ficheros acabados en .o y .a
!lib.a no excluir el fichero lib.a
*~ excluir ficheros acabados en ~
testing/ excluir los directorios llamados testing
© Santiago Pavón - UPM-DIT
25
Consultar Cambios: No Staged
El comando git diff muestra las modificaciones realizadas en los ficheros
del área de trabajo que aun no han sido incluidas en el staging área.
$ git diff
diff --git a/benchmarks.rb b/benchmarks.rb modificaciones en benchmarks.rb
index 3cb747f..da65585 100644
--- a/benchmarks.rb
+++ b/benchmarks.rb
@@ -36,6 +36,10 @@ def main rango de líneas con cambios
@commit.parents[0].parents[0].parents[0]
end lineas no modificadas
- # -> insert new task here líneas eliminadas empiezan por - menos
+ run_code(x, 'commits 1') do líneas añadidas empiezan por + mas
+ git.commits.size
+ end
+
run_code(x, 'commits 2') do lineas no modificadas
log = git.commits('master', 15)
log.size
26
Consultar Cambios: Staged
El comando git diff con la opción --cached o la opción --staged muestra las
modificaciones que han sido staged para añadir en el próximo commit.
27
Historia de versiones: git log
Mostrar la historia de versiones congeladas (commits):
$ git log
Opciones:
-NUMERO muestra los últimos NUMERO commits.
--oneline muestra una línea por commit
--stat muestra estadísticas
--p muestra diferencias entre commits
--graph muestra un gráfico ASCII con ramas y merges
--decorate=auto muestra las referencias (ramas) de os commits listados
--since=2.weeks muestra commits de las últimas 2 semanas
28
$ git log -2
commit 973751d21c4a71f13a2e729ccf77f3a960885682
Author: Juan Quemada <[email protected]>
Date: Mon Nov 21 18:17:13 2011 +0100
commit 27ec17607086f1bffd0695791a8fc263f87d405f
Author: Juan Quemada <[email protected]>
Date: Mon Nov 21 18:16:03 2011 +0100
29
Ver la historia de versiones gráficamente: gitk
30
Git integrado en muchos IDEs
31
Borrar Ficheros
El comando git rm elimina un fichero en la próxima versión a congelar.
El comando /bin/rm borra ficheros del directorio de trabajo, pero no añade este cambio en el
staging area.
• Es como hacer una modificación en el contenido del fichero.
• Debe usarse git add o git rm para meter en el staging area esta modificación.
$ rm CharIO.java Borra el fichero de directorio de trabajo,
pero este cambio aun no ha sido staged.
32
Renombrar Ficheros
El comando git mv se usa para mover o renombrar un fichero en
la próxima versión a congelar.
$ git mv filename_old filename_new
• Se implementa internamente ejecutando git rm y git add.
• El comando anterior es equivalente a ejecutar:
$ mv filename_old filename_new
$ git rm filename_old
$ git add filename_new
33
Deshacer operaciones realizadas:
Modificar el último commit
El comando git commit --amend se usa para rehacer el último commit realizado.
• Para cambiar el mensaje de log.
• Para añadir una modificación olvidada
• ...
Ejemplo:
• Creamos un commit:
$ git commit -m 'Editr aca bado'
- pero hemos olvidado modificar un fichero, y el mensaje de log tiene algún error:
• Realizamos los cambios olvidados, y los añadimos al staging area:
$ git add forgotten_file
• Ahora repetimos git commit pero con la opción --amend y un nuevo mensaje de log
$ git commit --amend -m "Editor acabado"
• Este comando elimina el commit erróneo y se crea un nuevo commit.
IMPORTANTE:
• No usar la opción --amend sobre un commit que se haya subido a un repositorio público.
• Podemos incomodar el trabajo realizado por otros desarrolladores que se base en el commit
borrado.
34
Deshacer operaciones realizadas:
Eliminar Modificaciones Staged
Ejemplo:
• Modificamos readme.txt y añadimos los cambios en el staging area:
$ vi readme.txt
$ git add readme.txt
- Pero nos arrepentimos, y queremos dar marcha atrás
• Para cambiar el estado de readme.txt a unstaged ejecutamos:
$ git reset HEAD readme.txt
• Ahora:
- readme.txt ya no está modificado en el staging area.
- pero conserva sus modificaciones en el directorio de trabajo.
35
Deshacer operaciones realizadas:
Eliminar Modificaciones en el Directorio de Trabajo
Ejemplo:
• Modificamos el fichero readme.txt.
$ vi readme.txt
- pero nos arrepentimos de los cambios realizados.
• Para restaurar el fichero a su estado original ejecutamos:
$ git checkout -- readme.txt
36
Ramas
37
¿Qué es una Rama?
Una rama es un puntero a un commit.
• Este puntero se reasigna al crear nuevos commits.
38
Para crear nuevas ramas:
$ git branch <nombre>
• Se crea un nuevo puntero.
39
Existe una referencia llamada HEAD que apunta a la rama actual
• que apunta al commit sobre el que trabajamos.
- los ficheros del directorio de trabajo y del staging area están basados en
este commit.
• Los nuevos commits se añaden al commit apuntado por HEAD.
40
Para cambiar de rama actual:
$ git checkout <nombre_rama>
• HEAD apuntará a la nueva rama.
• Se actualiza el directorio de trabajo y el staging area.
41
Al hacer commit avanza la rama apuntada por HEAD.
$ git commit
42
Para volver a la rama master:
$ git checkout master
• HEAD apuntará a la nueva rama.
• Se actualiza el directorio de trabajo y el staging area.
43
Si hacemos un nuevo commit:
• avanza la rama apuntada por HEAD,
es decir, avanza la rama master.
$ git commit
44
Crear Ramas y Cambiar de Rama
45
Cambiar de Rama
Para cambiar de rama:
$ git checkout <nombre>
46
Más usos de git checkout
Deshacer todos los cambios staged en el directorio de trabajo:
$ git checkout .
47
Detached HEAD Branch
Es una rama apuntada por HEAD, pero que no tiene un nombre de rama
apuntándole.
48
Integrar Ramas
Para incorporar en la rama actual los cambios realizados en otra
rama:
$ git merge <rama>
Ejemplo:
$ git checkout master
- Estamos en la rama master.
$ git merge iss53
- Incorporamos los cambios hechos en la rama iss53 en la rama master.
© Santiago Pavón - UPM-DIT
49
*de Scott Chanson: http://git-scm.org/book/
© Santiago Pavón - UPM-DIT
50
Conflictos
Al hacer el merge pueden aparecer conflictos
• si las dos ramas han modificado las mismas líneas de un fichero.
Si hay conflictos:
• No se realiza el commit.
• Las zonas conflictivas se marcan:
<<<<<<< HEAD:index.html
<div id="footer">contact : [email protected]</div>
=======
<div id="footer">contact us at [email protected]</div>
>>>>>>> iss53:index.html
• El comando git status lista los ficheros con conflictos como unmerged.
51
Borrar Ramas
Una ver terminado el trabajo con una rama
• se borrar con el comando:
$ git branch -d <nombre>
- Lo que se elimina es el puntero al commit.
52
Listar Ramas
Para listar las ramas existentes:
$ git branch
Ejemplo:
$ git branch
iss53
* master
testing
• La rama activa se marca con un asterisco.
Opciones:
• -r muestra ramas remotas
• -a muestra todas las ramas (locales y remotas)
• -v muestra el último commit de la rama.
• --merged muestra las ramas que ya se han mezclado con la la rama actual.
• --no-merged muestra las ramas que aun no se han mezclado con la rama actual.
© Santiago Pavón - UPM-DIT
53
Identificar Commits
54
Identificar Commits
55
Referencias a Antepasados
Los objetos commits apuntan a los commits en los que se basan.
• El primer commit no tiene padre. Los demás commits tienen un commit padre,
excepto si se han creado con una operación merge.
56
Rangos de Commits
Para especificar un rango de commit pueden usarse las siguientes
notaciones:
•C1..C2 (dos puntos)
- Todos los commits accesibles desde C2 eliminando los que son accesibles desde
C1.
•C1...C2 (tres puntos, diferencia simétrica)
- Commits accesibles desde C1 o desde C2, pero no desde ambos.
- La opción --left-right marca con < y > los commits de cada lado.
En los casos anteriores, si no es especifica uno de los commits del rango se usa
•
HEAD.
• También pueden especificase varios commits
- Indican el rango de commit accesibles por cualquiera de los commits
especificados.
- Pueden excluirse todos los commits accesibles desde C añadiendo ^C o --not C.
57
Ejemplos:
$ git log master..prueba
$ git log ^master prueba
$ git log --not master prueba
- muestra un log de los commits de la rama prueba hasta que
esta parte de master.
$ git log origin/master..HEAD
- logs con los cambios que he realizado desde la última vez
que sincronicé con origin. Son los cambios que se subirán al
ejecutar push.
58
Tags
Se usan para etiquetar commits importantes de la historia (o ficheros importantes).
• Ejemplo de uso:
- Poner etiquetas con un número de versión a los commits asociados a las versiones públicas
del producto desarrollado.
59
Crear Tags
Crear un tag ligero:
$ git tag <nombre> [<commit>]
• Asigna al commit dado un nombre de tag
- Si no se proporciona un commit, se asigna al último commit.
• Se suele usar para etiquetar temporalmente un commit.
60
Compartir Tags
El comando git push no transfiere automáticamente los
tag creados localmente a los repositorios remotos.
• Para copiar un tag local en un repositorio remoto hay que
indicarlo explícitamente en el comando push:
$ git push origin [tagname]
61
Repositorios Remotos
62
¿Qué es un Remote?
En un proyecto GIT real suelen existir varias copias o clones del
repositorio.
• Cada desarrollador tendrá sus clones en los que trabajará.
63
Cuando clonamos un repositorio se crea
automáticamente un remote llamado origin que apunta
a la URL del repositorio que hemos clonado.
64
Ver los Remotes Existentes
El comando git remote lista los nombres de los remotes definidos.
$ git remote
bakkdoor
cho45
defunkt
koke
origin
65
Crear Remotes
Para crear un remote se usa el comando:
$ git remote add <shortname> <URL>
• shortname es el nombre corto que damos al remote
• URL es la URL del repositorio remoto
• Ejemplos:
- Crear un remote:
$ git remote add pepito git://github.com/pepe/demo.git
- Consultar los remotes existentes:
$ git remote -v
pepito git://github.com/pepe/demo.git
origin [email protected]:santiago/demo.git
Ahora podemos usar el nombre pepito en vez de la URL del repositorio.
-
- Para descargar las últimas actualizaciones del repositorio:
$ git fetch pepito
- Para subir a origin mis cambios en la rama master:
$ git push origin master
© Santiago Pavón - UPM-DIT
66
Más comandos sobre remotes
Inspeccionar detalles de un remote:
$ git remote show [nombre_del_remote]
• Muestra el URL del remote, informacion sobre las ramas remotas, las ramas tracking, etc.
Renombrar un remote:
$ git remote rename nombre_viejo nombre_nuevo
Borrar un remote:
$ git remote rm nombre_del_remote
67
Ramas Remotas
Una rama remota es un puntero a un commit.
• Indica cuál era la posición de una rama en un repositorio remoto la última vez que nos
conectamos con él.
68
Tracking Branch
Es una rama local emparejada con una rama remota para que
estén sincronizadas.
• Hacer un seguimiento de los cambios realizados en ellas
- Al hacer git push en una tracking branch se suben los cambios
locales y se actualiza la rama remota emparejada.
- Al hacer git pull se actualiza la rama local con los cambios existentes
de la rama remota emparejada.
69
Para crear una tracking branch, ejecutaremos:
$ git checkout -b <branchname> <remotename>/<branchname>
• Se crea una rama local que hace el seguimiento de la rama remota indicada.
- Nótese que el nombre local y remoto de la rama puede ser distinto.
70
Descargar datos de un remote
Bajarse los datos de un remoto:
$ git fetch [nombre_del_remote [refspec]]
• refspec:
- Indica las ramas local y remota entre las que se hará la bajada de datos.
- Puede ser el nombre de una rama (tanto local como remota).
- Si no es especifica este parámetro, se bajan las actualizaciones de todas las ramas locales que
también existan en el repositorio remoto.
Este comando actualiza el repositorio con los datos existentes en el remote, pero no
modifica los ficheros del directorio de trabajo.
Ejemplo:
• Bajarse los datos que aun no tengo del repositorio del que me cloné:
$ git fetch origin
• Ahora mezclo mi rama actual con la rama demo de origin:
$ git merge origin/demo
© Santiago Pavón - UPM-DIT
71
Descargar Versiones e Integrarlas
Bajarse versiones de un remoto y aplicar merge:
$ git pull [nombre_remote [refspec]]
Ejemplo:
• Descarga las versiones de la rama demo del remote pepito y las integra en
nuestra rama actual:
$ git pull pepito demo
72
Subir Versiones a un Remote
Para subir nuestras versiones a un remote:
$ git push [nombre_remote [refspec]]
73
Push sólo puede realizarse si se tienen permisos en el repositorio remoto.
Solo se puede hacer push si estamos actualizados con los cambios ya existentes
en el repositorio remoto.
• Si en el remote hay actualizaciones que no tenemos, deberemos hacer un pull antes de poder
subir nuestros cambios.
- Para evitar subir actualizaciones que puedan producir conflictos.
Si se crea una rama local, y se quiere subir al repositorio remoto, debe ejecutarse
el comando push con el nombre de la rama como valor de refspec:
$ git push origin prueba
Para borrar una rama remota, se usa un refspec con un nombre de rama local
vacío, y con el nombre de la rama remota a borrar.:
$ git push origin :dos
© Santiago Pavón - UPM-DIT
74
Modificar Commits
75
Modificación de los Commits
Comandos que permiten cambiar los commits
existentes, aplicar los cambios de un commit en otro
punto, eliminar los cambios introducidos en un
commit, etc.
git rebase
git reset
git cherry-pick
git revert
git commit --amend
76
Mover ramas con Rebase
Antes de nada: No hacer un rebase de un commit que ya
se haya subido a un repositorio público.
- Cambiar commits con los que ya están trabajando otros
desarrolladores puede causarles problemas.
77
$ git rebase master experiment
78
$ git rebase --onto master server client
• Los commits de un rebase también pueden aplicarse sobre la
rama que se desee usando la opción --onto.
79
Solucionar conflictos al hacer un rebase:
• Rebase aplica los commits uno a uno en la nueva localización.
• Si aparece un conflicto al intentar aplicar un commit, se detiene el rebase
y debemos solucionar el conflicto manualmente.
- Editamos los ficheros conflictivos para eliminar los conflictos.
- Ejecutamos "git add <ficheros conflictivos>"
• Una vez solucionado el conflicto, ejecutamos:
$ git rebase --continue
Este comando aplica el commit pendiente y continua con los
•
commits pendientes.
• Si al examinar el conflicto, decidimos que no queremos aplicar este
commit, ejecutaremos:
$ git rebase --skip
se ignora el commit y se salta al siguiente commit del rebase.
•
80
Rebase Interactivo
Antes de nada: No hacer un rebase de un commit que ya se
haya subido a un repositorio público.
- Cambiar commits con los que ya están trabajando otros
desarrolladores puede causarles problemas.
Permite:
• cambiar el orden de aplicación de los commits,
• eliminar un commit,
• unir varios commits en uno sólo,
• partir un commit en varios, etc...
© Santiago Pavón - UPM-DIT
81
Cambiar HEAD con git reset
Para hacer que HEAD apunte al commit pasado como argumento:
Opciones:
$ git reset --soft <commit>
• No se borran los cambios registrados en el staging area.
- El staging area también reflejará los cambios existentes entre las versiones
apuntadas por el HEAD anterior y el nuevo HEAD.
• No se modifican los ficheros del directorio de trabajo.
$ git reset <commit>
• Se restaura el staging area al nuevo estado.
- Se pierden los cambios del staging area.
• No se modifican los ficheros del directorio de trabajo.
$ git reset --hard <commit>
• Se restaura el staging area al nuevo estado.
• Se restaura el directorio de trabajo eliminando todos los cambios existentes.
© Santiago Pavón - UPM-DIT
82
Ejemplos:
• Volver al commit anterior (que HEAD apunte al ultimo commit
realizado) pero sin perder ninguno de los cambios realizados
$ git reset --soft HEAD^
• Descartar todo los cambios metidos en el staging area.
$ git reset HEAD
- HEAD no cambia, se restaura el staging area y no se toca el
directorio de trabajo.
• Descartar todos los cambios realizados desde el último commit.
$ git reset --hard HEAD
- HEAD no cambia, pero se restaura el staging area y el
directorio de trabajo.
83
Restaurar Index con git reset
Restaurar en el staging area la versión de un fichero (o
ficheros) según estaba en un determinado commit:
$ git reset <commit> -- <paths>...
• Copia los ficheros (paths) del commit indicado en el staging area.
• Es lo contrario que hace git add.
Ejemplo:
• Eliminar los cambios del fichero readme.txt añadidos al staging
area:
$ git reset HEAD -- readme.txt
84
git cherry-pick
Aplicar los cambios realizados en el commit indicado en
mi rama, y crear un nuevo commit:
$ git cherry-pick <commit>
85
git revert
86
Stashing
87
Stashing
Cuando se está trabajando en una contribución, los ficheros del
directorio de trabajo y los del staging area tienen las modificaciones
realizadas hasta el momento.
88
El comando git stash se usa para guardar todas
nuestras modificaciones en una pila, y dejar limpios el
directorio de trabajo y el staging area.
• Una vez finalizada la modificación urgente, podemos aplicar
todas las modificaciones guardadas en la pila de stash sobre la
rama actual, recuperando así nuestro estado inicial.
- Si el contenido de los ficheros de la rama actual ha cambiado,
podrían aparecer conflictos al recuperar los cambios
almacenados en la pila de stash.
89
Para meter un stash en la pila,
• es decir, para salvar en la pila las todas modificaciones existentes, y dejar
limpios el directorio de trabajo y el staging area:
$ git stash
- Tras ejecutar este comando, git status informaría de que no existen
modificaciones.
90
Para aplicar el último stash de la pila a la rama actual:
$ git stash apply
- Por defecto, apply aplica sus cambios modificando sólo los ficheros del directorio del
trabajo. No actualiza el staging area con los cambios que había en él.
• Para que apply reinserte en el staging area los mismos cambios que este tenía
91
Servidor GITHUB
92
GitHub
✦ Github -> lema "Social coding"
• Red social donde programadores comparten repositorios remotos Git
• Nos da acceso a ellos a través del navegador Web (además de Git)
!93
© Juan Quemada, DIT, UPM
93
Funciones principales de GitHub
✦ La función principal de GitHub es compartir repositorios con terceros
✦ Las operaciones principales de un usuario registrado son
• Crear repositorio remoto inicial nuevo para albergar un proyecto
• Utilizando el botón: New repository
• Copia un repositorio albergado en GitHub a otra cuenta (para contribuir)
• Utilizando el botón: Fork
• Importa un repositorio identificado por su URL a GitHub, incluso en otro formato
• Utilizando el botón: Import repository
• Equivale a crear repositorio vacío (New_repository) e importar en él otro repositorio con un URL
• Crear una organización para albergar múltiples proyectos relacionados
• Utilizando el botón: New organisation
• Organización de asignatura CORE: https://github.com/CORE-UPM
• Y otras operaciones de compartición, gestión y mantenimiento
94
Tres formas de crear repositorios en GitHub
✦ Crear un repositorio vacío con New_repository:
• https://github.com/jquemada/cal
• GitHub lo crea en sus servidores invocando: git init --bare
!95
© Juan Quemada, DIT, UPM
95
Crear jquemada/cal vacío en GitHub
Crear nuevo repositorio vacío en GitHub
!96
© Juan Quemada, DIT, UPM
96
Repositorio
en GitHub I
Fichero README.md se ve
aquí. Es muy conveniente
incluirlo en un fichero en
GitHub describiendo el
proyecto o repositorio.
!97
© Juan Quemada, DIT, UPM
97
Repositorio
en GitHub II
Último commit de
la rama master con
los 3 ficheros
indicados.
!98
© Juan Quemada, DIT, UPM
98
Repositorio
en GitHub III
!99
© Juan Quemada, DIT, UPM
99
Repositorio
en GitHub III
!100
© Juan Quemada, DIT, UPM
100
Fork: clonar un proyecto de GitHub
Copia el repositorio a otra cuenta u
Repositorio cal del usuario jquemada en:
organización del usuario en GitHub
https://github.com/jquemada/cal
pulsando el botón Fork.
!101
© Juan Quemada, DIT, UPM
101
Otros Temas
102
Enviar contribuciones usando Parches
En algunos modelos de trabajo, los desarrolladores no
tienen permiso para integrar sus contribuciones en el
repositorio remoto principal.
103
Crea un parche para cada commit de la rama actual posterior
al commit dado.
$ git format-patch <commit>
• Los parches son ficheros en formato mbox.
- Se nombran con un número de secuencia y el texto del mensaje de log.
- Estos ficheros pueden editarse:
• para modificar los mensaje de log
• para añadir instrucciones privadas
- editar justo después de la primera línea ---
• Ejemplo:
$ git format-path origin/master
0001-Incluido-control-de-errores.patch
0002-Arreglada-la-documentacion.patch
- Se han creado dos parches. Desde la última vez que se sincronizó con
origin se han realizado dos commits.
104
Aplicar los parches incluidos en mbox a la rama actual.
$ git am <mbox>
• El fichero mbox pueden contener varios mensajes, cada uno con un parche.
• Si el parche se aplica con éxito,
- automáticamente se hace un commit usando los datos contenidos en
mbox para asignar el autor, la fecha y el mensaje de log.
• Si el parche falla, los ficheros afectados se habrán modificando señalando
los conflictos existentes de la forma habitual.
- En este punto hay que:
• Editar los ficheros con conflictos para resolverlos.
• Añadir los ficheros modificados al staging area usando git add.
• Y ejecutar git am --resolved
- Si decidimos que no queremos aplicar este parche:
• Ejecutar git am --skip para saltarnos este parche y pasar al siguiente.
105
git archive
Crear un fichero con el contenido del repositorio.
Ejemplos:
• Crear un fichero gzip con el contenido de la rama master
$ git archive master --prefix='proy' | gzip > pm.tgz
- Se genera el fichero pm.tgz.
- Al descomprimirlo los ficheros se encuentran bajo el directorio proy.
106
git describe
Generar números de versión:
$ git describe <commit>
Ejemplo:
$ git describe master
v1.3-5-ab34ga33
107
add interactivo
Si hemos hecho varios cambios en los ficheros del directorio de trabajo
• que pertenecen a contribuciones diferentes
• y no queremos hacer un commit conjunto
108
Buscar un Commit
$ git bisect
• Para buscar un commit en el que se metió un error. Se especifica un
commit en el que el error no estaba, un commit en el que el error si
estaba, y se procede a reducir ese rango hasta encontrar en que commit
se introdujo el error.
$ git blame
• Informa sobre quien fue el último en modificar cada línea de un
fichero, y en que commit lo hizo.
$ git log -S<string> <filename>
• Para buscar el string dado hacia atrás en todas las diferencias de un
fichero.
109
Submódulos
Permite asociar subdirectorios con repositorios
remotos de proyectos diferentes.
110
Fontanería
Comandos de bajo nivel:
• git cat-file: Ver el contenido o el tipo y tamaño de un objeto.
• git ls-files: Ver objetos en el index, directorio de trabajo,
modificados, etc.
• git write-tree: Crear un objeto index con el contenido actual
del index.
• git rev-parse: Dado un prefijo ID, u otro tipo identificador de
revisión, calcula el ID completo al que se refiere.
• git hash-object: Calcula el ID (y puede crear el blog) de un
fichero.
• git merge-base: se usa para buscar la base para hacer un
merge
• ...
111
Temas Pendientes
112
Temas pendientes
Reflog
Atributos
Hooks
...
113