Imagine la siguiente historia:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
¿Cómo puedo encontrar cuando commit "c" se ha fusionado en master (es decir, find merge commit "h")?
Su ejemplo muestra que la rama featureaún está disponible.
En ese caso hes el último resultado de:
git log master ^feature --ancestry-path
Si la rama featureya no está disponible, puede mostrar las confirmaciones de fusión en la línea del historial entre cy master:
git log <SHA-1_for_c>..master --ancestry-path --merges
Esto sin embargo, también le mostrará todas las fusiones que sucedieron después h, y entre ey gsobre feature.
Comparando el resultado de los siguientes comandos:
git rev-list <SHA-1_for_c>..master --ancestry-path
git rev-list <SHA-1_for_c>..master --first-parent
le dará el SHA-1 hcomo la última fila en común.
Si lo tiene disponible, puede usarlo comm -1 -2en estos resultados. Si está en msysgit, puede usar el siguiente código perl para comparar:
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
(código perl de http://www.cyberciti.biz/faq/command-to-display-lines-common-in-files/ , que lo tomó de "alguien en el grupo de noticias comp.unix.shell").
Vea la sustitución del proceso si desea que sea una línea.
masterse fusionófeaturee inmediatamentefeaturese fusionómastercomo un avance rápido (la punta de losfeaturereemplazosmaster). ¿Causaría eso--first-parentdevolver al padre equivocado?comm -1 -2pero no funcionó.commsolo funciona en líneas ordenadas. (El perl one-liner funciona, aunque no pude leerlo)git find-merge h master(no devuelve nada pero debería devolver h),git find-merge d master(devuelve f pero debería devolver d),git find-merge c feature(devuelve e pero debería devolver g).Agregue esto a su
~/.gitconfig:Entonces puedes usar los alias de esta manera:
Para ver el mensaje de confirmación de fusión y otros detalles, úselo
git show-mergecon los mismos argumentos.(Basado en la respuesta de Gauthier . Gracias a Rosen Matev y javabrett por corregir un problema con
sort).fuente
sort -k2 | uniq -f1 -d | sort -n | tail -1 | cut -f2no está encontrando correctamente la última fila en común. Aquí hay un ejemplo donde falla.16db9fef5c581ab0c56137d04ef08ef1bf82b0b7aquí cuando lo ejecuto en su pasta, ¿no es eso lo que se espera? ¿En qué sistema operativo estás?29c40c3a3b33196d4e79793bd8e503a03753bad1git-get-merge localizará y mostrará la confirmación de fusión que está buscando:
El comando sigue a los hijos del commit dado hasta que se encuentre una fusión en otra rama (presumiblemente master).
fuente
Es decir, para resumir la publicación de Gauthier:
EDITAR: debido a que utiliza la sustitución de proceso "
<()", no es compatible con POSIX y es posible que no funcione con su shell. Funciona conbashozshsin embargo.fuente
<()no es compatible con POSIX. Necesita usarbash,zsho una sustitución de proceso de soporte de shell . Edité mi respuesta en consecuencia.Necesitaba hacer esto, y de alguna manera lo encontré
git-when-merged(que en realidad hace referencia a esta pregunta SO, pero Michael Haggerty nunca agregó una referencia a su muy lindo script Python aquí). Entonces ahora tengo.fuente
Sobre la base de la gran respuesta de Gauthier, no necesitamos usar
commpara comparar las listas. Como estamos buscando el último resultado en el--ancestry-pathque también está--first-parent, simplemente podemos buscar el último en la salida del primero:O para algo ágil y reutilizable, aquí hay una función para resaltar
.bashrc:fuente
commno funcionaba cuando las entradas no estaban ordenadas.Para la multitud de Ruby, hay git-wherede . Muy fácil.
fuente
Yo uso el script bash que coloco en el camino
~/bin/git-find-merge. Se basa en la respuesta de Gauthier y la respuesta de evilstreak con algunos retoques para manejar casos de esquina.commse lanza cuando las entradas no están ordenadas.grep -ffunciona perfectamente.Casos de esquina:
~/bin/git-find-mergeguión:Lo que me permite hacer esto:
Este script también está disponible en mi github .
fuente
Luego busque la primera fusión antes de la confirmación.
fuente
Mi versión rubí de la idea de @ robinst funciona dos veces más rápido (lo cual es importante cuando busco un commit muy antiguo).
find-commit.rbPuedes usarlo así:
fuente
Puedes probar algo como esto. La idea es iterar a través de todas las confirmaciones de fusión y ver si la confirmación "c" es accesible desde una de ellas:
fuente
git rev-list <SHA-1_for_c>..master --ancestry-path --mergesTuve que hacer esto varias veces (¡gracias a todos los que respondieron esta pregunta!), Y terminé escribiendo un script (usando el método de Gauthier) que podría agregar a mi pequeña colección de utilidades git. Puede encontrarlo aquí: https://github.com/mwoehlke/git-utils/blob/master/bin/git-merge-point .
fuente