Github

Git Commands

Qué es GitHub?

Fundamentos

Github es una plataforma de desarrollo colaborativo y un sistema de control de versiones de proyectos y sus archivos.

El sistema de control de versiones es una herramienta que rastrea cada modificación en el código, creando un historial completo del proyecto. Se tiene la posibilidad de volver atrás a versiones preliminares.

Git (sistema de control, Git) difiere de la plataforma (GitHub) en aspectos como:

  • Git
    • Sistema de control de versiones distribuido (software)
    • Funciona de manera local en tu computadora
    • Es una herramienta de línea de comandos
    • Es gratuito y de código abierto Creado por Linus Torvalds en 2005
    • Permite rastrear cambios, crear ramas, fusionar código
    • Funciona sin conexión a internet No requiere cuenta ni registro
  • GitHub
    • Plataforma web para alojar repositorios Git

    • Funciona en la nube (repositorios remotos)

    • Tiene interfaz gráfica web

    • Ofrece planes gratuitos y de pago

    • Fundado en 2008, comprado por Microsoft en 2018

    • Agrega funcionalidades colaborativas: pull requests, issues, code review, GitHub Actions, wikis, etc.

    • Requiere conexión a internet .Necesitas crear una cuenta

A brief introduction to Git for beginners | GitHub

Configuración

Recursos de ayuda

Banco Interamericano de Desarollo Code4Dev: ¿Cómo optimizar tu repositorio de código abierto con Git y GitHub?

Definiciones

Puede encontrar un glosario oficial aquí.

Repositorios

¿Qué es un repositorio? Un repositorio es un proyecto que contiene archivos y carpetas. Un repositorio registra las versiones de archivos y carpetas. Para más información, consulta “Acerca de los repositorios” en la documentación de GitHub.

Repositorio local: Es un directorio local que contiene los archivos de código del proyecto.

Repositorio remoto: Es una versión en línea del repositorio local alojada en servicios como GitHub, GitLab y BitBucket.

Medium. What is git commit, push, pull, log, aliases, fetch, config & clone.

Clonación (clone): Es la acción de crear un clon o copia de un repositorio en un nuevo directorio sea local o en la nube.

Confirmación (Commit): Es una instantánea de los cambios del proyecto en preparación.

  • Guarda los cambios realizados en los archivos del proyecto.
  • Incluye un mensaje descriptivo que explica qué cambios se hicieron y por qué
  • Tiene un identificador único (hash)
  • Registra quién hizo los cambios y cuándo

Confirmar y subir/enviar (Commit and push): Es el proceso de guardar los cambios locales mediante un commit y luego enviarlos (push) al repositorio remoto para compartirlos con otros colaboradores o publicarlos como página web.

  • De forma similar a guardar un archivo editado, una confirmación registra los cambios en uno o más archivos de tu rama. Git asigna a cada confirmación un ID único, llamado SHA o hash, que identifica:

    • Los cambios específicos

    • Cuando se hicieron los cambios

    • Quién creó los cambios

Rama (Branch): Una rama es una versión paralela de tu repositorio. Por defecto, tu repositorio tiene una rama con nombre main, que se considera la rama definitiva. Crear ramas adicionales te permite copiar la mainrama de tu repositorio y realizar cambios de forma segura sin interrumpir el proyecto principal. Muchas personas usan ramas para trabajar en funciones específicas sin afectar a otras partes del proyecto. Los cambios (commits) deben aprobarse por el administrador del repositorio o del proyecto a través de un pull request.

  • Las solicitudes de cambiosson propuestas para combinar los cambios de código en un proyecto. Una “pull request” es la característica de colaboración fundamental de GitHub, que le permite discutir y revisar los cambios antes de fusionarlos. Esto ayuda a los equipos a trabajar juntos, detectar problemas al principio y mantener la calidad del código.

  • Fusión en Git (Git merge): El proceso de combinar dos ramas en Git. Una fusión añade los cambios de la solicitud de extracción y la rama a la mainrama. Para más información sobre las fusiones, consulta ” Fusionar una solicitud de extracción “.

¿Qué es un pull request?: La colaboración se lleva a cabo en una solicitud de extracción . Esta solicitud muestra los cambios en tu rama a otras personas y permite aceptarlos, rechazarlos o sugerir cambios adicionales. En una comparación, esta solicitud conservará los cambios que acabas de realizar en tu rama y propondrá su aplicación a la mainrama del proyecto. Para más información sobre las solicitudes de extracción, consulta “Acerca de pull request”.

Archivo .gitignore: Es un archivo que especifica los archivos no rastreados intencionalmente que Git debe ignorar.

Área de preparación: Una caché que contiene los cambios que se incluirán en la próxima confirmación.

