Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Següent revisió
Revisió prèvia
info:libros:git [03/09/2018 02:30] – creat mateinfo:libros:git [27/11/2018 02:01] (actual) – [Git (libro Amazon)] admin
Línia 1: Línia 1:
-Git (libro Amazon)+git (libro Amazon)
 {{tag>devops cursos git}} {{tag>devops cursos git}}
  
Línia 23: Línia 23:
     * ''git add -A'' = git add -u & git add .     * ''git add -A'' = git add -u & git add .
   * ''git commit''   * ''git commit''
-    * ''git commit -m "<COMENTARIO>"+    * ''git commit -m "<COMENTARIO>"''
     * ''git commit -a'' : git add -A & git commit     * ''git commit -a'' : git add -A & git commit
  
Línia 85: Línia 85:
   * ''git show <HASH_COMMIT>''   * ''git show <HASH_COMMIT>''
   * ''git show <HASH_COMMIT>:path/to/file''   * ''git show <HASH_COMMIT>:path/to/file''
-  *   * ''git show <HASH_COMMIT>:path/to/file > archivo_copia''+  * ''git show <HASH_COMMIT>:path/to/file > archivo_copia''
  
 == más usos de Git == más usos de Git
 +=== organización
 +no hay reglas de como organizar tu trabajo, aunque si que hay reglas de como **NO** hacerlo... se ha de organizar para que el trabajo de los otros no te distraiga
 +
 +=== qué poner en el directorio principal
 +  * ''README.md'' : fichero mostrado en la página principal de Github. Explicar en pocas palabras de que va el proyecto, como instalarlo, prerrequisitos, licencia, navegación por el repositorio
 +  * ''INSTALL.md'' : instrucciones detalladas de instsalación
 +  * ''.gitignore''
 +  * ''LICENSE''
 +  * ''TODO''
 +
 +=== estructura habitual con directorio test
 +  * Git tiene una estructura plana (el todo es tratado en un conjunto, al contrario que CVS o Subversion, que podían tratar un directorio como un proyecto independiente)
 +  * Git permite trabajar con [[https://git-scm.com/book/en/v2/Git-Tools-Submodules|submódulos]] para emular este comportamiento. Con sentido en proyectos de terceros del que depende tu proyecto o proyectos/equipos muy grandes
 +    * ''git submodule add <URL_REPOSITORIO> <DIRECTORIO>'' + ''cd <DIRECTORIO>'' + ''git submodule init'' + ''git submodule update'' + ''git pull''
 +
 +=== flujos de trabajo
 +=== ramas
 +Una rama es un nombre a un commit específico  y todos los commits que son antecesores del mismo
 +
 +=== ramas ligeras: etiquetas
 +  * ''git tag <etiqueta>'' : crea etiqueta, asociada a un commit, para marcar algún tipo de hito. De caracter local
 +    * ''git tag -a <etiqueta>'' : añade una nota desde editor, o **-m "comentario"** inline
 +    * ''git show <etiqueta>'' : mostrará la nota
 +  * ''git tag''
 +  * ''git describe'' : indica el camino desde la última etiqueta a un commit concreto
 +  * ''git push --tags''
 +
 +=== creando y fusionando ramas
 +  * ''git checkout -b <RAMA>'' : git branch <RAMA> + git checkout <RAMA>
 +    * al hacerlo, sobreescribe los cambios que no esten pasados a commit.
 +    * si se quieren conservar sin realizar el commit, se pued hacer un ''git stash'' : almacen temporal
 +    * para recuperar, ''git stash apply --index''
 +    * para establecer un origen por defecto (upstream): ''git push --set-upstream <ALIAS_REMOTO> <RAMA>''
 +    * ''git branch'' nos indica las ramas y en la que estamos (marcada con un *)
 +    * ''git branch --all'' nos muestra todas las ramas
 +
 +==== fusionando
 +  - ''git checkout <RAMA_QUE_RECIBIRÁ_LA_FUSION>''
 +  - ''git pull <ALIAS_REMOTE> <RAMA_QUE SE FUSIONARÁ''
 +  - una vez fusionadas correctamente, se podría descartar la rama "muerta":
 +    - ''git branch -d <RAMA_MUERTA>'' : en local
 +    - ''git push <ALIAS_REMOTE> :<RAMA_MUERTA>'' : actualizar el borrado en el repositorio remoto
 +  * ''git checkout <ARCHIVO>'' : recupera desde **master** (por defecto) el fichero a la rama actual
 +
 +=== los misterios del rebase
 +reescritura de historia (OJO con los push/pull)
 +
 +=== quién hizo qué
 +  * ''git log --pretty=short'' : resumen de commits, autores, fechas...
 +  * ''git blame'' : cambios a nivel de fichero
 +
 +
 +== Usando Git como los profesionales: GitHub
 +=== github pages
 +  * páginas estáticas
 +  * originalmente, rama **gh-pages**, ahora desde la raiz del proyecto o el subdirectorio **docs**
 +  * se puede configurar en **Settings** -> **GitHub pages** -> Automatic Page Generator (deja elegir algunas plantillas). El generador coge el fichero **README.md** y lo parsea a HTML, y genera un domino **usuario.github.io/proyecto** que sirve las páginas HTML
 +
 +=== hooks
 +ganchos o eventos que se activan cuando se produce alguna acción -> petición REST (debidamente formada)
 +  * **Settings** -> WebHooks & Services -> Configure services
 +  * se activan al hacer un **push** a GitHub
 +  * tipos de servicios:
 +    * integración continua
 +    * mensajería
 +    * entrega continua
 +    * sistemas de trabajo en grupo
 +    * análisis del código
 +
 +=== cliente GitHub (hub)
 +
 +== Hooks, ejecutando código tras una orden Git
 +=== estructura repositorio
 +{{ :info:libros:pasted:20180903-052926.png?400 }}
 +
 +  * branches : sin uso actualmente
 +  * config,HEAD,refs, objects : información dinámica
 +  * el resto de ficheros se copian de una plantilla:
 +    * hooks, description,branches,info
 +    * la plantilla está en ''/usr/share/git-core/templates/'' y se puede modificar
 +    * también se puede usar un directorio alternativo de plantilla con el parámetro **--template** con los comandos **clone** o **init**
 +  * ''.git/info/exclude'' -> idem **.gitignore** pero solo afecta a la copia local
 +
 +==== paso a paso
 +  * ''.git/objects'' : estructura directorios con los objetos git
 +    - crea un SHA1 a partir del contenido y almacena como BLOB el fichero en la zona temporal
 +    - almacena el nombre de fichero (o ficheros contenidos en la zona temporal) en un arbol
 +    - se calcula el SHA1 del arbol y se almacena en **.git/objects**
 +      - un arbol puede apuntar a otros árboles
 +    - al hacer un commit, se crear un tercer tipo de objeto, que contiene enlaces a un árbol (el de más alto nivel) y metadatos
 +
 +=== refiriéndonos a objetos en git
 +  * se puede usar ''git show'' para mostrar cualquier tipo de objeto git (BLOB,ARBOL,COMMIT)
 +  * ''.git/refs'' guarda referencias a los objetos
 +  * ''git show master^{tree}'' : se usa **^** para qualificar aquello que le precede, aunque solo hay **{tree}**
 +  * ''git show master~1'' : **~1** indica el ancestro justo anterior
 +  * ''git show master~4^{tree}''
 +
 +=== comandos de alto y bajo nivel (fontanería y loza)
 +  * fontanería : comandos bajo nivel
 +  * loza: comandos alto nivel (usuario)
 +
 +==== las cañerias
 +  * index : contiene a los que GIT ha de prestar atención
 +  * objetos : 
 +    * ficheros: el contenido y el nombre almacenado en el árbol -> **blob**
 +    * mensajes de commit -> **commit**
 +    * etiquetas -> **tag**
 +    * árboles -> **tree**
 +  * ''git ls-tree <commit>'' : muestra la información de **.git/objects** de una manera más ordenada e indicando el tipo de objeto
 +    * ''-r'' : añade el nombre de fichero
 +  * ''git ls-files --stage'' : muestra los archivos que se han añadido al índice pero no se han pasado al árbol
 +  * ''git cat-file -p <objeto>'' : nos muestra el contenido de un objeto
 +
 +== viva la diferencia
 +  * ''git diff'' : muestra las diferencias entre el Index y el último commit
 +    * ''--name-only''
 +    * ''name-status'' : muestra 1 letra con el tipo de cambio (A,D,M)
 +    * ''--cached'' : muestra la diferencias entre el Index y los ficheros que han sido preparados para el commit
 +  * ''git diff HEAD'' : diferencias entre el último commit y la Working Area
 +  * ''git diff-index HEAD'' : compara el índice con algún árbol
 +  * ''git diff-tree HEAD''
 +
 +== los dueños de las tuberías - metadatos
 +  * ''git var -l'' : listado de todas las variables disponibles definidas
 +    * ''git var <variable>''
 +  * ''git config -l'' ofrece el mismo resultado
 +  * uso de estos comandos para unificar el acceso a las mismos en diferentes OS
 +
 +== rev-parse
 +  * recoge y procesa parámetros
 +    * procesamiento de parámetros
 +    * especificación de objetos
 +    * búsqueda en directorios del repositorio
 +  * ''git rev-parse --verify HEAD'' : muestra el SHA1 del HEAD verificando que existe
 +  * ''git rev-parse HEAD@{1.month}'' : retorna SHA1 de commit de hace 1 mes
 +
 +== concepto de hooks
 +  * ejecución progrma (shell,Perl,Python, etc..) ante un evento
 +  * automatización de tareas
 +  * directorio propio: **.git/hooks**
 +  * solo se admite 1 hook por evento y tendrá el nombre del evento asociado (uso de symbolic links)
 +{{ :info:libros:pasted:20180905-031800.png }}
 +
 +=== programando un hook básico
 +  * examinar entorno y parámetros de entrada
 +  * hacer cambios en el entorno, los ficheros y la salida
 +  * salir con mensaje de error o ninguno si todo correcto
 +
 +comprueba si el nombre de usuario está en el mensaje de commit y si no, lo añade
 +<code bash; title="prepare-commit-msg">
 +#|/bin/bash
 +SOB=$(git config github.user)
 +grep -qs "^$SOB" "$1" || echo ". Cambio por @SOB" >> "$1"
 +</code>
 +
 +añade información al commit:
 +<code bash>
 +#!/bin/sh
 +
 +#Recuerda hacer
 +# cp prepare-commit-msg.ejemplo prepare-commit-msg
 +# chmod +x prepare-commit-msg
 +
 +STATS=$(git diff --cached --shortstat)
 +echo ". Cambios en este commit\n  ${STATS}" >> "$1"
 +</code>
 +
 +  * [[https://www.sitepoint.com/git-hooks-fun-profit/|Git Hooks for Fun and Profit]]
 +
 +
 +
 +
  • info/libros/git.1535967015.txt.gz
  • Darrera modificació: 03/09/2018 02:30
  • per mate