निम्नलिखित शेल कमांड को वह करना चाहिए जो आप चाहते हैं:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
चेतावनियां
यदि आपने mybranchजाँच कर ली है, तो उपरोक्त कमांड काम नहीं करेगा। ऐसा इसलिए है क्योंकि कमिट्स mybranchद्वारा भी पहुंच योग्य हैं HEAD, इसलिए Git कमिट को अद्वितीय नहीं मानता है mybranch। mybranchजाँच होने पर इसे प्राप्त करने के लिए , आपको इसके लिए एक अतिरिक्त जोड़ना होगा HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
हालाँकि, आपको तब तक बाहर नहीं करना चाहिए HEADजब तक कि mybranchबाहर की जाँच न कर ली जाए , अन्यथा आपको ऐसे जोखिम दिखाने का जोखिम होता है जो अनन्य नहीं हैं mybranch।
इसी तरह, यदि आपके पास एक दूरस्थ शाखा है जिसका नाम origin/mybranchस्थानीय mybranchशाखा से मेल खाता है , तो आपको इसे बाहर करना होगा:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
और यदि दूरस्थ शाखा दूरस्थ रिपॉजिटरी (आमतौर पर केवल सच के लिए origin/master) के लिए डिफ़ॉल्ट शाखा है , तो आपको भी बाहर करना होगा origin/HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
यदि आपके पास शाखा की जाँच की गई है, और एक दूरस्थ शाखा है, और दूरस्थ शाखा दूरस्थ रिपॉजिटरी के लिए डिफ़ॉल्ट है, तो आप एक बहुत को छोड़कर समाप्त करते हैं:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
व्याख्या
git rev-listआदेश हुए निम्न-स्तर (पाइपलाइन) आदेश दिए गए संशोधन चलता है और SHA1 पहचानकर्ता का सामना करना पड़ा उदासीनता है। git logइसे सिर्फ़ इसके बराबर समझें, यह केवल SHA1 दिखाता है- कोई लॉग संदेश, कोई लेखक का नाम, कोई टाइमस्टैम्प, कोई भी "फैंसी" सामान नहीं।
--no-walkविकल्प के रूप में नाम का तात्पर्य, रोकता git rev-listवंश श्रृंखला चलने से। इसलिए यदि आप टाइप git rev-list --no-walk mybranchकरते हैं तो यह केवल एक SHA1 पहचानकर्ता को प्रिंट करेगा: mybranchशाखा के टिप कमेंट का पहचानकर्ता ।
--exclude=refs/heads/mybranch --allतर्क बता git rev-listके अलावा प्रत्येक संदर्भ से शुरू करने के लिए refs/heads/mybranch।
इसलिए, जब आप दौड़ते हैं git rev-list --no-walk --exclude=refs/heads/mybranch --all, तो Git सिवाय प्रत्येक रेफरी के टिप कमेंट के SHA1 पहचानकर्ता को प्रिंट करता है refs/heads/mybranch। ये कमिट और उनके पूर्वज आपके द्वारा किए गए कमिट हैं कोई दिलचस्पी नहीं है - ये ऐसे कमिट्स हैं जिन्हें आप नहीं देखना चाहते हैं।
अन्य प्रतिबद्ध हैं जिन्हें आप, देखना तो हम के उत्पादन में एकत्र करना चाहते हैं git rev-list --no-walk --exclude=refs/heads/mybranch --allऔर Git बता सब कुछ, लेकिन उन करता और अपने पूर्वजों को दिखाने के लिए।
--no-walkतर्क बड़े खजाने के लिए आवश्यक है (और छोटे खजाने के लिए एक अनुकूलन है): बिना यह, Git मुद्रित करने के लिए है, और खोल इकट्ठा करने के लिए होगा (और स्मृति में स्टोर) कई और अधिक आवश्यकता से पहचानकर्ता के लिए प्रतिबद्ध। एक बड़े भंडार के साथ, एकत्र किए गए कमिट की संख्या शेल की कमांड-लाइन तर्क सीमा को आसानी से पार कर सकती है।
गित बग?
मुझे काम करने के लिए निम्नलिखित की उम्मीद होगी:
git log --all --not --exclude=refs/heads/mybranch --all
लेकिन ऐसा नहीं है। मैं अनुमान लगा रहा हूं कि यह गिट में एक बग है, लेकिन शायद यह जानबूझकर है।