
Sistema que registra cambios en archivos a lo largo del tiempo, permitiendo recuperar versiones anteriores.
Usar un VCS también significa generalmente que si fastidias o pierdes archivos, puedes recuperarlos fácilmente. Además, obtienes todos estos beneficios a un coste muy bajo.
No solo aplica a código fuente, sino también a otros tipos de archivos (ej. diseños gráficos).
Algunas personas realizan control de versiones manual copiando archivos a diferentes directorios (a veces con fechas para identificarlos).
Sin embargo, este método es:
Para solucionarlo, surgieron los VCS locales, que:

Estos sistemas fueron un primer paso hacia herramientas más eficientes de control de versiones.
Sistemas como CVS, Subversion y Perforce usan un servidor central que almacena todos los archivos, mientras los clientes descargan y envían cambios a él.
Fueron el estándar por años, pero su dependencia de un servidor único llevó luego al desarrollo de sistemas distribuidos como Git.

Los sistemas como Git, Mercurial y Bazaar revolucionaron el control de versiones al distribuir el repositorio completo en cada copia local.
Si falla el servidor, cualquier copia local puede restaurar el proyecto
Cada desarrollador tiene un historial completo y puede trabajar offline
Permite múltiples flujos de trabajo y tipos de colaboración simultáneos
A diferencia de los sistemas centralizados, los DVCS permiten modelos de trabajo más dinámicos y descentralizados.
Este enfoque resolvió las limitaciones de los sistemas centralizados, dando más poder y autonomía a los desarrolladores.

Diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente.
Creado el 17 de abril de 2005, ha tenido gran número de versiones desde entonces.
Llevar registro de los cambios en archivos de computadora y coordinar el trabajo que varias personas realizan sobre archivos compartidos.
Esencia de Git:
• No es solo un VCS, es un sistema distribuido con filosofía única
• Requiere "desaprender" conceptos de SVN/Perforce para aprovecharlo plenamente
Diferencias clave:
✓ Almacenamiento inteligente: Guarda instantáneas (no solo cambios)
✓ Operación local: 90% de acciones no necesitan conexión
✓ Integridad de datos: Usa checksums (SHA-1) para todo registro
Por qué importa:
➤ Los errores comunes surgen de aplicar mentalidad centralizada
➤ Su modelo distribuido habilita flujos de trabajo imposibles en otros VCS
Mientras otros VCS guardan cambios incrementales (deltas), Git almacena el estado completo del proyecto en cada commit, como una fotografía del sistema de archivos.

Almacenamiento de datos como cambios en una versión de la base de cada archivo.

Almacenamiento de datos como instantáneas del proyecto a través del tiempo.
Mientras otros sistemas (como SVN o Perforce) dependen constantemente del servidor, casi todas las operaciones en Git se ejecutan localmente usando tu repositorio completo.
Ventajas
Acceso inmediato al historial completo y diferencias entre versiones
Puedes commitear, crear ramas y explorar el historial sin conexión
No necesitas VPN ni conexión estable para trabajar productivamente
Git protege tus datos mediante hashes SHA-1 únicos:
Detecta cualquier corrupción o cambio no autorizado
Todo se referencia por su contenido (no por nombres)
La misma estructura verifica datos al moverlos
Ejemplo práctico:
Si modificas 1 byte en un archivo antiguo:
Nunca perderás trabajo por fallos de almacenamiento o transferencia sin que Git lo detecte.
Estados de los archivos
Cambiado en el directorio de trabajo, pero no marcado para commit.
Añadido al staging area (índice) listo para el próximo commit.
Almacenado permanentemente en el repositorio local (Git directory).
Áreas clave
Donde editas los archivos (copia actual del proyecto).
Filtro para seleccionar qué cambios se incluirán en el commit.

