Git y GitHub Tema 2
Los comandos básicos
Con cinco comandos se hace casi todo el trabajo de cada día. Esta es la tabla que tienes que tener a mano. Después, cómo conectar tu proyecto con GitHub y trabajar desde dos ordenadores.
Los cinco imprescindibles#
| Comando | Qué hace | |
|---|---|---|
| ★ | git pull origin main | Trae de GitHub los cambios que no tienes y los junta con los tuyos |
| ★ | git add . | Prepara todos tus cambios para el próximo commit (el punto significa «todo») |
| ★ | git commit -m "mensaje" | Guarda lo preparado en el historial, con un mensaje que explica qué has hecho |
| ★ | git push origin main | Sube tus commits a GitHub |
| ★ | git status | Te dice cómo estás: qué archivos han cambiado y cuáles están preparados |
origin es tu repositorio de GitHub y main, la rama principal (las ramas, en el tema avanzado).
El ciclo de cada día#
git pull origin main # 1. antes de empezar
# ... trabajas en tu código ...
git add . # 2. preparar
git commit -m "Añade el menú lateral" # 3. guardar
git push origin main # 4. subirImportante
La regla de oro: git pull antes de empezar a trabajar y antes de hacer push. Así siempre partes de lo último, y te ahorras casi todos los problemas.
Empezar un proyecto con GitHub#
GitHub guarda una copia de tu repositorio en la nube: una copia de seguridad, y la forma de trabajar un día en el aula y otro en casa con el mismo proyecto. Para conectar un proyecto con GitHub hay dos caminos, según cómo empieces.
Si el proyecto aún no existe: clonar#
- En GitHub, pulsa New (o el + de arriba a la derecha → New repository).
- Escribe el nombre, elige Public o Private y marca Add a README file.
- Pulsa Create repository, y después el botón verde Code: copia la dirección que empieza por
https://. - En la terminal, en la carpeta donde quieras el proyecto:
git clone https://github.com/ana/mi-proyecto.gitSe crea la carpeta mi-proyecto, ya conectada con GitHub. Ábrela en VS Code y a trabajar: pull, add, commit y push funcionan desde el primer momento.
Si ya tienes el proyecto en tu ordenador: conectarlo#
- En GitHub, crea el repositorio como antes, pero sin marcar Add a README file: tiene que estar vacío.
- En la terminal, dentro de la carpeta de tu proyecto:
git init
git add .
git commit -m "Primer commit"
git remote add origin https://github.com/ana/mi-proyecto.git
git push -u origin main| Comando | Qué hace |
|---|---|
git init | Convierte la carpeta en un repositorio |
git remote add origin <url> | Le dice a Git dónde está tu repositorio de GitHub, y le pone de nombre origin |
git push -u origin main | Sube la rama main. La -u la deja enlazada: a partir de ahora basta con git push y git pull |
Bajar y subir: pull, push y fetch#
| Comando | Dirección | Qué hace |
|---|---|---|
git push origin main | Tu ordenador → GitHub | Sube tus commits |
git pull origin main | GitHub → tu ordenador | Trae los commits que no tienes y los junta con tu trabajo |
git fetch origin | GitHub → tu ordenador | Solo mira si hay cambios nuevos, sin tocar tus archivos |
Trabajar en dos ordenadores#
El caso típico: trabajas en el aula, subes, y en casa sigues donde lo dejaste.
| Dónde | Qué haces |
|---|---|
| En casa, la primera vez | git clone <url> para tener el proyecto |
| Al empezar, en cualquier sitio | git pull origin main, para traer lo que hiciste en el otro ordenador |
| Al terminar, en cualquier sitio | git add ., git commit -m "…" y git push origin main, para dejarlo en GitHub |
Si se te olvida el pull del principio y GitHub tiene commits que tú no, el push se rechaza:
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/ana/mi-proyecto.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.No se ha perdido nada. La solución es la que dice el propio mensaje: git pull origin main y otra vez git push origin main. Si los dos ordenadores cambiaron las mismas líneas del mismo archivo, el pull avisará de un conflicto: lo tienes en el tema avanzado.
Otros comandos útiles#
| Comando | Qué hace |
|---|---|
git clone <url> | Descarga un repositorio de GitHub a tu ordenador (más arriba) |
git log --oneline | El historial de commits, uno por línea |
git diff | Las líneas que has cambiado y aún no has preparado |
git restore <archivo> | Deshace los cambios de un archivo que aún no has preparado. Cuidado: esos cambios se pierden |
git restore --staged <archivo> | Saca un archivo de «preparados», sin perder los cambios |
Donde pone <url> o <archivo>, se escribe su valor, sin los < >: git restore App.java.
Así se ve en la terminal#
Un proyecto nuevo con un App.java. Primero, git status avisa de que hay un archivo que Git todavía no vigila:
git statusOn branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
App.java
nothing added to commit but untracked files present (use "git add" to track)Se prepara y se guarda:
git add .
git commit -m "Primer commit"[main (root-commit) e8b9f0f] Primer commit
1 file changed, 1 insertion(+)
create mode 100644 App.javae8b9f0f es el código del commit: cada uno tiene el suyo. Y si no queda nada por guardar, git status lo dice así:
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree cleanBuenos mensajes de commit#
El mensaje es para tu yo del futuro (y para tu equipo): tiene que decir qué cambiaste.
| Mal | Bien |
|---|---|
cambios | Añade el formulario de nuevo alumno |
arreglado | Corrige el total cuando la lista está vacía |
asdf | Cambia el color del botón Guardar |
todo (un commit al final del día con todo) | Un commit por cada cosa terminada |
Desde VS Code#
VS Code tiene todo esto en la pestaña Control de código fuente (el icono de las ramitas, a la izquierda, o Ctrl + Shift + G):
| Comando | En VS Code |
|---|---|
git status | La lista de Cambios: cada archivo modificado, con una letra (U nuevo, M modificado, D borrado) |
git add | El + al lado de cada archivo, o al lado de «Cambios» para todos |
git commit -m "…" | Escribir el mensaje en el cuadro de arriba y pulsar Confirmar (Commit) |
git pull y git push | El botón Sincronizar cambios (Sync Changes), que hace los dos |
Consejo
Aprende los comandos aunque luego uses los botones: cuando algo falla, el mensaje de error habla de pull, push y commit, y con los comandos sabes qué ha pasado.
Consejo
Si prefieres no usar la terminal, en VS Code también puedes subir una carpeta a GitHub: en Control de código fuente, botón Publicar en GitHub (Publish to GitHub).
Errores frecuentes#
| Mensaje | Qué significa | Cómo se arregla |
|---|---|---|
fatal: not a git repository | La terminal no está en la carpeta del proyecto, o la carpeta no es un repositorio | Abre en VS Code la carpeta del proyecto, o haz git init si es nuevo |
nothing added to commit but untracked files present | Has hecho commit sin add: no había nada preparado | Haz git add . antes del commit |
nothing to commit, working tree clean | No es un error: no has cambiado nada desde el último commit | Nada: ya está todo guardado |
Author identity unknown | Git no sabe quién eres | Configura tu nombre y correo: Preparar el ordenador |
error: src refspec main does not match any | Intentas subir la rama main, pero tu rama se llama master, o aún no has hecho ningún commit | Haz un commit primero. Si la rama es master, cámbiale el nombre con git branch -m main |
! [rejected] main -> main (fetch first) | GitHub tiene commits que tú no tienes | git pull origin main y luego git push origin main |
error: remote origin already exists. | El repositorio ya estaba conectado con GitHub | No hace falta volver a hacer remote add. Para ver a dónde apunta: git remote -v |
Repository not found | La dirección está mal escrita, o el repositorio es privado y tu cuenta no tiene acceso | Copia otra vez la dirección del botón Code de GitHub |
fatal: Need to specify how to reconcile divergent branches | Git no sabe cómo juntar tus cambios con los de GitHub | Ejecuta una vez git config --global pull.rebase false y repite el pull |