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)?
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)?
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.
¿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. –
La rama local de la que este se separó (si corresponde). No podría decir esto mejor que tú. – Dziamid
No creo que Git siquiera registre esa información, aunque podría estar equivocado. –