Modificas archivos en el working directory → modified.
git add → Mueves cambios al staging area → staged.
git commit → Guardas en el repositorio local → committed.
A partir de aquí todos los comandos de Git funcionan igual en todas las plataformas
Una vez instalado y ejecutado el bash de Git, desde la terminal introducir el comando:
git --versionDe esta forma podemos saber la versión y si se ha instalado correctamente
Git requiere tu nombre y email para identificar tus commits:
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"⚠️ Esta información queda grabada permanentemente en todos tus commits.
--global): Aplica a todos tus repositorios (solo configurar una vez).--global para sobrescribir la configuración en un repo específico.Para ver/modificar tu configuración:
git config --list # Muestra toda la configuraciónPara obtener ayuda sobre git, utiliza:
git help <comando>Crear un nuevo repositorio o clonar uno existente
Realizar cambios en los archivos del proyecto
Añadir archivos modificados al área de preparación
Guardar los cambios en el repositorio local
Compartir cambios con el repositorio remoto
Para indicar que queremos realizar un control de versiones en un directorio:
git initEsto crea un nuevo subdirectorio llamado .git que contiene todos los archivos necesarios del repositorio —un esqueleto de un repositorio Git.
Todavía no hay nada en tu proyecto que esté bajo seguimiento.
Especifica qué archivos quieres controlar:
git add archivo1.java
git commit –m 'versión inicial del proyectoEn este paso es obligatorio indicar un mensaje descriptivo
Cada vez que se confirma se indica cual es la rama y el checksum asociado a ese commit, ya que cada vez que se hace uno se genera un nuevo código.
git commit -m "Primer commit: versión inicial del proyecto"Añadiendo la opción -a al comando git commit harás que Git prepare automáticamente todos los archivos rastreados antes de confirmarlos, ahorrándote el paso de git add:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: archivo1.java
no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks
1 file changed, 5 insertions(+), 0 deletions(-)git init: Crea la estructura .git para empezar a versionargit add: Prepara los archivos para el commit (los añade al staging area)git commit: Guarda permanentemente una "foto" de los archivos en ese estadoDespués de realizar esta pequeña práctica podemos deducir que los archivos tienen dos estados:
Como ya hemos visto
git add → Mueves a Stagedgit commit → Guardas en el historial (Tracked - Unmodified)
git status Es el comando diagnóstico más útil para entender el estado actual del trabajo.
Muestra el estado actual del repositorio, incluyendo:
On branch master nothing to commit, working directory clean Significado:
On branch master Untracked files: (use "git add ..." to include in what will be committed) README nothing added to commit but untracked files present Significado:
Usar git status frecuentemente para:
# Crear archivo nuevo
echo "Contenido" > archivo.txt
# Ver estado
git status # Muestra archivo.txt como "untracked"
# Añadir al control de versiones
git add archivo.txt
git status # Ahora aparece listo para commitEs un archivo de texto que le indica a Git qué archivos o directorios no debe rastrear, evitando que se incluyan accidentalmente en commits.
Para ello, se crea un archivo llamado .gitignore, el cual debemos de editar para añadir los nombres de los ficheros o directorios que se deben de ignorar.
*.swp, *~).node_modules/, __pycache__/)..env, *.key)..gitignore*.log o temp/.! (ej. !config.important).# Ignorar archivos de compilación
*.o
*.a
# Excepción: un archivo específico
!lib.a
# Ignorar directorios
build/
node_modules/
# Ignorar archivos temporales de editores
*~
*.swp
# Ignorar archivos de documentación generada
doc/**/*.pdf Git no ignora archivos ya rastreados. Para eliminarlos del repositorio:
git rm --cached archivo.txt# son comentarios..gitignore deben confirmarse con git add y git commit.git diff Muestra diferencias exactas entre versiones de archivos, permitiendo:
Editaste README.md y lo añadiste al staging (git add)
Luego modificaste CONTRIBUTING.md sin añadirlo
git status
# Cambios para commit:
# (usar "git restore --staged <file>..." para sacar del staging)
# modified: README.md
#
# Cambios no preparados:
# (usar "git add <file>..." para actualizar)
# modified: CONTRIBUTING.mdSirve para ver:
Cambios no preparados en CONTRIBUTING.md:
bash git diff Cambios preparados en el README.md
bash git diff --staged Todos los cambios pendientes:
bash git diff HEADLa salida muestra:
-)+)@@ -65,7 +65,8 @@ branch directly...
Please include a nice description...
if we have to read the whole diff...
-merged in.
+merged in. Also, split your changes...
+longer than a dozen lines.git diff sin parámetros no muestra cambios ya preparados
Para comparar entre commits específicos:
git diff commit1 commit2Alternativa gráfica:
git difftoolPermite eliminar los archivos del respositorio
Para quitar archivos del control de versiones:
git rm archivo.txt # Elimina del repositorio y del sistema de archivos
git commit -m "Eliminado archivo.txt" Si solo borras con rm archivo.txt:
git add archivo.txt #o git rm archivo.txt
git commit# Eliminar directorio y su contenido
git rm -r directorio/
git commit -m "Eliminado directorio/"
# Quitar del repositorio pero mantener local
git rm --cached config.ini
git commit -m "Dejar de trackear config.ini"Si borraste un archivo importante:
git checkout HEAD -- archivo.txt # Recupera la última versión guardadagit status para ver el estado de los borrados--cached es útil para archivos que deben ignorarse (como .env)-f (protección contra pérdidas)Git no rastrea explícitamente cambios de nombre, pero detecta automáticamente renombramientos mediante análisis de contenido. Esto ocurre cuando:
git rm)git add)git mv archivo_viejo archivo_nuevomv archivo_viejo archivo_nuevo # Renombra en disco
git rm archivo_viejo # Elimina el nombre antiguo
git add archivo_nuevo # Añade el nombre nuevomv archivo_viejo archivo_nuevo
git rm archivo_viejo
git add archivo_nuevo# Caso 1: Uso de git mv
git mv README.md LEEME.md
# Caso 2: Proceso manual equivalente
mv guia_usuario.pdf manual.pdf
git rm guia_usuario.pdf
git add manual.pdfVerificación:
git status
# Muestra:
# renamed: README.md -> LEEME.md
# renamed: guia_usuario.pdf -> manual.pdfgit add -A # Detecta automáticamente renombresgit mv -f archivo_viejo archivo_nuevo # Fuerza la deteccióngit logMuestra el historial de commits en orden cronológico inverso (más recientes primero), incluyendo:
Este comando es esencial para auditorías de código, investigación de bugs y comprensión de la evolución del proyecto.
git log -p -3 # Muestra diferencias de los últimos 3 commitsgit log --oneline --graph --allgit log --author="Juan" --since="1 month ago"git log -S"calcularTotal" --stat--since/--until aceptan formatos:"3 days ago""2023-05-01"--grep busca en mensajes de commit (combinar con --all-match para AND lógico)Podemos deshacer acciones que hayamos realizado en git
git commit --amendCuándo usarlo:
Pasos:
# 1. Añade los archivos olvidados (si aplica)
git add archivo_olvidado.py
# 2. Reescribe el commit
git commit --amend
Qué ocurre:
Importante:
Para commits remotos (Ya lo veremos)
--amend en commits ya pusheados (rompe el historial compartido)git revert + nuevo commitgit reset HEADCuándo usarlo:
git addFlujo detallado:
# 1. Ver estado actual
git status # Muestra archivos en staging
# 2. Quitar archivo específico
git reset HEAD archivo_accidental.txt
# Opción alternativa (todos los archivos)
git reset HEAD .Efecto:
Ejemplo:
$ git status
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: script.js # ← Este queremos sacar
$ git reset HEAD script.js
$ git status
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
modified: script.js # ← Ahora está fuera del staginggit checkout -- / git restoreCuándo usarlo:
Comandos equivalentes:
# Forma tradicional (aún válida)
git checkout -- archivo_dañado.html
# Versión moderna (Git 2.23+)
git restore archivo_dañado.htmlAdvertencia crítica:
git stash # Guarda cambios temporalmente
git stash drop # Si decides eliminarlos despuésgit reset --hardEscenario:
Solución:
# 1. Ver historial (copiar hash objetivo)
git log --oneline
# 2. Retroceder (ej: 2 commits)
git reset --hard HEAD~2Efecto:
Git permite etiquetar puntos importantes en el historial
Útil para marcar lanzamientos o hitos relevantes.
Muestra todas las etiquetas en orden alfabético.
git taggit tag -l 'v1.8.5*'git tag nombre_etiquetagit show nombre_etiquetagit tag -d nombre_etiquetaSe usa para conseguir atajos para comandos largos o frecuentes en Git.
Personalizan la CLI para hacerla más eficiente y fácil de usar.
git config --global alias.<nombre-corto> "<comando-original>"git config --global alias.co checkout # git co
git config --global alias.br branch # git br
git config --global alias.ci commit # git ci
git config --global alias.st status # git st# Crear alias para ver historial simplificado
git config --global alias.lg "log --oneline --graph --all"
# Uso:
git lg # Muestra el historial en formato resumido.git config --global --list | grep alias
git init

