Eventuali duplicati:
Find the parent branch of a branchQuale ramo git è stato controllato da questo ramo?
Come faccio a sapere il nome del ramo git che il ramo in questione scorporata dal (se del caso)?
Eventuali duplicati:
Find the parent branch of a branchQuale ramo git è stato controllato da questo ramo?
Come faccio a sapere il nome del ramo git che il ramo in questione scorporata dal (se del caso)?
È facile per noi pensare che master
sia sempre master
e my_branch
sia sempre my_branch
, ma non è questo il caso. Supponiamo che tu abbia il tuo repository in Github, nelle tue finestre, nella tua linux e nel tuo ufficio.
È quindi avere 8 diversi rami:
github/master
github/my_branch
windows/master
windows/my_branch
linux/master
linux/my_branch
office/master
office/my_branch
È come essere umano vederli come master
e my_branch
ma git li vede come 8 filiali differenti. Quindi, se si dispone di una rete come questa:
------------------------------------------------ linux/master
\--/ \-------/ / \-------- office/my_branch
| \---|--\--------/-------------------\------- my_branch
| |
| office/master
|
windows/master
che cosa significa chiedere dove my_branch
viene? È il risultato dell'unione di molti rami!
Ecco, quindi quello che volevo dirti è che c'è un problema filosofico con la tua domanda. Tuttavia c'è un modo per rispondere, anche se non perfettamente. In primo luogo diamo un'occhiata a git log
:
git log my_branch --pretty=oneline --graph
ti dà una bella presentazione di fusioni e roba. Dalla pagina man di 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.
In questo modo si ottiene una cronologia lineare del ramo. Rimozione del grafico e l'output solo SHA1s, si otterrà:
git log my_branch --pretty=format:"%H" --first-parent
Utilizzando il seguente comando, si può dire che si dirama contengono uno SHA1:
git branch --contains <commit>
Mettere insieme uno script utilizzando questi comandi, è possibile usa il seguente script che trova fondamentalmente l'ultimo SHA1 contenuto in un altro ramo diverso da quello a cui sei interessato. Quindi emette quell'altro ramo. (Nota: io non sono bravo in script bash ancora, quindi questo potrebbe non essere così efficiente):
#! /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"
mi dicono che non è perfetto, a causa della seguente situazione. Immaginate se my_branch
sia derivato da master
. In realtà si poi vedere il grafico come questo:
/------------ master
------(master)-----
\------------ my_branch
i commit iniziali sono contenuti nella storia di entrambe le rami. Non è noto che originariamente provenissero dal maestro. Pertanto, questo script ti dirà che my_branch
è derivato da master
e allo stesso tempo ti dice che master
è derivato da my_branch
. Non c'è modo di dire quale fosse quella originale.
Intendi il ramo remoto che sta monitorando o il ramo da cui un ramo si separa (se esiste)? Non penso che tu possa sempre trovare quest'ultimo. –
Il ramo locale da cui è stata separata questa (se presente). Non potrei affermarlo meglio di te. – Dziamid
Non credo che Git registri quelle informazioni, anche se potrei sbagliarmi. –