2012-06-07 13 views
5

Duplicar posible:
Find the parent branch of a branch¿De qué rama git se sacó esta rama?

¿Cómo puedo saber el nombre de la rama git que la rama en cuestión se separó de (si los hay)?

+0

¿Se refiere a la rama remota que está rastreando, o la rama de la que una rama se separó (si existe)? No creo que siempre puedas encontrar lo último. –

+0

La rama local de la que este se separó (si corresponde). No podría decir esto mejor que tú. – Dziamid

+0

No creo que Git siquiera registre esa información, aunque podría estar equivocado. –

Respuesta

2

Es fácil para nosotros pensar master siempre es master y my_branch siempre es my_branch, pero ese no es el caso. Supongamos que tiene su repositorio en Github, sus ventanas, su Linux y su oficina.

Es, por tanto, tiene 8 sucursales diferentes:

github/master 
github/my_branch 
windows/master 
windows/my_branch 
linux/master 
linux/my_branch 
office/master 
office/my_branch 

Usted como un ser humano los ven como master y my_branch pero Git los ve como 8 ramas diferentes. Así que si usted tiene una red de este tipo:

------------------------------------------------ linux/master 
\--/ \-------/ /   \-------- office/my_branch 
    | \---|--\--------/-------------------\------- my_branch 
    |  | 
    | office/master 
    | 
windows/master 

¿Qué significa para preguntar dónde proviene de my_branch? ¡Es el resultado de la fusión de muchas ramas!


Ahí, lo que quería decirte es que hay un problema filosófico con tu pregunta. Sin embargo, hay una manera de responderlo, aunque no perfectamente. En primer lugar vamos a ver git log:

git log my_branch --pretty=oneline --graph 

le da una buena presentación de fusiones y esas cosas. Desde la página de manual de git-log:

--first-parent 
    Follow only the first parent commit upon seeing a merge commit. This option can give a better overview when viewing the evolution of a particular topic branch, 
    because merges into a topic branch tend to be only about adjusting to updated upstream from time to time, and this option allows you to ignore the individual 
    commits brought in to your history by such a merge. 

Con eso, obtiene un historial lineal de la bifurcación. La eliminación de la gráfica y la salida sólo SHA1s, obtendrá:

git log my_branch --pretty=format:"%H" --first-parent 

con el siguiente comando, se puede decir que se ramifica contiene un SHA1:

git branch --contains <commit> 

Poner un guión juntos utilizando estos comandos, puede utilice la siguiente secuencia de comandos que básicamente encuentre la última SHA1 que está contenida en otra rama distinta a la que le interesa. A continuación, muestra esa otra rama. (Nota: No soy bueno en bash scripting todavía, así que esto puede no ser tan eficiente):

#! /bin/bash 

if [ $# -lt 1 ]; then 
    branch=master 
else 
    branch=$1 
fi 

sha1s=$(git log $1 --pretty=format:"%H") 
res="Doesn't branch from anything" 

for i in $sha1s; do 
    b=$(git branch --contains $i | awk '{ if (NF > 1) print $2; else print $1 }') # use awk to remove * from current branch 
    other_branch=""; 
    for j in $b; do 
    if [ $branch != $j ]; then 
     other_branch=$j 
     break; 
    fi 
    done 
    if [ -n "$other_branch" ]; then 
    res=$other_branch 
    break 
    fi 
done 

printf -- '%s\n' "$res" 

me dijeron que no es perfecto, por lo siguiente situación. Imagine si my_branch está ramificado desde master. De hecho, a continuación, vea el gráfico siguiente manera:

    /------------ master 
------(master)----- 
        \------------ my_branch 

Las confirmaciones iniciales figuran en la historia de ambos ramas. Se desconoce que originalmente provenían del maestro. Por lo tanto, este script le dirá que my_branch se ramificó desde master y al mismo tiempo le dice que master está ramificado desde my_branch. No hay forma de saber cuál fue el original.