Almacenamiento temporal de Git: Otro tipo de caché que contiene cambios no deseados a los que quizás quieras volver más adelante.

HEAD (siempre en mayúsculas): un nombre de referencia para la última confirmación, para evitar que tenga que escribir los identificadores de las confirmaciones.

Comandos comunes de Git usados en distintas situaciones

Important

Iniciar un área de trabajo
(ver también: git help tutorial)

  • git clone
    Clona un repositorio en un nuevo directorio.

  • git init
    Crea un repositorio Git vacío o reinicializa uno existente.

Trabajar sobre el cambio actual
(ver también: git help everyday)

  • git add
    Añade el contenido de archivos al índice (staging area).

  • git mv
    Mueve o renombra un archivo, un directorio o un enlace simbólico.

  • git restore
    Restaura archivos del árbol de trabajo.

  • git rm
    Elimina archivos del árbol de trabajo y del índice.

Examinar el historial y el estado
(ver también: git help revisions)

  • git bisect
    Usa búsqueda binaria para encontrar el commit que introdujo un error.

  • git diff
    Muestra los cambios entre commits, entre un commit y el árbol de trabajo, etc.

  • git grep
    Imprime las líneas que coinciden con un patrón.

  • git log
    Muestra el historial de commits.

  • git show
    Muestra distintos tipos de objetos.

  • git status
    Muestra el estado del árbol de trabajo.

Hacer crecer, marcar y ajustar el historial común

  • git backfill
    Descarga objetos faltantes en un clon parcial.

  • git branch
    Lista, crea o elimina ramas.

  • git commit
    Registra cambios en el repositorio.

  • git merge
    Une dos o más historiales de desarrollo.

  • git rebase
    Reaplica commits sobre la punta de otra base.

  • git reset
    Restablece el HEAD actual al estado especificado.

  • git switch
    Cambia entre ramas.

  • git tag
    Crea, lista, elimina o verifica una etiqueta firmada con GPG.

Colaborar
(ver también: git help workflows)

  • git fetch
    Descarga objetos y referencias desde otro repositorio.

  • git pull
    Obtiene cambios e integra desde otro repositorio o una rama local.

  • git push
    Actualiza referencias remotas junto con los objetos asociados.

Comandos de Git por nivel de dificultad

Nivel básico

Configuración inicial

#Instalarlo con Homebrew
instalar el GitHub CLI primero. Voy a instalarlo usando Homebrew.
`brew install gh`
`gh auth login` para autenticarse
# Configurar nombre y email
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"

# Ver configuración
git config --list

Crear y clonar repositorios

# Inicializar repositorio
git init

# Clonar repositorio
git clone https://github.com/usuario/repositorio.git

# Clonar con nombre específico
git clone https://github.com/usuario/repositorio.git mi-proyecto

Comandos esenciales

# Ver estado
git status

# Agregar archivos
git add archivo.txt
git add .  # Agregar todos

# Hacer commit
git commit -m "Mensaje descriptivo"

# Ver historial
git log
git log --oneline --graph

Trabajar con remotos

# Ver remotos
git remote -v

# Agregar remoto
git remote add origin https://github.com/usuario/repo.git

# Push
git push origin main

# Pull
git pull origin main

Nivel intermedio

Branching (Ramificación)

Crear y cambiar ramas

# Crear rama
git branch nombre-rama

# Cambiar a rama
git checkout nombre-rama

# Crear y cambiar en un comando
git checkout -b nueva-rama

# Cambiar de rama (forma moderna)
git switch nombre-rama
git switch -c nueva-rama  # Crear y cambiar

Fusionar ramas

# Fusionar rama en la actual
git merge nombre-rama

# Fusionar con squash (combinar commits)
git merge --squash nombre-rama

# Abortar merge conflictivo
git merge --abort

Eliminar ramas

# Eliminar rama local
git branch -d nombre-rama  # Solo si está fusionada
git branch -D nombre-rama  # Forzar eliminación

# Eliminar rama remota
git push origin --delete nombre-rama

Manejo de conflictos

# Ver archivos con conflictos
git status

# Después de resolver manualmente
git add archivo-resuelto.txt
git commit -m "Resolver conflicto"

# Usar herramienta de merge
git mergetool

Rebase interactivo

# Rebase interactivo de últimos 3 commits
git rebase -i HEAD~3

# Rebase sobre otra rama
git rebase main

# Continuar después de resolver conflictos
git rebase --continue

# Abortar rebase
git rebase --abort

Stash (Guardar cambios temporalmente)

# Guardar cambios
git stash
git stash save "Mensaje descriptivo"

# Ver stashes guardados
git stash list

# Aplicar último stash
git stash apply
git stash pop  # Aplicar y eliminar

# Aplicar stash específico
git stash apply stash@{2}

