एक प्रतिबद्ध आईडी को देखते हुए, यह कैसे निर्धारित किया जाए कि वर्तमान शाखा में प्रतिबद्ध है?


156

मैं जो करने की कोशिश कर रहा हूं वह एक संस्करण की जांच है। मैं एक न्यूनतम संस्करण के शीर्ष पर कोड को सुनिश्चित करना चाहता हूं। इसलिए मुझे यह जानने का एक तरीका चाहिए कि क्या वर्तमान शाखा में एक निर्दिष्ट प्रतिबद्धता है।



10
उन सभी शाखाओं को खोजने के लिए प्रस्तावित डुप्लिकेट देखें जो एक निर्दिष्ट प्रतिबद्ध हैं। यह पता लगाने के लिए कि क्या वर्तमान शाखा में सी है , "प्लंबिंग" कमांड का उपयोग करें git merge-base --is-ancestor। वर्तमान शाखा में C शामिल है यदि C का पूर्वज है HEAD, तो:if git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash; else echo I do not contain commit $hash; fi
torek

1
नमस्ते, कृपया इसे एक उत्तर के रूप में प्रस्तुत करें ताकि इसे सही उत्तर के रूप में चुना जा सके =)
बेन

1
@ - मैंने इसे एक समुदाय विकि उत्तर के रूप में जोड़ा।
ज़िट्राक्स

1
@ रिमूवर: शेल स्क्रिप्ट में, शून्य सत्य है, नॉनज़रो गलत है: सी कन्वेंशन का उल्टा। /bin/trueमूल रूप से exit 0और के /bin/falseरूप में लागू किया गया था exit 1। (आधुनिक गोले तो में निर्माण किया है।)
torek

जवाबों:


220

इस परिणाम को प्राप्त करने के कई तरीके हैं। पहले भोले विकल्प का उपयोग करना git logऔर एक विशिष्ट प्रतिबद्ध का उपयोग करके खोज करना है grep, लेकिन यह हमेशा सटीक नहीं होता है

git log | grep <commit_id>

आप git branchदी गई COMMIT_IDउपयोग वाली सभी शाखाओं को खोजने के लिए सीधे उपयोग करने के लिए बेहतर हैं

git branch --contains $COMMIT_ID

अगला चरण वर्तमान शाखा का पता लगा रहा है जिसे git 1.8.1उपयोग करने के बाद से किया जा सकता है

git symbolic-ref --short HEAD

और संयुक्त रूप में

git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID

लेकिन ऊपर दिया गया आदेश सही या गलत नहीं है और एक छोटा संस्करण है जो बाहर निकलें कोड 0 को लौटाता है यदि प्रतिबद्ध वर्तमान शाखा में है या बाहर निकलें कोड 1 नहीं

git merge-base --is-ancestor $COMMIT_ID HEAD

बाहर निकलें कोड अच्छा है, लेकिन जैसा कि आप स्ट्रिंग चाहते हैं trueया falseउत्तर के रूप में आपको थोड़ा और जोड़ने की आवश्यकता है और फिर ifबैश से संयुक्त होकर आप प्राप्त करें

if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi

9
यह सही नहीं है; grepझूठे सकारात्मक हो सकती थी अगर git logउल्लेख अन्य कारणों के लिए SHA प्रतिबद्ध, जैसे यह एक में उल्लेख किया गया है एक और शाखा से एक बंदरगाह के परिणाम के रूप संदेश के लिए प्रतिबद्ध।
एडम स्पियर्स

1
सही किया गया (या बल्कि एक और विकल्प जोड़ा गया)।
जिरीस

3
कृपया प्रश्न पर टिप्पणी देखें, जो बिल्ट-इन गिट टूलसेट का उपयोग करता है। stackoverflow.com/questions/43535132/…
बेन

2
मैं पहला विकल्प की तरह है, लेकिन शासन बाहर एडम की आपत्ति के लिए, मैं विकल्प जोड़ना होगा --format=format:%Hकरने के लिए git log
PJSCopeland

71

शाखा की सूची प्राप्त करें

# get all the branches where the commit exists
$ git branch --contains <commit-id>

जांचें कि क्या किसी शाखा की विशिष्ट प्रतिबद्धता है।

# output the branch-name if the commit exists in that branch
$ git branch --contains <commit-id> | grep <branch-name>

सटीक मिलान केfeature साथ शाखा (कहना ) खोजें ।

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

जैसे आप 3 स्थानीय शाखाओं कहा जाता है, तो feature, feature1, feature2तो

$ git branch --contains <commit-id> | grep 'feature'

# output
feature
feature1
feature2

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

# output
feature     

तुम भी दोनों में खोज सकते हैं localऔर remoteशाखाओं (उपयोग -a) या केवल में remoteशाखाओं (उपयोग -r)।

