algunos comandos útiles para git

Hace ya tiempo vengo coleccionando algunos comandos útiles para Git, así que he decidido tenerlos por aquí para no olvidarme. Además haciendo una pequeña búsqueda buscando consejos sobre Git interesantes, como este post. Por ello vamos a escribir algunos consejos/trucos/comandos sobre Git.

Comprobar los merges

Si normalmente trabajamos con “una rama por tarea” o con varias ramas a la vez podemos tener el repositorio bastante “sucio”. Así que lo mejor es de vez en cuando limpiarlo.
¿Como saber que rama podemos eliminar y cual no?

Para echar un vistazo y ver todas las ramas que se han fusionado/mergeado con master podemos usar:

git checkout master
git branch --merged

Para ver lo contrario, para ver todas las ramas que no se han mezclado con master

git branch --no-merged

Limpiando… Con esto eliminaremos todas las ramas del repositorio Git que estén obsoletas

git branch --merged | xargs git branch -d

También podemos utilizar alguna de las interfaces de Git, pero de eso ya hablamos en otro post 😉

¿Cómo encontrar XXX en el historial de Git?

A veces encontrar cuando se cambió un archivo puede ser complicado, o aun peor ¿Por qué esta linea comentada? Menos mal que Git tiene un grep interno que nos ayuda ha hacer búsquedas a través de commits.

Tenemos 2 opciones utilizar una expresión regular o buscar una cadena

git rev-list --all | xargs git grep '<REGEX>'
git rev-list --all | xargs git grep -F '<CADENA>'

Como traer un archivo desde otra rama

Hacer esto con una GUI es trivial, pero a veces en el repositorio hay tantas ramas que la pantalla queda llena de ellas y empezamos ha hacer scroll buscando la rama concreta.
Para traer un archivo desde otra rama lo más facil es:

git checkout <OTHER_BRANCH> -- path/to/file

Ver que ramas tenían commits

Este comando nos será útil cuando estemos haciendo limpieza de ramas. Con este comando imprimiremos los commits de cada rama. Incluso es posible personalizar el formato de la salida 🙂

git for-each-ref --sort=-committerdate --format='%(refname:short) %(committerdate:short)'

Como hacer un Alias en Git

Tenemos comandos o secuencias de comandos que utilizamos habitualmente, por ejemplo este último. Para hacer un alias en git solo tenemos que escribir algo como esto:

git config --global alias.springcleaning "for-each-ref --sort=-committerdate --format='%(refname:short) %(committerdate:short)'"

Mejorar la ayuda de git

Hay veces que empleamos mal un comando en git o incluso que no recordamos como se escribe. En git tenemos una variable global para ayudarnos con esto. Utilizando autocorrect podemos hacer que git nos ayude cuando escribimos mal un comando

$ git config --global help.autocorrect 1
$ git dffi
WARNING: You called a Git command named 'dffi', which does not exist.
Continuing under the assumption that you meant 'diff'
in 0.1 seconds automatically...

Encontrar datos perdidos con Git

Si al hacer un commit/push se pierden datos con git podemos recuperarlos. Existen 2 manera de recuperar datos en Git.

Utilizando reflog

Cualquier cambio que hagamos se registra en el log de Git

$ git log -g
commit be5de4244c1ef863e454e3fb7765c7e0559a6938
Reflog: HEAD@{0} (Csaba Okrona <xxx@xx.xx>)
Reflog message: checkout: moving from master to master
Author: Robin Ward <xxx@xx.xx>
Date:   Fri Nov 8 15:05:14 2013 -0500

    FIX: Pinned posts were not displaying at the top of categories.

Por ejemplo si creemos que se ha perdido un commit:

