Este post incluye una lista de comandos básicos de Git, validos para cualquier implementación del famoso VCS. Se recomienda una revisión más exhaustiva de los mismos en caso de necesitarlo. Se puede encontrar más información en:
Algunos de los comandos más usados son los siguiente:
Git config
Configuración de la herramienta Git (i.e. identificación de usuario). Más info en https://git-scm.com/book/es/v1/Empezando-Configurando-Git-por-primera-vez
1 2 |
$ git config --global user.name "Pepe Perez" $ git config --global user.email peperez@foo.com |
Git SSH keys generation
Generación de clave pública para conexión a Git via SSH. Recomendable para no tener que introducir usuario y password con cada operación remota.
1 |
$ ssh-keygen -t rsa -C "peperez@foo.com" |
Clone the repo
Clona el repositorio remoto en el local y actualiza el workspace.
1 |
$ git clone <http url/ssh url> |
Update working copy
Descarga el contenido del repositorio remoto al local y actualiza el workspace (necesita la operación de clonación anterior para inicializar los repositorios locales).
1 |
$ git pull |
Update local repository but not working copy
Actualiza repositorios locales con el contenido remoto pero no modifica la copia local.
1 |
$ git fetch |
Check working copy status
Revisa el estado del workspace en relación al contenido del repositorio local.
1 |
$ git status |
Check local branches
Lista las ramas del repositorio local.
1 |
$ git branch |
Upload a modification
Añade una modificación al repositorio local y remoto.
1. Añade las modificaciones al stage
1 |
$ git add <file_names> |
2. Comitea al repositorio local
1 |
$ git commit -m “Commit message” |
3. Subo al repositorio remoto
1 |
$ git push origin <branch> |
Show commit history
Muestra el histórico de commits locales.
1 |
$ git log [-n <num_logs>] |
Show latest commit history
Muestra los datos del último commit local.
1 |
$ git show |
Show differences
Muestra diferencias entre:
- Commits locales
1 |
$ git diff HEAD~2..HEAD |
- Commits y ficheros
1 |
$ git diff HEAD myfile.txt |
- Ramas locales
1 |
$ git diff <branch|tag> |
- Stagged changes (compara stagged files con committed files)
1 |
$ git diff --staged |
Undo working copy changes (checkout local repo HEAD)
Descarga ultima modificación de la rama actual para el fichero indicado, sobreescribiendo los cambios locales.
1 |
$ git checkout -- <file> |
Reset a stage (reverse git add operation)
Resetea los cambios locales aplicados al fichero en cuestion, volviendo al estado comiteado en el repositorio local.
1 |
$ git reset <file> |
Revert a commit (revert git add and git commit operations)
Revierte un commit local, creando otro nuevo con los estados anteriores.
1 2 |
$ git revert <commit_id> (get commit id using git show or git log) $ git revert HEAD |
Stash changes
Almacena cambios en un stash para posterior uso.
Crea un stash
1 |
$ git stash |
Lista stashes actuales
1 |
$ git stash list |
Muestra el contenido de un stash
1 |
$ git stash show [stash] |
Aplica el stash en la rama actual
1 |
$ git stash apply [stash] |
- Stash can be referred using indexes as: stash@{0,1,2,etc}: Use list to view them
Borra todos los stash locales
1 |
$ git stash clear |
Y otros muchos comandos relacionados con los stashes que se pueden consultar aqui:
https://git-scm.com/docs/git-stash
Create a new branch (create if not exists)
Crea una nueva rama si no existe y cambia a ella.
1 |
$ git checkout -b develop |
Create a new branch, but do not change
Crea una nueva rama en el repo local pero no cambia a ella.
1 |
$ git branch develop |
Checkout to a branch
Cambia a una rama ya existente.
1 |
$ git checkout develop |
Merge a branch
Mergea ramas y/o tags.
Mergea a la rama actual y aplica fast-forward, es decir, no creará ningún nuevo commit, simplemente apuntara la rama actual al commit mergeado, si es posible.
1 |
$ git merge <branch> |
Mergea pero sin fast-forward, es decir, crear un nuevo commit para el merge (recomendable).
1 |
$ git merge <branch> --no-ff |
Delete a branch
Borra una rama del repositorio local.
1 |
$ git checkout -d <branch> |
Create a tag
Creación de tags.
Lista los tags existentes.
1 |
$ git tag |
Crea el trag 1.0 con el contenido del HEAD, el commit o la rama indicados.
1 |
$ git tag 1.0 <HEAD|commit_id|<branch>> |
Crea un tag anotado (por defecto son light-weight).
1 |
$ git tag –a 1.0 <HEAD|commit_id|<branch>> -m <message> |
Sube el tag al repositorio remoto.
1 |
$ git push origin <tag> |
Rebase
Es un mecanismo para realizar un merge, alternativo al anterior aunque más potente pero a su vez más sutil y peligroso.
El peligro viene a la hora de hacer rebase de ramas en el repositorio remoto. Esto puede generar confusión a la hora de crear nuevos commits asi como revertir cambios, etc. Por lo tanto, la recomendación es solo usar rebase en commits que se encuentren uicamente en el repositorio local.
Se basa en los siguiente: al hacer un rebase de una rama sobre otra, lo que se hace es aplicar los commits de la rama que se rebasa en la rama actual, en orden de aparición, respetando los commits de la rama original.
Por ejemplo, si disponemos de dos ramas, master y develop, con cambios diferentes, y ejecutamos lo siguiente:
1 2 |
$ git checkout develop $ git rebase master |
Aplicamos los commits de la rama master directamente a la rama develop, en el orden en el que aparecen en la master.
También se puede hacer el rebase sin hacer el checkout de la rama que va a rebasar, haciendo:
1 2 3 |
$ git rebase <base_branch> <topic_branch> $ git rebase master develop |
Si las ramas no tienen el mismo origen, por ejemplo si se quiere rebasar una rama de feature con la rama de develop y ésta no surgió de la de develop si no de otra rama de feature, podemos hacer:
1 |
$ git rebase --onto develop feature01 feature02 |
Se haría el rebase de feature02 sobre develop con los commits de feature02 pero sin los de feature01.
Rebase vs Merge
La idea del merge es que aparezcan reflejados en la historia del repositorio todos los cambios realizados en y entre las ramas, mientras que con el rebase se podria modificar esa historia para que aparezcan ciertos commits en ramas que no se hicieron. La filosofia es diferente, con merge se ve lo que paso explicitamente mientras que rebase permite modificar esa historia para que refleje los cambios que se deseen. Un uso recomendado seria aplicar rebase en el repositorio local para aquello cambios aun no compartidos con el objetivo de limpiar la historia local, antes de compartirlos.
Cherry-pick
Aplica cambios de commits concretos a la rama actual:
1 |
$ git cherry-pick <commit_id> |
Se pueden escoger multiples commits. Cada commit creara un nuevo commit en la rama actual.
Search for text
Buscador de texto desde Git.
1 |
$ git grep "<text>" |
Herramienta gráfica sencilla
1 |
$ gitk & |