Podemos hacerlo con el siguiente comando:
git branch -m maingit status
Indica que estamos en la rama "main". Que no se ha confirmado ningún archivo


En este caso, nos indica que hay un archivo nuevo pero que no se ha añadido ni comiteado.
Cuando es así aparece el archivo en rojo
git add git1.py
Ahora vemos que se ha añadido el archivo porque aparece en verde, pero no se ha confirmado, de ahí que aparezca que no hay commits

git commit -m "comentario"
git log
Ahora hay dos versiones

Añade los archivo que quieras dentro de .gitignore
Comprobar .gitignore y añadir al commit

Comprobamos el log

Modifica git1.py

Usa el comando git diff








Puede verse como el archivo vuelve a su estado original:

Los sistemas de control de versiones modernos permiten trabajar con ramas.
Una rama es una línea de desarrollo independiente que surge a partir de la rama principal (generalmente master o main).
En otros sistemas, crear ramas puede ser costoso (requiere copiar todo el código), pero en Git es rápido y eficiente.

Git almacena datos como instantáneas (snapshots) en lugar de diferencias.
Una rama en Git es simplemente un apuntador móvil que señala a un commit específico.
Cada commit guarda:
Rama por defecto: Al inicializar un repositorio (git init), Git crea automáticamente la rama master (o main en repositorios nuevos).
master apunta a ese commit.Git crea un nuevo apuntador que señala al mismo commit actual.
Ejemplo:
git branch testing # Crea la rama "testing" No cambia tu rama actual, solo añade un nuevo puntero.

