2012-11-01 16 views
6

मैंने कुछ गिट भंडार क्लोन किया है, और "गिट शाखा abcd" किया है, whcih मुझे मूल/abcd से व्युत्पन्न एक शाखा में स्विच किया। abcd डिफ़ॉल्ट मूल शाखा नहीं है। फिर, मैंने एबीसीडी से एक फीचर शाखा "my_feature" बनाई है। मैं एक स्क्रिप्ट में my_feature में "गिट मर्ज मूल/abcd" करना चाहता हूं जो मूल शाखा के नाम के बावजूद लागू होगा (या कम से कम उन मामलों पर लागू होता है जब किसी अन्य उत्तर में वर्णित कोई जटिल शाखा संरचना नहीं होती है गिट के बारे में)।गिट में मूल मूल शाखा का नाम प्राप्त करना?

मुझे कैसे पता चलेगा कि "निकटतम"/"मूल" मूल शाखा क्या है जिस पर वर्तमान शाखा बनाई गई थी?

+0

के संभावित डुप्लिकेट (http [एक शाखा की मूल शाखा खोजें]: // stackoverflow।com/प्रश्न/3161204/लगता है-माता पिता के शाखा-ऑफ-एक शाखा) – pisaruk

उत्तर

3

यह अच्छा करना मुश्किल है। गिट में, एक शाखा सिर्फ एक प्रतिबद्धता के लिए एक ऑटो-एडवांसिंग पॉइंटर है, और एक प्रतिबद्धता पर इसके किसी भी शाखा नाम हो सकते हैं।

your master:  y1---y2---y3 
       /
master: a---b---c---d---e 
       \ 
feature:   f1---f2---f3---f4 

आप शाखा "मास्टर" की जाँच की c पर, और y1 प्रतिबद्ध, y2, और y3: इस मामले पर विचार करें। आपका इतिहास इस प्रकार a b c y1 y2 y3 जैसा दिखता है। इस बीच मास्टर d और e तक उन्नत हो गया है, लेकिन किसी ने फीचर शाखा बनाई है और c पर आधारित है। गिट के पास यह निर्धारित करने का कोई तरीका नहीं है कि आपकी शाखा master से feature के बजाय आई है, इसलिए सबसे अच्छा आपके पास विलय करने के लिए शाखाओं का विकल्प होगा।

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

#!/bin/bash 

# Tries to determine a good merge base from among all local branches. 
# Here used, a "good" merge base is the one sharing the most recent commit 
# on this branch. This function will exit 1 if no branch is found, 
# or exit 2 in a tie. 
# 
# Untested - use at your own risk. 

MAX_SEARCH=20 # only search the last 20 commits on this branch 
FOUND=0 
LAST_BRANCH= 

# iterate through the commits, most recent first 
for COMMIT in $(git rev-list --max-count=$MAX_SEARCH HEAD); do 
    # check every local branch 
    for BRANCH in $(git for-each-ref --format="%(refname)" refs/heads); do 
    # look for the commit in that branch's history 
    if (git rev-list $BRANCH | fgrep -q COMMIT); then 
     echo $BRANCH 
     FOUND=$((FOUND + 1)) 
     LAST_BRANCH="$BRANCH" 
    fi 
    done 
    if [ $FOUND -gt 1 ]; then 
    # more than one choice; exit 
    exit 2 
    elif [ $FOUND -eq 1 ]; then 
    git merge $LAST_BRANCH 
    exit 0 
    fi 
done 
exit 1 # could not find a parent 
2

एक डीवीसीएस के साथ, "मूल शाखा" जैसी कोई चीज़ नहीं है।

एक शाखा है:

  • एक नाम
  • एक प्रारंभिक प्रतिबद्ध है, और उस के लिए प्रतिबद्ध कर सकते हैं:
    • कई शाखाओं का हिस्सा है, स्थानीय रेपो और 'origin की तरह नदी के ऊपर रेपो से दोनों '। अपने शाखा के एक रिबेस के बाद
    • परिवर्तन

अधिक के लिए देखें:

केवल अपनी स्क्रिप्ट के लिए रास्ता काम करने के लिएका नाम रिकॉर्ड करना है, अधिमानतः git notes (क्योंकि यह इतिहास और SHA1 को नहीं बदलता है, लेकिन मेटाडेटा जोड़ता है)।

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