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 feature
aún está disponible.
En ese caso h
es el último resultado de:
git log master ^feature --ancestry-path
Si la rama feature
ya no está disponible, puede mostrar las confirmaciones de fusión en la línea del historial entre c
y 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 e
y g
sobre 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 h
como la última fila en común.
Si lo tiene disponible, puede usarlo comm -1 -2
en 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.
master
se fusionófeature
e inmediatamentefeature
se fusionómaster
como un avance rápido (la punta de losfeature
reemplazosmaster
). ¿Causaría eso--first-parent
devolver al padre equivocado?comm -1 -2
pero no funcionó.comm
solo 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-merge
con 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 -f2
no está encontrando correctamente la última fila en común. Aquí hay un ejemplo donde falla.16db9fef5c581ab0c56137d04ef08ef1bf82b0b7
aquí cuando lo ejecuto en su pasta, ¿no es eso lo que se espera? ¿En qué sistema operativo estás?29c40c3a3b33196d4e79793bd8e503a03753bad1
git-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 conbash
ozsh
sin embargo.fuente
<()
no es compatible con POSIX. Necesita usarbash
,zsh
o 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
comm
para comparar las listas. Como estamos buscando el último resultado en el--ancestry-path
que 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
comm
no 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.comm
se lanza cuando las entradas no están ordenadas.grep -f
funciona perfectamente.Casos de esquina:
~/bin/git-find-merge
guió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.rb
Puedes 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 --merges
Tuve 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