2012-06-07 15 views
5

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)?

+0

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. –

+0

Il ramo locale da cui è stata separata questa (se presente). Non potrei affermarlo meglio di te. – Dziamid

+0

Non credo che Git registri quelle informazioni, anche se potrei sbagliarmi. –

risposta

2

È 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.

Problemi correlati