HEADIndica la rama actual en la que estás trabajando.
git branch solo crea la rama, pero no mueve HEAD (sigues en la misma rama).

Usa git log --oneline --decorate para ver:
HEAD).Ejemplo de salida:
f30ab (HEAD, master, testing) add feature #32
34ac2 fixed bug #1328
98ca9 initial commit Aquí, tanto master como testing apuntan a f30ab, pero HEAD indica que estás en master.
Para moverse a otra rama, se usa:
git checkout <rama> # Ejemplo: `git checkout testing` 
Si se hace un commit, la rama HEAD, avanza sobre la rama en la que nos encontramos, si no hemos hecho ningún cambio, será sobre master o main

Esto mueve el puntero HEAD a la rama especificada.
Después de esto, vemos que la rama testing avanza, mientras que la rama master permanece en la última confirmación creada.
Si volvemos a master con:
git checkout master # Vuelve a `master`
git commit -a -m "otros cambios" # Ahora `master` y `testing` tienen historiales distintos 
Esto produce dos acciones:
Efectos
Es como un "rebobinado" temporal del proyecto
testing)master)testing, solo esa rama avanza; master permanece donde estaba)Implicaciones:
Se usa git log con opciones para ver ramas y divergencias:
git log --oneline --decorate --graph --all * c2b9e (HEAD,master) otros cambios
| * 87ab2 (testing) un cambio
|/
* f30ab commit anterior
* 34ac2
* 98ca9 Git incentiva el uso frecuente de ramas gracias a su rapidez y eficiencia.
git branch: Crear ramas.git checkout: Moverse entre ramas.git commit: Avanzar el historial.git log --graph Visualiza el historial para entender la divergencia.Partimos de un historial lineal con algunos commits en master

