Escribe una pregunta sobre Git y presiona consultar.
Git es un sistema de control de versiones que te permite realizar un seguimiento de los cambios que realizas
en tu proyecto de software a lo largo del tiempo. Es especialmente útil si trabajas en equipo o si necesitas
hacer cambios en tu proyecto sin temor a perder trabajo previo. Git se utiliza en una amplia variedad de
proyectos de software, tanto comerciales como de código abierto.
Cuando trabajas con Git, tienes una copia de tu proyecto en tu computadora. Cada vez que realizas cambios en
tu proyecto, Git realiza un seguimiento de estos cambios y los almacena en lo que se llama un "repositorio".
Este repositorio contiene todo el historial de cambios que has realizado en tu proyecto, y te permite volver a
cualquier versión anterior de tu proyecto si es necesario. Además, como Git es un sistema distribuido, cada
colaborador tiene una copia completa del historial del proyecto, lo que permite trabajar de manera
descentralizada
y offline. Esto es beneficioso ya que puedes compartir tu trabajo con otros desarrolladores y colaborar en el
mismo proyecto.
En Git, términos como "commit", "branch" y "merge" son fundamentales. Un "commit" es un conjunto de cambios
guardados,
una "branch" es una línea de desarrollo independiente y "merge" es la acción de unir dos líneas de desarrollo.
Aquí hay un ejemplo para que lo entiendas mejor: imagina que estás trabajando en un proyecto web y has
realizado algunos cambios importantes en tu código. Sin Git, tendrías que copiar y pegar el código en un
archivo de texto antes de realizar los cambios, en caso de que algo saliera mal y necesitaras volver a la
versión anterior. Con Git, no tienes que preocuparte por esto. Simplemente realizas los cambios en tu proyecto
y Git los registra automáticamente, lo que te permite volver a cualquier versión anterior si algo sale mal.
Además, Git facilita la resolución de conflictos cuando varios desarrolladores están trabajando en el mismo
proyecto,
al proporcionar herramientas para comparar y fusionar cambios.
En resumen, Git es una herramienta valiosa para cualquier desarrollador de software. Te permite realizar un
seguimiento de los cambios en tu proyecto a lo largo del tiempo, colaborar con otros desarrolladores y volver
a versiones anteriores si es necesario. A medida que aprendas más sobre Git, te darás cuenta de que es una
herramienta muy poderosa que puede ahorrarte mucho tiempo y esfuerzo en el desarrollo de software.
Inicializar repositorio
El comando git init crea un nuevo repositorio de Git. Puede utilizarse para convertir un proyecto existente y
sin versión en un repositorio de Git, o para inicializar un nuevo repositorio vacío. La mayoría de los demás
comandos de Git no se encuentran disponibles fuera de un repositorio inicializado, por lo que este suele ser
el primer comando que se ejecuta en un proyecto nuevo.
Al ejecutar git init, se crea un subdirectorio de .git en el directorio de trabajo actual, que contiene todos
los metadatos de Git necesarios para el nuevo repositorio. Estos metadatos incluyen subdirectorios de objetos,
referencias y archivos de plantilla. También se genera un archivo HEAD que apunta al último commit en la rama
actual.
Clonar repositorio remoto
git clone se utiliza principalmente para apuntar a un repositorio existente y clonar o copiar dicho
repositorio en un nuevo directorio, en otra ubicación.
El repositorio original se puede localizar en
el sistema de archivos local o en los protocolos admitidos a los que se puede acceder por máquina remota. El
comando git clone copia un repositorio de Git existente. Es una especie de checkout en Subversion (SVN), salvo
por el hecho de
que la "copia de trabajo" es un repositorio de Git completo: tiene su propio historial, administra sus propios
archivos y es un entorno completamente aislado del repositorio original.
Por comodidad, la clonación crea automáticamente una conexión remota llamada "origin" que apunta al
repositorio original, estableciendo así un enlace para seguir el repositorio original. Gracias a esto, es muy
fácil interactuar con un repositorio central.
Esta conexión
automática se establece creando referencias de Git a los encabezados de la rama remota en refs/remotes/origin
e inicializando las variables de configuración remote.origin.url y remote.origin.fetch.
Es importante destacar que, al clonar un repositorio, se crea una copia exacta del mismo en una nueva
ubicación. Por lo tanto, cualquier cambio que se realice en el repositorio clonado no afectará al repositorio
original y viceversa.
crear, listar, borrar ramas
El comando git branch en Git se utiliza para administrar ramas en un repositorio. Permite crear, listar y
eliminar ramas, facilitando la organización y el desarrollo paralelo en proyectos.
Crear Ramas: Para crear una nueva rama, se utiliza el comando git branch [nombre-de-rama].
Listar Ramas: Para listar todas las ramas existentes en el repositorio, simplemente se utiliza el comando git branch.
Eliminar Ramas: Para eliminar una rama, se utiliza el comando git branch -d [nombre-de-rama], para una eliminación segura o git branch -D [nombre-de-rama], para forzar la eliminación.
Las ramas son esenciales para aislar el trabajo en características o bugs específicos sin afectar la rama
principal. Una vez que el trabajo en una rama está completo y ha sido probado, puede ser fusionado de nuevo en
la rama principal (o cualquier otra rama) utilizando el comando git merge.
En resumen, git branch es una herramienta poderosa que ayuda a los desarrolladores a trabajar en múltiples
tareas de manera simultánea sin interferir entre ellas, y facilita la integración del trabajo una vez
completado.
cambiar entre ramas
El comando git checkout te permite desplazarte entre las ramas creadas por git branch. Al cambiar a una rama,
se actualizan los archivos en el directorio de trabajo para reflejar la versión almacenada en esa rama, y se
indica a Git que registre todas las confirmaciones nuevas en dicha rama.
Puedes contemplar todo esto como una forma de seleccionar la línea de desarrollo en la que trabajas.
Si damos por sentado que el repositorio en el que trabajas contiene ramas preexistentes, puedes cambiar de una de estas ramas a otra con git checkout. Para saber qué ramas están disponibles y cuál es el nombre de la rama actual, ejecuta git branch.
Además, git checkout también puede usarse para restaurar archivos a una versión específica. Por ejemplo, para restaurar un archivo a la versión en el último commit, puedes usar:
En resumen, git checkout es un comando fundamental en Git que permite desplazarse entre las ramas creadas por git branch y también restaurar archivos a una versión anterior. Cambiar de una rama a otra con git checkout es una forma de seleccionar la línea de desarrollo en la que se trabaja y actualizar los archivos en el directorio de trabajo para reflejar la versión almacenada en esa rama.
agregar versiones a repositorio
Git ofrece la posibilidad de marcar estados significativos en la vida de un repositorio, una práctica
comúnmente utilizada para gestionar las releases de un proyecto. A través del comando "git tag" podemos crear
tags, en una operación que se conoce comúnmente como "tagging". Esta operativa tiene muchas variantes y
utilidades.
Además de mantener informados a los usuarios del código de los proyectos y otros desarrolladores sobre las
releases de una aplicación, el tagging es una herramienta fundamental para que otros sistemas sepan cuándo un
proyecto ha cambiado y puedan desencadenar procesos a ejecutar cada vez que esto ocurre. De hecho, es
importante porque algunos gestores de paquetes, como npm o RubyGems, te obligan a usarlo para poder publicar
packages en ellos.
Así pues, vamos a relatar las bases para trabajar con el sistema de tagging en Git, de modo que puedas usarlo
en tu día a día en el trabajo con Git.
Además, en el caso de GitHub, también puedes crear tags en los repositorios directamente desde la interfaz web
del servicio. Desde la página principal del repositorio, en el enlace que indica "releases", puedes acceder a
la información sobre las releases etiquetadas en tu proyecto, así como crear nuevas releases, lo cual a su vez
crea nuevas tags en tu repositorio de Git.
ver info de acciones en repositorio
git-show es una herramienta de línea de comandos que se utiliza para ver detalles ampliados de objetos de Git,
como blobs, árboles, etiquetas y confirmaciones, y que presenta un comportamiento específico para cada tipo de
objeto.
Las etiquetas muestran el mensaje de la etiqueta y otros objetos incluidos en ella; los árboles muestran los
nombres y el contenido de los objetos incluidos en ellos; los blobs muestran el contenido directo de un blob;
y las confirmaciones muestran un mensaje de registro de la confirmación y el resultado de la diferencia de los
cambios en esta.
Se accede a todos los objetos de Git mediante referencias. De forma predeterminada, git-show actúa contra la
referencia HEAD. La referencia HEAD siempre dirige al último commit de la rama actual. Por lo tanto, puedes
usar git-show para mostrar los mensajes de registro y el resultado de la diferencia de la última confirmación.
explorar historial del repositorio
El comando git log muestra los commits registrados. Te permite ver el historial del proyecto, filtrarlo y
buscar cambios específicos. Mientras que git status te permite examinar el directorio de trabajo y el área de
preparación, git log solo muestra el historial confirmado.
La opción "log" se puede personalizar de diversas maneras, desde filtrar los commits hasta verlos en un
formato completamente definido por el usuario.
examinar estado del repositorio
El comando git status muestra el estado del directorio de trabajo y el área de preparación (staging area),
indicando
los cambios que han sido añadidos al área de preparación pero no confirmados, así como los cambios que aún no
han
sido añadidos al área de preparación. Este comando es esencial para entender la situación actual del
repositorio
antes de realizar commits o cambiar de rama.
git status proporciona una visión detallada de los cambios pendientes organizados por su estado en el flujo de
trabajo de Git. También sugiere comandos específicos que se pueden usar para mover los cambios al siguiente
estado
en el proceso.
preparar cambios para confirmar
El comando git add se utiliza para añadir cambios en el directorio de trabajo al área de preparación (staging
area) para la siguiente confirmación. Al ejecutar git add, estás diciendo a Git que incluya las
actualizaciones especificadas en el próximo commit. Sin embargo, git add no afecta al repositorio; los cambios
no se registran hasta que ejecutes git commit.
Esto proporciona una gran flexibilidad en cómo y cuándo confirmar los cambios. Puedes usar git add para
agregar solo ciertos archivos o directorios, o puedes incluir todos los cambios en el directorio de trabajo si
no especificas un camino.
confirmar cambios en el repositorio
El comando git commit se utiliza para confirmar los cambios desde el área de preparación (staging area) al
repositorio. Este comando captura una instantánea del proyecto, guardando una versión que incluye todos los
cambios preparados con git add. Además, git commit requiere un mensaje de confirmación que describa los
cambios realizados.
Con git commit, puedes confirmar todos los cambios preparados en el área de preparación. Si deseas confirmar
cambios específicos, deberás prepararlos primero con git add. También existe la opción de omitir el área de
preparación y confirmar los cambios en el directorio de trabajo directamente, utilizando la opción -a.
mostrar diferencias entre commits
El comando git diff se utiliza para mostrar las diferencias entre los cambios en el directorio de trabajo, el
área de preparación (staging area), y los commits. Es una herramienta esencial para visualizar las
modificaciones antes de confirmarlas con git commit.
git diff puede ser usado para mostrar las diferencias entre el directorio de trabajo y el área de preparación,
entre el área de preparación y el último commit, o entre dos commits específicos. También se puede utilizar
para comparar ramas y mostrar las diferencias entre archivos específicos.
deshacer cambios en el repositorio
El comando git revert se utiliza para deshacer cambios en el historial del repositorio, creando un nuevo
commit que revierte los efectos del commit especificado. A diferencia de git reset, que retrocede el
historial, git revert mantiene el historial intacto y proporciona una forma segura de deshacer cambios y
compartir esos cambios con otros colaboradores.
git revert es especialmente útil en entornos colaborativos, donde retroceder el historial puede causar
inconsistencias y conflictos con el trabajo de otros desarrolladores. Con git revert, puedes deshacer cambios
de manera segura y transparente.
guardar cambios temporales
El comando git stash se utiliza para guardar cambios en el directorio de trabajo y el área de preparación
(staging area) de manera temporal, permitiendo así cambiar de rama sin llevar los cambios actuales. Esto es
útil si necesitas cambiar de contexto o trabajar en algo diferente sin confirmar los cambios actuales.
git stash guarda tus modificaciones en una pila de cambios temporales, a la cual puedes volver más tarde.
Cuando estés listo para retomar el trabajo, puedes aplicar los cambios guardados con git stash apply, y git
stash pop si además deseas eliminar la entrada de la pila de cambios temporales.
reorganizar la historia de commits
El comando git rebase se utiliza para integrar cambios de una rama a otra, reorganizando la historia de commits para que parezca lineal. Rebase es una manera poderosa de mantener un historial de commits limpio y comprensible, lo que es beneficioso en proyectos colaborativos.
git rebase traslada o aplica los commits de una rama sobre otra, lo que permite fusionar las ramas sin crear un commit de fusión adicional. Aunque es una herramienta poderosa, git rebase debe ser usado con precaución, especialmente en ramas compartidas, ya que reescribe la historia del repositorio y puede generar confusiones entre los colaboradores.
configurar Git
El comando git config se utiliza para configurar las opciones y variables de Git que controlan el
comportamiento del sistema y la apariencia. Estas configuraciones pueden ser especificadas a nivel de sistema,
de usuario o de repositorio, lo que proporciona flexibilidad para personalizar el entorno de Git según las
necesidades del proyecto o del usuario.
Con git config puedes configurar información básica como tu nombre, correo electrónico, el editor de texto
preferido, y también opciones más avanzadas como alias de comandos, colores de salida, y comportamientos
específicos de Git. Es el primer comando que se suele ejecutar después de instalar Git, para establecer el
entorno de usuario.
agregar un repositorio remoto
El comando git remote add se utiliza para agregar un nuevo repositorio remoto a la lista de remotos de tu
repositorio local. Esto es útil para vincular tu repositorio local con un repositorio remoto, lo que permite
el intercambio de cambios entre el repositorio local y el remoto.
Una vez que se ha agregado un repositorio remoto, puedes referenciarlo por el nombre que le has dado y
utilizar otros comandos de Git para interactuar con ese repositorio remoto, como git fetch, git pull y git
push. Esta acción facilita la colaboración con otros desarrolladores y el seguimiento de los cambios en
proyectos remotos.
eliminar un repositorio remoto
El comando git remote remove se utiliza para eliminar una referencia a un repositorio remoto de tu repositorio
local. Esto es útil cuando ya no deseas interactuar con un repositorio remoto específico o si necesitas
eliminar una referencia incorrecta o desactualizada.
Al ejecutar este comando, se eliminará la referencia al repositorio remoto, pero no afectará el repositorio
remoto en sí. Es una operación local que ayuda a mantener actualizada y organizada la lista de repositorios
remotos en tu repositorio local.
bajar cambios de una rama
El comando git fetch descarga commits, archivos y referencias de un repositorio remoto a tu repositorio local.
Esta acción se lleva a cabo cuando quieres ver en qué han estado trabajando los demás. Es similar al comando
svn update porque te permite ver cómo ha progresado el historial central, pero no te obliga a fusionar los
cambios en tu repositorio. Git aísla el contenido descargado del contenido local existente sin tener ningún
tipo de repercusión sobre el desarrollo local de tu trabajo. El contenido descargado debe extraerse
específicamente con el comando git checkout. Esto permite que la descarga constituya una forma segura de
revisar commits antes de integrarlos en tu repositorio local.
Para descargar contenido de un repositorio remoto, los comandos git pull y git fetch están disponibles para
realizar esta tarea. Puedes considerar git fetch como la versión segura de los dos comandos. Este comando
descarga el contenido remoto, pero no actualiza el estado de trabajo del repositorio local, por lo que tu
trabajo actual no se verá afectado. git pull constituye una alternativa más agresiva, ya que descarga el
contenido remoto a la rama local activa e inmediatamente ejecuta git merge para crear un commit fusionado con
el nuevo contenido remoto. Si tienes cambios pendientes en curso, esta acción provocará conflictos e iniciará
el flujo de resolución de conflictos de fusión.
explorar historial del repositorio
El comando git pull se utiliza para capturar y descargar contenido de un repositorio remoto y actualizar
inmediatamente
el repositorio local para que coincida con ese contenido. La fusión de cambios remotos ascendentes en tu
repositorio local es una tarea común en los flujos de trabajo de colaboración basados en Git. El comando git
pull es en
realidad una combinación de otros dos comandos, git fetch seguido de git merge. En la primera etapa de
operación, git fetch se ejecutará para
descargar el contenido remoto a la rama local a la que se apunta. Una vez descargado el contenido, entrará en
un flujo de trabajo de
fusión mediante git merge. Se creará una nueva confirmación de fusión y HEAD se actualizará para que apunte a
la nueva
confirmación.
Primero se ejecuta el comando git fetch que descarga contenido del repositorio remoto especificado. Luego se
ejecuta git merge
para fusionar las referencias de contenido remoto y dirigir HEAD a una nueva confirmación de fusión local.
Para demostrar mejor el proceso de extracción y fusión, consideremos el siguiente ejemplo. Supongamos que
tenemos un repositorio con una rama principal y un origen remoto.
enviar cambios a repo
El comando git push se usa para cargar contenido del repositorio local a un repositorio remoto. El envío es la
forma de transferir confirmaciones desde tu repositorio local a un repositorio remoto. Es el equivalente a git
fetch, pero mientras que al recuperar se importan las confirmaciones a ramas locales, al enviar estas se
exportan a ramas remotas. Las ramas remotas se configuran mediante el comando git remote. Los envíos pueden
sobrescribir los cambios, por lo que se debe tener cuidado a la hora de realizarlos. Estos problemas se
describen a continuación.
Envía la rama especificada a una , junto con todos los commits y objetos internos necesarios. De este modo se
crea una rama local en el repositorio de destino. Para evitar que se sobrescriban los commits, Git no te
permitirá enviarlos cuando el resultado en el repositorio de destino sea una fusión sin avance rápido.
Mezclar, integrar ramas
La fusión es la forma en que Git vuelve a unir un historial bifurcado. El comando git merge permite
tomar las líneas independientes de desarrollo creadas por git branch e integrarlas en una sola rama.
Ten en cuenta que todos los comandos presentados a continuación se ejecutan en la rama actual. La rama actual
se actualizará para reflejar la fusión, pero la rama objetivo no se verá afectada en absoluto. Una vez más,
esto significa que git merge se suele utilizar junto con git checkout para seleccionar la rama actual y git
branch -d para eliminar la rama objetivo obsoleta.
git merge combinará varias secuencias de commits en un historial unificado. En los casos de uso más
frecuentes, git merge se utiliza para combinar dos ramas. Los ejemplos siguientes del presente documento se
centrarán en este patrón de fusión de ramas. En estos casos, git merge toma dos punteros de commit,
normalmente los extremos de la rama, y encuentra un commit base común entre ellos. Una vez que Git
encuentra un commit base en común, crea un nuevo "commit de fusión" que combina los cambios de
cada secuencia de commits puesta en cola.
Si las dos ramas que tratas de fusionar han cambiado la misma parte del mismo archivo, Git no podrá determinar
qué versión utilizar. Cuando esto ocurre, Git se detiene justo antes del commit de fusión para que
puedas resolver los conflictos manualmente.
resetear ramas
El comando git reset es una herramienta compleja y versátil para deshacer cambios. Se invoca principalmente de
tres formas distintas, que se corresponden con los argumentos de líneas de comandos --soft, --mixed y --hard.
Cada uno de los tres argumentos se corresponde con los tres mecanismos de gestión de estados internos de Git:
el puntero HEAD, el índice (staging area) y el directorio de trabajo.
A nivel superficial, git reset tiene un comportamiento parecido a git checkout. Sin embargo, mientras que git
checkout solo
opera en el puntero de referencia HEAD, git reset moverá tanto el puntero de referencia HEAD como el puntero
de
referencia de la rama actual.
Llave SSH
Una clave SSH es una credencial de acceso para el protocolo de red SSH (Secure Shell). Este protocolo
proporciona
una comunicación segura con autenticación y cifrado entre máquinas en una red abierta no segura. SSH se
utiliza para
la transferencia remota de archivos, la gestión de redes y el acceso remoto al sistema operativo. El acrónimo
SSH
también se utiliza para describir un conjunto de herramientas que facilitan la interacción con el protocolo
SSH.
SSH utiliza un par de claves para establecer una conexión segura entre partes remotas. El par de claves
consta de una clave pública y una clave privada. Aunque los términos "pública" y "privada" pueden resultar
confusos,
es útil imaginar que la clave pública actúa como una "cerradura" y la clave privada como la "llave" que la
abre.
Proporcionas la "cerradura" pública a las partes remotas para que cifren o "cierren" los datos.
Posteriormente, estos
datos se descifran con la llave "privada" que guardas en un lugar seguro.
Los entornos Windows modernos ofrecen un subsistema de Windows para Linux (WSL). Este subsistema proporciona
un shell de
Linux completo dentro de un entorno Windows tradicional. Si tienes acceso a WSL, puedes generar una clave SSH
de la
misma manera que lo harías en Linux.
Los sistemas operativos macOS y Linux cuentan con aplicaciones de terminal modernas y muy completas, las cuales incluyen el conjunto de herramientas SSH preinstalado. El proceso para crear una clave SSH es el mismo en ambos sistemas operativos.
ssh-agent es otro programa que forma parte del conjunto de herramientas SSH y su misión es resguardar las claves privadas, actuando como un llavero virtual. Además de almacenar las claves privadas, también interviene en las solicitudes para firmar conexiones SSH con dichas claves privadas, garantizando que estas nunca se transfieran de manera no segura.