git branch my_lost_data [ SHA-1 ] 
`

Donde SHA-1 es el hash que viene despues del commit. Una vez que encontramos el commit en git solo nos queda fusionar

git merge my_lost_data

git-fsck

utilizando:

git fsck --full

Con este comando lo que hacemos es buscar todos los objetos huérfanos, que no estén referenciados por cualquier otro objeto. Podemos intentar hacer lo mismo que en el caso anterior.

Coloreando las lineas de commit en git

Para que cada commit tenga un color podemos:

$ git log --oneline --decorate
355459b Fix more typos in server locale
b95e74b Merge pull request #1627 from awesomerobot/master
40aa62f adding highlight & fade to linked topic
15c29fd (tag: v0.9.7.3, tag: latest-release) Version bump to v0.9.7.3
c753a3c We shouldn't be matching on the `created_at` field. Causes tests to randomly fail.
dbd2332 Public user profile page shows if the user is suspended and why.

Haciendo git status más simple

CUando ya se tiene algo más de manejo con Git podemos hacer al hacer status solo se muestren las cosas importantes.

$ git status -sb
## master...origin/master
?? _posts/2014-02-01-git-tips-from-the-trenches.md
?? images/git-beginner-share.png
?? images/git-beginner.jpg

Como evitar merges

Imagina que hacemos una nueva rama y queremos integrarla de nuevo en master, la opción que se viene a la cabeza siempre es hacer un merge, pero y si pudiesemos “reorganizar la rama” con git rebase podemos coger todos los cambios confirmados en la rama y replicarlos en master para ello:

 $ git pull --rebase

Para hacerlo por defecto podemos hacerlo por defecto:

$ git config branch.master.rebase true

Como saber que rama tiene un cambio especifico

$ git branch --contains [SHA-1]

Saber si los cambios de una rama se encuentra en master

Una manera de saber si se ha mezclado una rama es con el siguiente comando, aunque si utilizamos algun software para ver las ramas es más facil 😉

$ git cherry -v master

Como Buscar en los mensajes de commit en git

$ git show :/regex

Algunos alias que nos harán la vida más fácil

Como ya sabemos podemos añadir atajos de teclado al archivo .gitconfig para no tener que recordar tantos comandos o para poder utilizar mañas fácilmente comandos difíciles, a continuación vemos unos cuantos alias que pueden sernos útiles

ds = diff --staged      # git ds - diff your staged changes == review before committing.
st = status -sb         # smarter status - include tag and branch info
fup = log --since '1 day ago' --oneline --author <YOUR_EMAIL>  # I know what you did yesterday - great for follow-ups
ls = log --pretty=format:"%C(yellow)%h %C(blue)%ad%C(red)%d %C(reset)%s%C(green) [%cn]" --decorate --date=short  # pretty one-line log with tags, branches and authors
lsv = log --pretty=format:"%C(yellow)%h %C(blue)%ad%C(red)%d %C(reset)%s%C(green) [%cn]" --decorate --date=short --numstat    # a verbose ls, shows changed files too

# some resets without explanation
r = reset
r1 = reset HEAD^
r2 = reset HEAD^^
rh = reset --hard
rh1 = reset HEAD^ --hard
rh2 = reset HEAD^^ --hard

# basic shortcuts
cp = cherry-pick
cl = clone
ci = commit
co = checkout
br = branch 
diff = diff --word-diff
dc = diff --cached

# stash shortcuts
sl = stash list
sa = stash apply
ss = stash save

# log related - thanks to @mwd410
l = log 
lh = log --graph
la = !git lh --date-order --all 2> /dev/null
lb = log --graph --simplify-by-decoration
lba = !git lb --all 
h = !git --no-pager log --graph -n 15
a = !git --no-pager la -n 15

Conclusiones

Estos son algunos trucos que he ido recopilando por ahí, sobre todo de aquí https://ochronus.com/git-tips-from-the-trenches/ pero seguro que hay muchos más.

¿Y vosotros tenéis algún truco para utilizar git? ¿Algún consejo sobre como mejorar la forma de trabajar con git? ¿un alias que quieras compartir?

Bola Extra: Entendiendo Git con imágenes

Todos sabemos y conocemos los comandos de Git, pero al menos a mi me queda todo más claro cuando lo veo gráficamente. Así que por ahí me encontré este artículo donde explican git utilizando D3
http://www.wei-wang.com/ExplainGitWithD3/#

Anuncios

Comenta la entrada

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s