git ready

aprendiendo git de a un commit por vez
por Nick Quaranto, traducido por Matías Flores

buscando commits pendientes

publicado el 16 Apr 2009

Digamos que estás trabajando en una rama particular y has decidido que ya es tiempo de aplicar tus modificaciones en la rama principal. Con herramientas gráficas como gitk or GitX, es realmente sencillo determinar cuáles son las modificaciones que no han sido aplicadas aún. Por ejemplo, supongamos el siguiente caso:

Si deseas hacer lo mismo desde la línea de comandos, tienes varias opciones. Una forma decente de ver la actividad de un repositorio es usar git log, que ofrece unas cuantas opciones interesantes, como por ejemplo:

git log --pretty=oneline --graph --all

También puedes usar la siguiente sintaxis con git log si deseas ver los commits que no fueron aplicados aún:

$ git checkout master
$ git log ..42-adding-replies

git log master..42-adding-replies

Sin embargo, existe otra opción mejor: git cherry. Este comando hace exactamente lo que estamos buscando: nos dice cuáles son los commits que aún no han sido aplicados en la rama especificada. Por ejemplo, si estoy en la rama master, puedo ejecutar:

$ git cherry -v master 42-adding-replies
+ a4d0f79fccbbc12a53e8f0e5c2a4ef960ad69ba2 Adding posts in
+ 7e71afd1faf36f17a0ff506e63cd2ca51496dad3 Revert "Adding posts in"
+ 5e815ece05d8813354e60ca1affb8cdb8c5d78fc Adding the right model
+ 956f4cec5684544066a0d261ff8ac80aff7a57ea Cleaning up model
+ 6c6cdb4342ed935f8fbd38f48f51dec469dd1823 Who needs tests?
+ c3481fd0d6279f5bd45c455b915e0b4b1c0d8909 Wrapping this up. Ship it.

Lo que hicimos fue preguntarle a Git qué commits incluídos en la rama 42-adding-replies no existen aún en master. Utilizando este comando, determinar cuáles son los cambios que aún hay que aplicar en master es tan sencillo como en la primera imagen de este artículo. La opción -v hace que además del SHA se incluyan los mensajes de cada commit, para que la tarea de identificarlos sea más simple. Este comando también acepta un tercer parámetro opcional que indique a partir de dónde hay que comenzar a buscar. Por ejemplo, si quisiéramos analizar sólo a partir del commit 7e71af, deberíamos hacer lo siguiente:

$ git cherry -v master 42-adding-replies 7e71af
+ 5e815ece05d8813354e60ca1affb8cdb8c5d78fc Adding the right model
+ 956f4cec5684544066a0d261ff8ac80aff7a57ea Cleaning up model
+ 6c6cdb4342ed935f8fbd38f48f51dec469dd1823 Who needs tests?
+ c3481fd0d6279f5bd45c455b915e0b4b1c0d8909 Wrapping this up. Ship it.

Como puedes ver, en este caso los dos primeros commits sin aplicar fueron omitidos. Si en cambio quieres saber cuáles son los commits de la rama actual que aún no fueron aplicados en alguna otra rama en particular, la sintaxis sería la siguiente:

$ git checkout 42-adding-replies
$ git cherry master
+ a4d0f79fccbbc12a53e8f0e5c2a4ef960ad69ba2
+ 7e71afd1faf36f17a0ff506e63cd2ca51496dad3
+ 5e815ece05d8813354e60ca1affb8cdb8c5d78fc
+ 956f4cec5684544066a0d261ff8ac80aff7a57ea
+ 6c6cdb4342ed935f8fbd38f48f51dec469dd1823
+ c3481fd0d6279f5bd45c455b915e0b4b1c0d8909

Un aspecto bastante interesante de este comando es que realmente compara los cambios, en lugar de comparar simplemente el SHA de cada commit, ya que puedes haber modificado el commit, o sus ancestros de alguna forma. En resumen, puedes confiar en este comando cada vez que necesites determinar cuáles son las modificaciones que no fueron aplicadas aún en otra rama. No confundir este comando con cherry-pick, que se utiliza para algo completamente distinto.