41. GIT y GITHUB¶
41.1 Git inicial¶
41.1.1 Enlaces útiles¶
- git book . El libro online y referencia para git
- Git + inmersión , tutorial paso a paso
- Laguia sencilla * https://learngitbranching.js.org/?locale=es_ES
- otro
- Servidor git pequeño e interesante gogs. Se instala rápido y fácil.
41.1.2 Configurar git¶
Cada commit que se guarda en el historial de git se adjunta con un nombre y un email para saber quién hizo los cambios. Es la única configuración necesaria en git:
git config --global user.name "Your Name"
git config --global user.email your.email@example.com
Estos comandos únicamente escriben en el fichero de configuración global ~/.gitconfig (revisa su contenido, que puedes editar a mano). Prueba los siguientes comandos:
git config --global --edit # Abre el editor por defecto
git config --list --show-origin --show-scope
41.1.3 Terminos usados en git¶
Repositorio: es el contenedor de todo el control de versiones: la base de datos de git.
Local: hace referencia al ordenador en el que estás trabajando.
Remoto: hace referencia al servidor.
Si trabajamos con GitHub o BitBucket, tendremos un repositorio remoto (o varios), y una copia local de ese repositorio que se pueden sincronizar cuando lo queramos (lo veremos más adelante).
Directorio/Árbol de trabajo (working tree): es el directorio en nuestro ordenador donde tenemos un repositorio (y subdirectorios). Work In Progress (WIP): se refiere a todas las modificaciones que hay en el directorio de trabajo, pero que aún no han sido añadidas al repositorio.
41.1.4 Git básico¶
Para crear un repositorio nuevo vacio:
git init
git clone <url>
Ej: git clone https://github.com/progit/progit2.git
Añadir archivo Si añadimos un fichero a la carpeta del repositorio, no se añade al repositorio directamente. Para ello, debemos indicar a git que queremos que lo añada. Para ello se usa el comando:
git add fichero
Este comando tiene un doble propósito: Añadir un nuevo fichero al repositorio Añadir los nuevos cambios
Commit=confirmación de cambios
Para añadirlo al repositorio, debemos confirmarlo con git commit.
Esto abre el editor por defecto para que añadas un mensaje al commit. Puedes hacerlo todo desde la terminal con:
git commit -m "Mensaje"
Esto nos crea un nuevo punto en el repositorio, al que podremos acceder en cualquier momento para ver los ficheros modificados, la persona, fecha...
git status
Comprobar estado del repositorio
.gitignore
Fichero para que git ignore algunos ficheros y directorios ( uno por línea)
cambios preparados (staged) Con el comando
git status y git diff
Desaher acciones
Modificar el último commit (en vez de crear otro commit nuevo):
Si el stage está vacío, únicamente cambia el mensaje
git add <file>
git commit --amend
git restore --stage <file>
git restore --worktree <file>
Para borrar un archivo con git debes: Borrarlo con
git rm <file>
#Confirmarlo con
git commit
git rm --cached <file>
Para renombrar un archivo:
git mv <file>
Historial repositorio Cada repositorio en git es una copia completa con todo el historial de commits, y podemos acceder a todo ello. El comando git log muestra todo el historial de una manera básica. Existen muchas opciones que se pueden añadir para modificar la vista, como:
git log <fichero>: muestra todos los cambios de un fichero en concreto
git log --oneline: Reduce la información a una única línea
git log -p: Muestra las modificaciones introducidas en el commit
#Puedes combinar las opciones:
git log -o --oneline fichero.txt
Etiquetas Según nuestro proyecto avanza, es muy probable que en ocasiones alcancemos un hito (milestone) importante que queremos recordar. Esto generalmente da lugar al versionado del proyecto, por ejemplo: major.minor.release Algunas operaciones con etiquetas:
TAGS Muestra todas las etiquetas (de la rama actual):
git tag
Añade una etiqueta ligera al último commit:
git tag v1.5.2
Añade una etiqueta ligera al commit indicado:
git tag v1.5.0 ca3b07
Añade una etiqueta completa, con versión y mensaje:
git tag -a v4.4 -m "Android KitKat"
Borra una etiqueta:
git tag --delete v1.5.2
Moverse por el historial
Es frecuente querer ver los ficheros en un punto anterior en el historial. Git modificará todos nuestros ficheros del Working Tree y nos los dejará tal cual estaban en otro commit.
Por ello es imprescindible que no tengamos cambios pendientes.
Nuestro git status debe estar vacío y sin cambios locales.
Para ello usamos el comando: git checkout
Git llama HEAD al punto del historial en el que se encuentra nuestro Working Tree. Con checkout modificamos el HEAD y el Working Tree. Al movernos a un punto pasado, ponemos el HEAD en detached mode, lo cual significa que en principio no deberíamos modificar nada, sólo revisar los ficheros.
41.1.5 Ramas¶
En git una rama es una línea independiente de desarrollo. Permiten tener un entorno donde desarrollar experimentos sin afectar al desarrollo estable del proyecto. Si el experimento de una rama es satisfactorio, se puede integrar (fusionar) en el desarrollo principal
Una de las grandes ventajas de git es la gran facilidad para crear ramas: SVN: una rama crea una copia entera de todo el proyecto en un nuevo directorio. git: una rama es únicamente una referencia (“puntero”) a un commit
Creción de ramas Todo repositorio comienza siempre con una rama llamada master (es una rama como todas las demás sin nada de especial). Debemos ser siempre conscientes de la rama en la que se encuentra nuestro Directorio de Trabajo (git status lo muestra). Una vez estemos en una rama, los commits que hagamos se incorporan a la cabeza de esa rama (salvo que estemos en modo detached HEAD), y el puntero de la rama se actualiza al último commit realizado.
git branch Muestra todas las ramas git branch experimento Crea una rama llamada experimento en el commit en el que se encuentre el HEAD git checkout experimento Cambia el Working Tree a la punta de la rama experimento git checkout -b experimento Crea la rama experimento y hace un checkout a la misma en un solo paso
Fusión fast-forward
Tenemos la rama css y queremos integrarla en master.
Si hiciésemos un commit sobre master estaríamos creando una nueva línea en el historial independiente de la rama css.
Debemos llevar master hasta css.
Para solucionar esto debemos fusionar la rama master hacia la rama css. Dado que master y css están en la misma línea del historial de commits, la fusión es muy sencilla y únicamente requiere mover el puntero de master hasta donde se encuentra css. git checkout master git merge css A esto se le llama una fusión fast-forward.
Si hubiésemos hecho algún commit sobre master, una fusión de este tipo no habría sido posible.
Renombrar ramas
Para renombrar una rama:
git branch -m
Dado que una rama en git es únicamente un puntero al último commit de una línea del historial, si la borramos, únicamente borramos esa referencia, no sus commits: git branch -d rama Es una operación muy común tras una fusión fast-forward:
Fusionar ramas Una fusión de tipo merge se realiza cuando las dos ramas tienen commits independientes. Git retrocede (backtracking) para encontrar el ancestro común, que necesita usar junto a los dos commits fusionados (3-way merge). Si queremos fusionar master en crazy (no al revés): git checkout crazy git merge master Esto nos crea un nuevo commit con la fusión realizada.
Conflicto fusiones Git intenta resolver todos los conflictos de forma inteligente, pero ¿Qué pasa si hemos modificado las mismas líneas de un fichero de forma diferente en las dos ramas? Git nos pregunta qué resultado final queremos dejar. En las zonas conflictivas de cada fichero, dejará algo como lo siguiente: <<<<<<< HEAD int x = “hola”; ======= int y = “hola mundo”
crazy De esta manera, debemos revisar manualmente cada una de estas marcas, y dejar todos los ficheros conflictivos como deseemos. También es muy común utilizar herramientas gráficas para esta tarea, que ahorran tiempo.