# search in both 'local' & 'remote' branches  
$ git branch -a --contains <commit-id> | grep -E '(^|\s)feature$'

# search in 'remote' branches  
$ git branch -r --contains <commit-id> | grep -E '(^|\s)feature$'

1
grepयहां भी झूठे सकारात्मक हो सकती थी अगर वहाँ युक्त प्रतिबद्ध जिनके नाम भी शामिल अन्य शाखाएं हैं <branch-name>सबस्ट्रिंग के रूप में।
एडम स्पियर्स

1
हां @ अदमस्पीयर, ब्रांच का नाम सटीक मिलान के साथ उत्तर देंgrep -E '(^|\s)branchname$'
साजिब खान

1
संबंधित प्रश्न पर इस टिप्पणी के अनुसार, उन शाखाओं को देखने के लिए -r("दूरस्थ") या -a("सभी") विकल्प को जोड़ना उपयोगी git branchहो सकता है जिन्हें स्थानीय रेपो क्लोन में दोहराया नहीं जा सकता है।
sxc731

यह मेरे लिए काम नहीं करता था, मुझे जरूरत थी git branch --all --contains <commit-id>
आर्थर टैक

7

उत्तर के रूप में @torek द्वारा निकाली गई टिप्पणी:

उन सभी शाखाओं को खोजने के लिए प्रस्तावित डुप्लिकेट देखें जो एक निर्दिष्ट प्रतिबद्ध हैं।

यह पता लगाने के लिए कि क्या वर्तमान शाखा में सी है, "प्लंबिंग" कमांड का उपयोग करें git merge-base --is-ancestor। वर्तमान शाखा में C शामिल है यदि C, HEAD का पूर्वज है, तो:

if git merge-base --is-ancestor $hash HEAD; then
    echo I contain commit $hash
else
    echo I do not contain commit $hash
fi

(साइड नोट: शेल स्क्रिप्ट में, शून्य से बाहर निकलने वाला एक कमांड "सच" है जबकि गैर-एक्सो को बाहर निकालने वाला "गलत" है।)


4

प्रतिबद्ध स्थानीय शाखाओं को सूचीबद्ध करने के लिए:

git branch --contains <commit-id>

और सभी शाखाओं को सूचीबद्ध करने के लिए, जिनमें रिमोट भी शामिल है, कमिट:

git branch -a --contains <commit-id>

इसी तरह यह जांचने के लिए कि क्या प्रतिबद्ध विशेष शाखा में है:

git log <branch> | grep <commit_id>

और अगर शाखा स्थानीय रूप से उपसर्ग शाखा नाम के साथ मौजूद नहीं है origin/


इस टिप्पणी के लिए वोट किया गया -a। उस सलाह के लिए धन्यवाद!
थोरिल व्रेज

3

हाँ एक और विकल्प:

git rev-list <branch name> | grep `git rev-parse <commit>`

यह मेरे लिए सबसे अच्छा काम करता है क्योंकि यह स्थानीय रूप से कैश्ड रिमोट शाखाओं पर भी काम करेगा remotes/origin/master, जैसे कि git branch --containsयह काम नहीं करेगा।

यह सिर्फ "वर्तमान शाखा" के बारे में ओपी के प्रश्न से अधिक को कवर करता है, लेकिन मुझे इस प्रश्न का "कोई भी शाखा" संस्करण पूछने के लिए गूंगा लगता है इसलिए मैं यहां भी पोस्ट करने का निर्णय लेता हूं।


1
git branch --contains <commit-id> --points-at <target branch name>

यदि लक्षित आईडी उस शाखा में मौजूद है तो यह लक्ष्य शाखा नाम लौटा देगा। अन्यथा आदेश विफल हो जाएगा।


नहीं ...error: malformed object name 'branch-name'
bbodenmiller

1
आपको 2 मामलों में वह त्रुटि मिल सकती है। 1. जब दिए गए <शाखा का नाम> दिए गए <प्रतिबद्ध आईडी> 2 नहीं है। चेकआउट <शाखा नाम> दिए गए <शाखा का नाम> नहीं है
ड्रीमयूथ

0

चूँकि इस प्रश्न के कुछ अच्छे पटकथा वाले उत्तर हैं, मैं अपने पसंदीदा को जोड़ रहा हूँ।

यह एक आपको दिखाएगा, आखिरी $nकमिट के लिए $brजिसमें शाखाएँ प्रत्येक में शामिल हैं:

br=mybranch
n=10
git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'

यह एक समान है लेकिन शाखाओं की सूची के लिए भी ऐसा ही है:

br="mybranch yourbranch herbranch"
n=4
for br in $brs; do git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'; done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.