Git&Git Hub
Git&Git Hub
¿Qué es Git?
Git es un sistema de control de versiones distribuidos, diseñado por Linus
Torvalds. Está pensado en la eficiencia y la confiabilidad del mantenimiento de
versiones de aplicaciones cuando esta tienen un gran número de archivos de
código fuente.
Características de Git
Git almacena la información como conjunto de archivos
Git y GitHub 1
Casi todo en Git es local. Es difícil que se necesiten recursos o información
externo, basta con los recursos locales con los que cuenta.
Git cuenta con 3 estados en los que es posible localizar archivos: Staged,
Modified y Committed.
Características de Github
Github permite alojar proyectos en repositorios de forma gratuita y pública,
pero tiene una forma de pago para privados.
Git y GitHub 2
Es la opción perfecta para poder trabajar en equipo en un mismo proyecto.
Ofrece todas las ventajas del sistema de control de versiones Git, pero
también tiene otras herramientas que ayudan a tener un mejor control de
los proyectos.
Git y GitHub 3
Créditos a Angelo Paul Yenque Tume @ayenquet
Git y GitHub 4
Editores de código, archivo binarios y de
texto plano
Un editor de código o IDE es una herramienta que nos brinda mucha ayuda
para escribir código, algo así como un bloc de notas muy avanzado. Los
editores más populares son VSCode, sublime Text, Atom, pero no es obligatorio
usar algunos de estos para programar.
Clone: Una vez se decide hacer un fork , hasta ese momento sólo existe en
GitHub. Para poder trabajar en el proyecto, toca clonar el repositorio
elegido al computador personal.
Branch: Es una bifurcación del proyecto que se está realizando para anexar
una nueva funcionalidad o corregir un bug.
Git y GitHub 5
cada momento (o casi) y debería estar libre de bugs. Así, si esta rama está
en producción, sirve como referente para hacer nuevas funcionalidades y/o
arreglar bugs de última hora.
Checkout: Acción de descargarse una rama del repositorio GIT local (sí, GIT
tiene su propio repositorio en local para poder ir haciendo commits) o
remoto.
Pull: Consiste en la unión del fetch y del merge, esto es, recoge la
información del repositorio remoto y luego mezcla el trabajo en local con
esta.
Diff: Se utiliza para mostrar los cambios entre dos versiones del mismo
archivo.
Git y GitHub 6
Comandos básicos en la terminal
cd: Nos permite movernos entre las carpetas
cd / : Ir a la ruta principal
cd o cd ~: Ir a la ruta de tu usuario
ls: Nos permite cambiar ver los archivos de la carpeta donde ahora mismo.
Git y GitHub 7
Estando en la carpeta del proyecto usamos el siguiente comando para iniciar el
repositorio.
git init
Se crea el repositorio.
Para añadir archivos usamos.
git status
git rm nombre_del_archivo.txt
Git y GitHub 8
El comando
git show
nos muestra los cambios que han existido sobre un archivo y es muy útil para
detectar cuándo se produjeron ciertos cambios.
¿Qué es el staging?
Es el lugar donde se guardan temporalmente los cambios, para luego ser
llevados definitivamente al repositorio. El repositorio es el lugar donde se
guardan todos los registros de los cambios realizados a los archivos.
Git y GitHub 9
3. Confirmas los cambios (commit), lo que toma los archivos tal y como están
en el área de preparación y almacena esa copia instantánea de manera
permanente en tu directorio de git.
Working directory
El working directory es una copia de una versión del proyecto. Estos archivos
se sacan de la base de datos comprimida en el directorio de git y se colocan en
el disco para que los puedas usar o modificar.
Staging area
Es un área que almacena información acerca de lo que va a ir en tu próxima
confirmación. A veces se le denomina índice (index).
Archivos tracked
Son los archivos que viven dentro de git, no tienen cambios pendientes y sus
últimas actualizaciones han sido guardadas en el repositorio gracias a los
comandos git add y git commit .
Archivos staged
Son archivos en staging. Viven dentro de git y hay registro de ellos porque han
sido afectados por el comando git add , aunque no sus últimos cambios. Git ya
sabe de la existencia de estos últimos cambios, pero todavía no han sido
guardados definitivamente en el repositorio porque falta ejecutar el
comando git commit .
Archivos unstaged
Git y GitHub 10
Entiéndelos como archivos “tracked
pero
unstaged”. Son archivos que viven dentro de git pero no han sido afectados
por el comando git add ni mucho menos por git commit . Git tiene un registro de
estos archivos, pero está desactualizado, sus últimas versiones solo están
guardadas en el disco duro.
Archivos untracked
Son archivos que NO viven dentro de git, solo en el disco duro. Nunca han sido
afectados por git add , así que git no tiene registros de su existencia.
Git status
git status nos permite ver el estado de todos nuestros archivos y carpetas.
Git add
git addnos ayuda a mover archivos del untracked o unstaged al estado staged.
Podemos usar git nombre-del-archivo-o-carpeta para añadir archivos y carpetas
individuales o git add -A para mover todos los archivos de nuestro proyecto
(tanto untrackeds como unstageds).
Git commit
Nos ayuda a mover archivos de unstaged a tracked. Esta es una ocasión
especial, los archivos han sido guardados o actualizados en el repositorio. Git
nos pedirá que dejemos un mensaje para recordar los cambios que hicimos y
podemos usar el argumento m para escribirlo ( git commit -m "mensaje" ).
Git rm
Git y GitHub 11
Este comando necesita alguno de los siguientes argumentos para poder
ejecutarse correctamente:
Git y GitHub 12
Por defecto, el proyecto se crea en una rama llamada Main (anteriormente
conocida como Master). Cada vez que añades código y guardas los cambios,
estás haciendo un commit, que es añadir el nuevo código a una rama. Esto
genera nuevas versiones de esta rama o branch, hasta llegar a la versión actual
de la rama Main.
2. Rama development
Cuando decides hacer experimentos, puedes generar ramas experimentales
(usualmente llamadas development), que están basadas en alguna rama main,
pero sobre las cuales puedes hacer cambios a tu gusto sin necesidad de
afectar directamente al código principal.
3. Rama hotfix
En otros casos, si encuentras un bug o error de código en la rama Main (que
afecta al proyecto en producción), tendrás que crear una nueva rama (que
usualmente se llaman bug fixing o hot fix) para hacer los arreglos necesarios.
Cuando los cambios estén listos, los tendrás que fusionar con la rama Main
para que los cambios sean aplicados. Para esto, se usa un comando
llamado Merge, que mezcla los cambios de la rama que originaste a la rama
Main.
Todos los commits se aplican sobre una rama. Por defecto, siempre
empezamos en la rama Main (pero puedes cambiarle el nombre si no te gusta)
y generamos nuevas ramas, a partir de esta, para crear flujos de trabajo
independientes.
Git y GitHub 13
Recuerda que todas tus versiones salen de la rama principal o Master y de allí
puedes tomar una versión específica para crear otra rama de versiones.
Solo ten en cuenta que combinar estas ramas (hacer “merge”) puede generar
conflictos. Algunos archivos pueden ser diferentes en ambas ramas. Git es muy
inteligente y puede intentar unir estos cambios automáticamente, pero no
siempre funciona. En algunos casos, somos nosotros los que debemos resolver
estos conflictos a mano.
Git y GitHub 14
git reset
Con este comando no solo volvemos en el tiempo sino que borramos los
cambios que hicimos después de este commit.
git reset id --soft [SHA 1]: elimina los cambios hasta el staging area
git reset id --mixed [SHA 1]: elimina los cambios hasta el working area
git reset id --hard [SHA 1]: regresa hasta el commit del [SHA-1]Donde el
SHA-1 es el identificador del commit
git rm
Este comando nos ayuda a eliminar archivos de Git sin eliminar su historial del
sistema de versiones. Esto quiere decir que si necesitamos recuperar el archivo
solo debemos “viajar en el tiempo” y recuperar el último commit antes de
borrar el archivo en cuestión.
Recuerda que git rm no puede usarse así nomás. Debemos usar uno de los
flags para indicarle a Git cómo eliminar los archivos que ya no necesitamos en
la última versión del proyecto:
staging, pero los mantiene en nuestro disco duro. Básicamente le dice a Git
que deje de trackear el historial de cambios de estos archivos, por lo que
pasaran a un estado untracked .
: Elimina los archivos de Git y del disco duro. Git siempre guarda
git rm --force
Git y GitHub 15
git reset
Este comando nos ayuda a volver en el tiempo. Pero no como git checkout que
nos deja ir, mirar, pasear y volver. Con git reset volvemos al pasado sin la
posibilidad de volver al futuro. Borramos la historia y la debemos sobreescribir.
No hay vuelta atrás.
Este comando es muy peligroso y debemos emplearlo solo en caso de
emergencia. Recuerda que debemos usar alguna de estas dos opciones:
Hay dos formas de utilizar git reset : con el argumento --hard , borrando toda la
información que tengamos en el área de staging (y perdiendo todo para
siempre). O, un poco más seguro, con el argumento --soft , que mantiene allí los
archivos del área de staging para que podamos aplicar nuestros últimos
cambios pero desde un commit anterior.
guardamos los cambios que tengamos en Staging, así podemos aplicar las
últimas actualizaciones a un nuevo commit.
No para borrarlos ni nada de eso, solo para que los últimos cambios de
estos archivos no se envíen al último commit, a menos que cambiemos de
opinión y los incluyamos de nuevo en staging con git add , por supuesto.
Bueno, todos los cambios están en el área de Staging, incluido el archivo con
los cambios que no están listos. Esto significa que debemos sacar ese archivo
de Staging para poder hacer commit de todos los demás.
Git y GitHub 16
¡Al usar git rm lo que haremos será eliminar este archivo completamente de git!
Todavía tendremos el historial de cambios de este archivo, con la eliminación
del archivo como su última actualización. Recuerda que en este caso no
buscábamos eliminar un archivo, solo dejarlo como estaba y actualizarlo
después, no en este commit.
En cambio, si usamos git reset HEAD , lo único que haremos será mover estos
cambios de Staging a Unstaged. Seguiremos teniendo los últimos cambios del
archivo, el repositorio mantendrá el archivo (no con sus últimos cambios, pero
sí con los últimos en los que hicimos commit) y no habremos perdido nada.
Conclusión: Lo mejor que puedes hacer para salvar tu puesto y evitar un
incendio en tu trabajo es conocer muy bien la diferencia y los riesgos de todos
los comandos de Git.
Para solucionarlo, utilizamos los servidores remotos: un nuevo esto que deben
seguir nuestros archivos para conectar y trabajar con equipos de cualquier
parte del mundo.
Estos servidores remotos pueden estar alojados en GitHub, GitLab, BitBucket,
entre otros. Lo que van a hacer es guardar el mismo repositorio que tienes en
tu computadora y darnos una URL con la que todos podremos acceder a lso
archivos del proyecto. Así, el equipo podrá descargarlos, hacer cambios y
volverlos a enviar al servidor remoto para que otras personas vena los
cambios, comparen sus versiones y creen nuevas propuestas para el proyecto.
Luego de hacer git add y git commit debemos ejecutar este comando para
mandar los cambios al servidor remoto.
Git y GitHub 17
git push
git fetch
git merge
git pull
Comandos adicionales
Git y GitHub 18
git branch nombre_de_la_rama
Para generar un rama y movernos a ella automáticamente, usar git branch y git
checkout al mismo tiempo.
Para llevarnos a cualquier commit son borrar los commit posteriores al tag
seleccionado.
Comandos adicionales
Git y GitHub 19
Resolución de conflictos al hacer un
marge
Git nunca borra nada, a menos que nosotros se lo indiquemos. Cuando
usamos los comandos git merge o git checkout estamos cambiando de rama o
creando un nuevo commit, no borrando ramas ni commits (recuerda que
puedes borrar commits con git reset y ramas con git branch -d ).
Git es muy inteligente y puede resolver algunos conflictos automáticamente:
cambios, nuevas líneas, entre otros. Pero algunas veces no sabe cómo resolver
estas diferencias, por ejemplo, cuando dos ramas diferentes hacen cambios
distintos a una misma línea.
Esto lo conocemos como conflicto y lo podemos resolver manualmente. Solo
debemos hacer el merge, ir a nuestro editor de código y elegir si queremos
quedarnos con alguna de estas dos versiones o algo diferente. Algunos
editores de código como Visual Studio Code nos ayudan a resolver estos
conflictos sin necesidad de borrar o escribir líneas de texto, basta con hacer
clic en un botón y guardar el archivo.
Recuerda que siempre debemos crear un nuevo commit para aplicar los
cambios del merge. Si Git puede resolver el conflicto, hará commit
automáticamente. Pero, en caso de no pueda resolverlo, debemos solucionarlo
y hacer el commit.
Los archivos con conflictos por el comando git merge entran en un nuevo estado
que conocemos como Unmerged. Funcionan muy parecido a los archivos en
estado Unstaged, algo así como un estado intermedio entre Untracked y
Unstaged. Solo debemos ejecutar git add para pasarlos al área de staging y git
commit para aplicar los cambios en el repositorio.
Git y GitHub 20
Al trabajar con otras personas, es necesario utilizar un repositorio remoto.-Para
copiar el repositorio remoto al directorio de trabajo local, se utiliza el
comando git clone <url> , y para enviar cambios al repositorio remoto se utiliza git
push.-Para actualizar el repositorio local se hace uso del comando git fetch ,
luego se debe fusionar los datos traídos con los locales usando git merge .
Para traer los datos y fusionarlos a la vez, en un solo comando, se usa git
pull .- Para crear commits rápidamente, fusionando git add y git commit -m "" ,
usamos git commit -am "" .- Para generar nuevas ramas, hay que posicionarse
sobre la rama que se desea copiar y utilizar el comando git branch <nombre> .
Para saltar entre ramas, se usa el comando git checkout <branch> - Una vez
realizado los cambios en la rama, estas deben fusionarse con git merge .
Los merges pueden generar conflictos, esto aborta la acción y pide que
soluciones el problema manualmente, aceptando o rechazando los cambios
que vienen.
Git y GitHub 21
Por lo que de aquí en adelante cada vez que escuches a Freddy mencionar
“master” debes saber que hace referencia a “main”
Uso de GitHub
GitHub es una plataforma que nos permite guardar repositorios de Git que
podamos usar como servidores remotos y ejecutar algunos comandos de
forma visual e interactiva.
Creamos una cuenta de GitHub para poder crear o importar repositorios.
git remote
git remote -v
Git y GitHub 22
merge o solo git pull con el flag -allow-unrelated-histories :
Por último, ahora sí podemos hacer git push para guardar los cambios de
nuestro repositorio local en GitHub:
Git y GitHub 23
La persona a la que enviamos el mensaje cifrado puede emplear su llave
privada para descifrar el mensaje y ver los archivos.
ssh-add ruta-donde-guardaste-tu-llave-privada
En Mac:
Si usas una versión de OSX superior a Mac Sierra (v10.12), debes crear o
modificar un archivo “config” en la carpeta de tu usuario con el siguiente
contenido (ten cuidado con las mayúsculas):Host *
AddKeysToAgentyes
UseKeychainyes
Git y GitHub 24
IdentityFile ruta-donde-guardaste-tu-llave-privada
ssh-add-K ruta-donde-guardaste-tu-llave-privada
Linux (Ubuntu):
Git y GitHub 25
cat ~/.ssh/id_rsa.pub
git tag
Comando adicional
Git y GitHub 26
Para mostrar la historia del repositorio pero comprimida.
git branch
Para ver gráficamente nuestro entorno y flujo de trabajo local con Git utilizamos
el comando gitk. Gitk fue el primer visor gráfico que se desarrolló para ver de
manera gráfica el historial de nuestro repositorio de Git.
gitk
Git y GitHub 27
sudo apt-get install gitk
Hacer un commit con el nuevo mensaje que queremos, esto nos abre el
editor de texto de la terminal:
Git y GitHub 28
git commit —amend
Corregimos el mensaje.
Ejecutar el cambio.
Crear ramas
Git y GitHub 29
En un entorno profesional normalmente se bloquea la rama master, y para
enviar código a dicha rama pasa por un code review y luego de su aprobación
se unen códigos con los llamados merge request.
Para realizar pruebas enviamos el código a servidores que normalmente los
llamamos staging develop (servidores de pruebas) luego de que se realizan las
pruebas pertinentes tanto de código como de la aplicación estos pasan al
servidor de producción con el ya antes mencionado merge request.
El pull request permite que otros miembros del equipo revisen el código y
así aprobar el merge a la rama.
Al hacer un pull request, se genera una conversación que pueden seguir los
demás usuarios del repositorio, así como autorizar y rechazar los cambios.
Git y GitHub 30
git checkout -b <rama>
Git y GitHub 31
Al hacer un fork de un poryecto en GitHub, te conviertes en dueñ@ del
repositorio fork, puedes trabajar en este con todos los permisos, pero es un
repositorio completamente diferente que el original, teniendo solamente alguna
historia en común (como crédito al creado o creadora original).
Los forks son importantes porque es la manera en la que funciona el open
source, ya que, una persona puede no ser colaborador de un proyecto, pero
puede contribuír al mismo, haciendo mejor software que pueda ser utilizado
por cualquiera.
Ejemplo:
Ejemplo:
Este pull nos traerá los cambios del remoto, por lo que se estará al día en el
proyecto. El flujo de trabajo cambia, en adelante se estará trabajando
Git y GitHub 32
haciendo pull desde el upstream y push al origin para pasar a hacer pull
request.
Nota: Siempre se debe proteger el archivo .git. Dependiendo del software para
el servidor web, existen diferentes maneras. La conexión entre GitHub y el
servidor se puede realizar mediante: Travis (pago) o Jenkis (Open source).
Git y GitHub 33
comúnmente tienen la extensión .env o cuando te estás conectando a una base
de datos; son archivos que nadie debe ver.
Por diversas razones, no todos los archivos que agregas a un proyecto
deberían guardarse en un repositorio. Esto es porque hay archivos que no todo
el mundo debería de ver, y hay archivos que al estar en el repositorio ralentizan
el proceso de desarrollo (por ejemplo: los binary large objects, blob, que tardan
en descargarse).
Para que no se suban estos archivos no deseados se puede crear un archivo
con el nombre .gitignore en la raíz del repositorio con las reglas para los
archivos que no se deberían subir: Aquí puedes ver la sintaxis de los .gitignore.
Es un blob (binary large object, objeto binario grande), mismos que son
difíciles de gestionar en git.
Git y GitHub 34
muestre en la web en tiempo real.
Este es un sitio para nuestros proyectos donde lo único que tenemos que hacer
es tener un repositorio alojado. En la página, podemos seguir las instrucciones
para crear este repositorio
push a master .
Git y GitHub 35
Para hacer un rebase en la rama feature de la rama master, correrías los
siguientes comandos:
Git y GitHub 36
Nunca debes reorganizar las confirmaciones una vez que se hayan enviado a
un repositorio público. La reorganización sustituiría las confirmaciones antiguas
por las nuevas y parecería que esa parte del historial de tu proyecto se hubiera
desvanecido de repente.
El comando rebase es **_una mala práctica, sobre todo en repositorios
remotos. Se debe evitar su uso, pero para efectos de práctica te lo vamos a
mostrar, para que hagas tus propios experimentos. Con rebase puedes recoger
todos los cambios confirmados en una rama y ponerlos sobre otra.
Ejemplo:
git stash
El comando git stash guarda el trabajo actual del Staging en una lista diseñada
para ser temporal llamada Stash, para que pueda ser recuperado en el futuro.
Para agregar los cambios al stash se utiliza el comando:
Git y GitHub 37
git stash
Podemos poner un mensaje en el stash, para asi diferenciarlos en git stash list
por si tenemos varios elementos en el stash. Esto con:
git stashpopstash@{<num_stash>}
Para retomar los cambios de una posición específica del Stash puedes utilizar
el comando:
Git y GitHub 38
git stash list
Retomar los cambios de una posición específica del Stash || Aplica los cambios
de un stash específico
Si deseas crear una rama y aplicar un stash específico (obtenido desde git stash
Pero si, en cambio, conoces el índice del stash que quieres borrar (mediante git
Si, en cambio, deseas eliminar todos los elementos del stash, puedes utilizar:
Git y GitHub 39
Consideraciones:
El cambio más reciente (al crear un stash) SIEMPRE recibe el valor 0 y los
que estaban antes aumentan su valor.
git clean
git clean -f
Git y GitHub 40
Git clean tiene muchísimas opciones adicionales, que puedes explorar al ver
su documentación oficial.
a -b - c - d Master
\
e - f - g Feature
git cherry-pick f
a -b - c - d - f Master
\
e - f - g Feature
Git y GitHub 41
La confirmación f se ha sido introducido con éxito en la rama de funcionalidad
Atención
Cherry-pick es una mala práctica porque significa que estamos
reconstruyendo la historia, usa cherry-pick con sabiduría. Si no sabes lo que
estás haciendo, mejor evita emplear este comando.
git reflog
git checkout Puedes moverte sin realizar ningún cambio al commit exacto de
la ref
git reset : Hará que el último commit sea el pasado por la ref , usar este
comando sólo si sabes exactamente qué estás haciendo
Git y GitHub 42
#Te recuperará todos los cambios que tengas diferentesal commit
#eff544f, los agregaráal staging areay
#moveráel headal commit eff544f
¿Qué pasa cuando todo se rompe y no sabemos qué está pasando? Con git reset
Atención
es una mala práctica, no deberías usarlo en ningún momento. Debe ser
git reset
git add -A # Para hacer uso de amend los archivos deben de estar en stagi
ng
git commit --amend # Remendar último commit
Git y GitHub 43
de editar o agregar comentarios al commit anterior porque abrirá la consola
para editar este commit anterior.
Atención
Usar amend es una mala práctica, sobre todo cuando ya se ha hecho push o
pull al repositorio remoto. Al momento de hacer amend con algún commit que
esté en remoto, va a generar un conflicto que se va a arreglar haciendo
un commit adicional y se perderá el beneficio del amend.
Con git grep -n color nos saldrá un output el cual nos dirá en qué línea está lo
que estamos buscando.
Con git grep -c color nos saldrá un output el cual nos dirá cuántas veces se
repite esa palabra y en qué archivo.
La letra S es mayuscula.
Git y GitHub 44
git shortlog -sn : muestra cuantos commit han hecho cada miembro del equipo.
git blame ARCHIVO : muestra quien hizo cada cosa línea por línea.
git branch -a : se muestran todas las ramas, tanto locales como remotas.
Recuerda que para aprender bien Git y GitHub no basta con leer y ver videos
hay que practicar para aprender bien esta tecnología.
No pares de aprender!
Git y GitHub 45