Comando rápido para crear y cambiar a la rama iss53:
git checkout -b iss53 # Equivalente a: git branch iss53 + git checkout iss53
Aparece un nuevo puntero iss53 en el mismo commit que master
iss53Realizar cambios y commits:
git commit -a -m 'added a new footer [issue 53]'
La rama iss53 avanza, mientras master se queda atrás
Cambiar a master para resolverlo:
git checkout master # ¡El directorio de trabajo revierte al estado de `master`!Resolver el problema
Crear rama hotfix y solucionar el problema:
git checkout -b hotfix
git commit -a -m 'fixed the broken email address'
La rama hotfix avanza desde master
hotfix en masterFusión rápida (fast-forward):
git checkout master
git merge hotfix # Git mueve `master` al mismo commit que `hotfix`Eliminar hotfix (ya no es necesaria):
git branch -d hotfixRetomar el Trabajo en iss53: Volver a la rama original y continuar:
git checkout iss53
git commit -a -m 'finished the new footer [issue 53]'
iss53 sigue su curso independiente de master
Ejemplo previo: La rama hotfix se fusionó con master mediante un fast-forward, ya que no había divergencias .
Causa:
Modificaciones contradictorias en el mismo archivo en ambas ramas.
Auto-merging index.html
CONFLICT (content): Merge conflict in index.htmlSolución:
git status (archivos marcados como "unmerged").<<<<<<< HEAD:index.html <!-- Versión en master -->
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer"> <!-- Versión en iss53 -->
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html3. Resolver eligiendo un cambio o combinando ambos, eliminando los marcadores.
4. Marcar como resuelto y completar la fusión:
git add index.html # Marca el conflicto como resuelto
git commit # Finaliza el merge commitHerramientas Gráficas para Conflictos
Ejecutar git mergetool para abrir una herramienta visual (ej.: meld, kdiff3).
Tras resolver, Git marca los archivos como "staged" y permite completar el commit.
Eliminar la Rama Fusionada
Una vez fusionado iss53, eliminarla:
git branch -d iss53git branchMuestra todas las ramas locales.
El asterisco (*) indica la rama actual (donde está HEAD).
git branch -vEjemplo de salida:
iss53 93b412c fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 add scott to the author listRamas ya fusionadas con la rama actual:
git branch --mergediss53 ya fusionada).Ramas con trabajo no fusionado:
git branch --no-mergedgit branch -d para evitar pérdida de cambios.Eliminar ramas fusionadas (seguro):
git branch -d iss53 # Elimina solo si está fusionadaForzar eliminación (pérdida de cambios):
git branch -D testing # Ignora advertenciasMantener limpio el repositorio:
Verificar estado antes de eliminar:
--merged/--no-merged para evitar errores.git branch -v2. Filtrar no fusionadas:
git branch --no-merged3. Eliminar rama segura:
git branch -d iss534. Forzar eliminación si es necesario:
git branch -D testingTrabajo inicial:
main o master).Nueva funcionalidad:
git branch nueva-funcionalidad
git checkout nueva-funcionalidadProblema crítico:
Manejo del bug:
git checkout maingit checkout -b hotfix-buggit commit -m "Solución al bug crítico"Fusión:
git checkout main
git merge hotfix-bugRetomar el trabajo:
git checkout nueva-funcionalidadAislamiento de cambios:
Respuesta rápida a problemas:
Organización clara:
Colaboración: Necesario para trabajar en equipo, evitando confusiones al compartir cambios directamente entre individuos.
Acceso permanente: Permite a colaboradores acceder al código incluso cuando tu computadora está offline.
No tiene directorio de trabajo (solo contiene datos internos de Git, equivalentes al directorio .git).
Funciona como punto centralizado para push y pull (subir y descargar del repositorio)
Sistemas de archivos compartidos (ej: NFS o mismo equipo).
git clone /opt/git/project.git # Sin prefijo (usa hardlinks)
git clone file:///opt/git/project.git # Con prefijo (más lento)Ventajas:
Desventajas:
Conexión segura a servidores remotos mediante SSH (el más común para repositorios privados).
git clone ssh://user@server:/ruta/project.git # Formato explícito
git clone user@server:/ruta/project.git # Formato abreviado Ventajas:
Desventajas:
Ideal para repositorios públicos o con autenticación básica (ej: GitHub, GitLab).
git clone http://example.com/ruta/project.git # Sin encriptar
git clone https://example.com/ruta/project.git # Con encriptación SSL Ventajas:
Desventajas:
GitHub es una plataforma de desarrollo colaborativo en la nube que permite gestionar proyectos de software utilizando Git. Ofrece herramientas para:
Enlace: https://github.com/
GitHub modificó el nombre predeterminado de la rama principal de master a main como parte de una iniciativa para promover un lenguaje más inclusivo.
Motivación: Evitar connotaciones negativas asociadas a "master" (en contextos históricos de esclavitud).
Impacto: Otras plataformas también adoptaron términos neutrales, aunque Git internamente aún usa "master" en algunos comandos.
Antes de empezar, es necesario crear un repositorio (local o remoto en GitHub) para gestionar el código.
Usaremos VS Code para trabajar con GitHub.
Repositorios públicos o privados
Configuración Inicial del Repositorio
Tres elementos clave al crear un repositorio en GitHub:
README.md.md). Se muestra automáticamente en la página del repositorio..gitignoreEn este caso, se configurará el repositorio con:
README.md básico (formato Markdown)..gitignore para excluir archivos generados automáticamente (ej: node_modules/, .env).