# Eliminar stash
git stash drop stash@{0}
git stash clear  # Eliminar todos

Cherry-pick (Seleccionar commits específicos)

# Aplicar commit específico a rama actual
git cherry-pick abc123

# Cherry-pick múltiples commits
git cherry-pick abc123 def456

# Cherry-pick sin hacer commit automático
git cherry-pick -n abc123

Tags (Etiquetas)

# Crear tag
git tag v1.0.0
git tag -a v1.0.0 -m "Versión 1.0.0"

# Ver tags
git tag
git tag -l "v1.*"

# Push tags
git push origin v1.0.0
git push origin --tags  # Push todos los tags

# Eliminar tag
git tag -d v1.0.0
git push origin --delete v1.0.0

Comandos útiles avanzados

Git reflog (Recuperar commits)

# Ver historial de referencias
git reflog

# Recuperar commit perdido
git checkout abc123
git reset --hard abc123

Git diff avanzado

# Diferencias entre ramas
git diff main..feature

# Diferencias de archivos específicos
git diff HEAD -- archivo.txt

# Diferencias con estadísticas
git diff --stat

Git reset y revert

# Deshacer último commit (mantener cambios)
git reset --soft HEAD~1

# Deshacer último commit (descartar cambios)
git reset --hard HEAD~1

# Revertir commit creando nuevo commit
git revert abc123

GitHub CLI (gh)

# Instalar GitHub CLI
# macOS: brew install gh
# Windows: winget install GitHub.cli

# Login
gh auth login

# Crear repositorio
gh repo create nombre-repo --public

# Crear PR
gh pr create --title "Nueva feature" --body "Descripción"

# Ver PRs
gh pr list
gh pr view 123

# Clonar repos
gh repo clone usuario/repositorio

GitHub Actions básico

# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      - name: Install dependencies
        run: |
          pip install -r requirements.txt
      - name: Run tests
        run: pytest

Trabajo colaborativo

Pull Requests

# Crear rama para feature
git checkout -b feature/nueva-funcionalidad

# Hacer cambios y commits
git add .
git commit -m "Agregar nueva funcionalidad"

# Push de la rama
git push origin feature/nueva-funcionalidad

# Luego crear PR en GitHub web o con gh cli
gh pr create

Code Review

# Ver cambios de PR
gh pr checkout 123
gh pr diff 123

# Comentar en PR
gh pr comment 123 --body "Se ve bien!"

# Aprobar PR
gh pr review 123 --approve

# Mergear PR
gh pr merge 123

.gitignore avanzado

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/

# IDEs
.vscode/
.idea/
*.swp

# OS
.DS_Store
Thumbs.db

# Logs
*.log
logs/

# Environment variables
.env
.env.local

# Build
dist/
build/
*.egg-info/

GitHub Pages

# Crear rama gh-pages
git checkout --orphan gh-pages

# Agregar contenido
git add .
git commit -m "Initial GitHub Pages"

# Push
git push origin gh-pages

# Configurar en Settings → Pages

Otros temas

Videos tutoriales recomendados

Nivel básico

  • Git and GitHub for Beginners - freeCodeCamp.org Link
  • Git Tutorial for Beginners - Programming with Mosh Link

Nivel intermedio

  • Git Branching and Merging - Traversy Media Link
  • Advanced Git Tutorial - Academind Link
  • Git Rebase vs Merge - DevTips Link

GitHub específico

  • GitHub Actions Tutorial - TechWorld with Nana Link
  • Pull Requests Explained - Fireship Link

Proyectos destacados en GitHub

Recursos de aprendizaje

  • first-contributions - Guía para tu primera contribución Link
  • github-cheat-sheet - Trucos y comandos útiles Link
  • awesome-github - Lista curada de recursos GitHub Link

Herramientas Git/GitHub

  • git-extras - Comandos extra para Git Link
  • hub - Extensión de línea de comandos para GitHub Link
  • gitignore.io - Generador de .gitignore Link

GitHub Actions

  • awesome-actions - Lista de GitHub Actions Link
  • actions-toolkit - Toolkit para crear Actions Link

Automatización y CI/CD

  • pre-commit - Framework para git hooks Link
  • semantic-release - Versionado semántico automático Link
  • release-drafter - Automatizar release notes Link

Perfiles y documentación

  • github-profile-readme-generator - Generador de README perfil Link
  • awesome-readme - Ejemplos de READMEs increíbles Link
  • shields - Badges para repositorios Link

GitHub Copilot

  • What is GitHub Copilot?. Link
  • GitHub Copilot Documentation. Link

Recursos adicionales

  • Pro Git Book (gratuito). Link
  • GitHub Learning Lab. Link
  • GitHub Student Developer Pack. Link
  • Conventional Commits. Link