संभव डुप्लिकेट:
Find the parent branch of a branchइस शाखा की कौन सी गिट शाखा से चेक आउट किया गया था?
मैं कैसे Git शाखा है कि प्रश्न में शाखा से अलग हो (यदि हो) का नाम पता करते हैं?
संभव डुप्लिकेट:
Find the parent branch of a branchइस शाखा की कौन सी गिट शाखा से चेक आउट किया गया था?
मैं कैसे Git शाखा है कि प्रश्न में शाखा से अलग हो (यदि हो) का नाम पता करते हैं?
यह हमें सोचने के लिए के लिए master
master
और 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_branch
master
से ब्रांच किया गया है।
/------------ master
------(master)-----
\------------ my_branch
प्रारंभिक प्रतिबद्ध दोनों शाखाओं के इतिहास में निहित हैं: वास्तव में आप तो इस तरह ग्राफ देखें। यह अज्ञात है कि वे मूल रूप से मास्टर से आए थे। इसलिए, यह स्क्रिप्ट आपको बताएगी कि my_branch
को master
से ब्रांच किया गया था और साथ ही आपको यह भी बताया गया है कि master
my_branch
से ब्रांच किया गया है। यह बताने का कोई तरीका नहीं है कि कौन सा मूल था।
क्या आपका मतलब है कि रिमोट शाखा ट्रैकिंग कर रही है, या शाखा जो शाखा से अलग हो जाती है (यदि कोई हो)? मुझे नहीं लगता कि आप हमेशा बाद वाले को ढूंढ सकते हैं। –
स्थानीय शाखा जो यह एक से विभाजित है (यदि कोई है)। आपके द्वारा बेहतर प्रदर्शन नहीं कर सका। – Dziamid
मुझे नहीं लगता कि गिट भी उस जानकारी को रिकॉर्ड करता है, हालांकि मुझे गलती हो सकती है। –