1. Crear el archivo README.md
echo "# cursoGit" >> README.mdCrea un archivo README.md con el texto # cursoGit (formato Markdown).
2. Inicializar el repositorio Git
git initCrea un directorio oculto .git con la estructura necesaria para el control de versiones.
3. Agregar el README al área de staging
git add README.mdPrepara el archivo para ser incluido en el primer commit.
4. Realizar el primer commit
git commit -m "first commit"Guarda los cambios en el historial del repositorio con un mensaje descriptivo.
5. Renombrar la rama principal a main (opcional)
git branch -M mainCambia el nombre de la rama predeterminada de master a main (práctica recomendada).
6. Vincular el repositorio local con GitHub
git remote add origin https://github.com/martin2745/cursoGit.gitAsocia el repositorio local con el remoto usando el alias origin (nombre convencional).
7. Subir cambios al repositorio remoto
git push -u origin mainEnvía los commits a GitHub y establece main como rama predeterminada para futuros push.
origin: Es el nombre por defecto que Git asigna al repositorio remoto. Simplifica futuros comandos como git push o git pull.git branch -d nombreRamaNota: Estos pasos son esenciales para comenzar un proyecto bajo control de versiones y colaborar mediante GitHub. La opción
-uengit pushevita especificar la rama remota en futuras actualizaciones.


Wiki vs README:
README.md es la carta de presentación del repositorio.Estas herramientas facilitan la colaboración, automatización y mantenimiento de proyectos en GitHub. La pestaña Settings es crítica para gestionar permisos y seguridad.

git clone https://github.com/usuario/repositorio.gitgit clone git@github.com:usuario/repositorio.gitgit pull.Clic en "Commits" en la interfaz de GitHub.

Vamos a modificar README.md y después hacemos un commit


