2012-06-07 13 views
5

संभव डुप्लिकेट:
Find the parent branch of a branchइस शाखा की कौन सी गिट शाखा से चेक आउट किया गया था?

मैं कैसे Git शाखा है कि प्रश्न में शाखा से अलग हो (यदि हो) का नाम पता करते हैं?

+0

क्या आपका मतलब है कि रिमोट शाखा ट्रैकिंग कर रही है, या शाखा जो शाखा से अलग हो जाती है (यदि कोई हो)? मुझे नहीं लगता कि आप हमेशा बाद वाले को ढूंढ सकते हैं। –

+0

स्थानीय शाखा जो यह एक से विभाजित है (यदि कोई है)। आपके द्वारा बेहतर प्रदर्शन नहीं कर सका। – Dziamid

+0

मुझे नहीं लगता कि गिट भी उस जानकारी को रिकॉर्ड करता है, हालांकि मुझे गलती हो सकती है। –

उत्तर

2

यह हमें सोचने के लिए के लिए mastermaster और my_branch हमेशा my_branch है हमेशा होता है आसान है, लेकिन यह मामला नहीं है। मान लें कि आपके पास गिथब, आपकी खिड़कियां, लिनक्स और आपके कार्यालय में आपका भंडार है।

इसलिए 8 विभिन्न शाखाएं हैं:

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

आप एक मानव के रूप में उन्हें master और my_branch रूप में देखते हैं लेकिन Git उन्हें 8 विभिन्न शाखाओं के रूप में देखता है। तो अगर आप इस तरह एक नेटवर्क है:

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

क्या यह पूछने के लिए जहां my_branch से आता है मतलब है? यह कई शाखाओं के विलय का परिणाम है!


वहां, इसलिए मैं आपको यह बताना चाहता था कि आपके प्रश्न के साथ दार्शनिक समस्या है। हालांकि इसका जवाब देने का एक तरीका है, हालांकि पूरी तरह से नहीं। पहले के git log को देखो:

git log my_branch --pretty=oneline --graph 

आप मर्ज और सामान का एक अच्छा प्रस्तुति देता है। गिट-लॉग मैन पेज से:

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

इसका उपयोग करके, आपको शाखा का एक रैखिक इतिहास मिलता है। ग्राफ निकाला जा रहा है और केवल SHA1s outputting, आप मिल जाएगा:

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

निम्न आदेश का उपयोग करना, आप बता सकते हैं जो शाखाओं एक SHA1 होते हैं:

git branch --contains <commit> 

एक साथ एक स्क्रिप्ट लाना इन आदेशों का उपयोग करते हैं, तो आप कर सकते हैं निम्न स्क्रिप्ट का उपयोग करें जो मूल रूप से नवीनतम SHA1 पाता है जो कि आपकी रुचि रखने वाले किसी अन्य शाखा में निहित है। फिर वह उस अन्य शाखा को आउटपुट करता है। (नोट: मैं अभी तक बैश पटकथा में अच्छा नहीं कर रहा हूँ, तो यह इतनी कुशल नहीं हो सकता है):

#! /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" 

मैं ने कहा कि यह निम्न स्थिति की वजह से सही नहीं है,। कल्पना करें कि my_branchmaster से ब्रांच किया गया है।

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

प्रारंभिक प्रतिबद्ध दोनों शाखाओं के इतिहास में निहित हैं: वास्तव में आप तो इस तरह ग्राफ देखें। यह अज्ञात है कि वे मूल रूप से मास्टर से आए थे। इसलिए, यह स्क्रिप्ट आपको बताएगी कि my_branch को master से ब्रांच किया गया था और साथ ही आपको यह भी बताया गया है कि mastermy_branch से ब्रांच किया गया है। यह बताने का कोई तरीका नहीं है कि कौन सा मूल था।

संबंधित मुद्दे