Ahora tenemos dos commits

Es importante mencionar que estas modificaciones tenemos que añadirlas a nuestro repositorio local ya que en este momento solo existe en remoto.
Para ello empleamos el comando:
git pull
git diff).git fetch <remoto> <rama><remoto>: Nombre del repositorio remoto (usualmente origin).<rama>: Rama específica a descargar (opcional).Ejemplos:
Descargar todos los cambios del remoto:
git fetch originDescargar cambios de una rama específica (ej: main):
git fetch origin mainDescarga los últimos cambios del repositorio remoto y los fusiona con tu rama local.
git pull <remoto> <rama><remoto>: Generalmente origin (el nombre por defecto del repositorio remoto).<rama>: La rama que quieres actualizar (ej: main, develop).Ejemplo
git pull origin mainmain del remoto origin y los fusiona con tu rama local actual.Opciones:
Sube tus commits locales al repositorio remoto.
git push <remoto> <rama><remoto>: Normalmente origin.<rama>: La rama que quieres subir (ej: main, feature/login).Ejemplo
git push origin mainmain al repositorio remoto (origin).Opciones:
1. Antes de trabajar:
git pull origin main # Actualiza tu repositorio local.2. Después de hacer cambios:
git add . # Añade los cambios al staging.
git commit -m "Mensaje" # Crea un commit.
git push origin main # Sube los cambios al remoto.❌ ! [rejected] main -> main (non-fast-forward)
git pull origin main # Fusiona los cambios primero.
git push origin main # Vuelve a intentar el push.❌ fatal: The current branch has no upstream branch
git push -u origin main # Establece upstream.git pull → Actualiza tu repositorio local con cambios remotos.git push → Envía tus cambios locales al repositorio remoto.git fetch → Ideal para flujos de trabajo colaborativos donde la revisión de código es fundamental.pull antes de push para evitar conflictos.Si trabajas en equipo, evita --force para no romper el historial de tus compañeros.
Puedes clonar un repositorio con git clone [url]:
git clone git://github.com/schacon/grit.gitEsto crea un directorio llamado "grit", inicializa un directorio .git en su interior, descarga toda la información de ese repositorio, y saca una copia de trabajo de la última versión.
Si quieres clonar el repositorio a un directorio con otro nombre que no sea grit, puedes especificarlo con la siguiente opción de línea de comandos:
git clone git://github.com/schacon/grit.git mygritObjetivo: Practicar comandos básicos de Git (clone, add, commit, push, pull, fetch) y familiarizarte con GitHub.
mi-primer-proyecto.git clone https://github.com/tu-usuario/mi-primer-proyecto.git
cd mi-primer-proyectoCrea un archivo hola-mundo.txt:
echo "¡Hola, GitHub!" > hola-mundo.txtAñádelo al área de staging y haz un commit:
git add hola-mundo.txt
git commit -m "Añadir archivo de saludo"Súbelo a GitHub:
git push origin mainREADME.md directamente en GitHub (añade una línea como ## Este es mi primer proyecto).Descarga los cambios remotos (sin fusionar aún):
git fetch originCompara diferencias entre tu rama local y la remota:
git diff main origin/mainFusiona los cambios en tu repositorio local:
git pull origin mainEdita localmente el README.md (añade algo como ### Hecho desde mi computadora).
Haz commit:
git add README.md
git commit -m "Editar README localmente"Antes de hacer push, edita el mismo archivo desde GitHub (cambia la misma línea).
Intenta hacer git push origin main. Verás un error.
Resuelve el conflicto:
git pull origin main # Fusiona los cambios y marca conflictos.
# Edita README.md manualmente (elimina marcas de conflicto <<<<<<<).
git add README.md
git commit -m "Resolver conflicto en README"
git push origin mainCrea una rama nueva:
git checkout -b nueva-ramaAñade un archivo contribucion.txt y haz push de la rama:
git push origin nueva-rama
Control de versiones