सिर्फ एक शाखा के लिए प्रतिबद्ध इतिहास कैसे प्राप्त करें?


128

चलो मैं एक नई शाखा बनाई कहना my_experimentसे masterऔर करने के लिए कई प्रतिबद्ध बनाया my_experiment। अगर मैं इस git logपर काम my_experimentकरता हूं, तो मैं इस शाखा के लिए किए गए कमिट देखता हूं, लेकिन शाखा बनने से masterपहले किए गए कमिट भी my_experiments

मुझे my_experimentsशाखा में सभी कमिट्स के इतिहास को देखने के लिए बहुत उपयोगी लगता है जब तक कि यह उस शाखा के निर्माण को हिट नहीं करता है - प्रभावी रूप से सिर्फ उस शाखा का एक सच्चा इतिहास। अन्यथा यह मेरे लिए स्पष्ट नहीं है जब लॉग के माध्यम से देख रहा है कि क्या my_experimentsशाखा में कमिट थे या नहीं।

क्या गिट के साथ ऐसा करने का कोई तरीका है?

जवाबों:


139

आप ऐसा करने के लिए एक सीमा का उपयोग कर सकते हैं ।

git log master..

यदि आपने अपनी my_experimentशाखा की जाँच कर ली है । यह तुलना करेंगे जहां masterके लिए पर है HEAD(के टिप my_experiment)।


3
ठीक है बहुत जल्द बात की। यह मेरे सरल उदाहरण के लिए किया। लेकिन अब मैं किसी और के असली रेपो को देख रहा हूं और मेरे साथ ऐसा होता है कि इस कमांड को ठीक से उपयोग करने के लिए, मुझे यह जानना होगा कि मेरी वर्तमान शाखा किस शाखा से बनाई गई थी। शायद मुझे यह बताने में सक्षम होना चाहिए लेकिन यह मेरे लिए स्पष्ट नहीं है। कोई विचार?
मार्सॉफ्ट

@Marplesoft यह पता लगाने के लिए जटिल हो सकता है। इस प्रश्न को देखें ।
एलेक्स

क्या आप संक्षेप में बता सकते हैं कि यह कैसे काम करता है? git log master..Git को क्या बताता है?
टोनिक्स

2
@tonix किसी श्रेणी ( master..) भाग के कार्य के बारे में अधिक जानकारी के लिए उत्तर में दिए गए लिंक का अनुसरण करें ।
एलेक्स

7

git merge-baseआदेश एक आम पूर्वज लगाने के लिए इस्तेमाल किया जा सकता। इसलिए यदि my_experiment को अभी तक मास्टर में विलय नहीं किया गया है और my_experiment को मास्टर से बनाया गया है:

git log --oneline `git merge-base my_experiment master`..my_experiment

यदि आप अपनी पहली प्रतिबद्ध माता-पिता को शामिल करना चाहते हैं, तो ^ और --first- माता-पिता को जोड़ें : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
एरिक

7

नोट: यदि आप उस सीमा को अंतिम n कमिट पर लाते हैं (उदाहरण के लिए अंतिम 3 कमिट, git log -3), तो 'n' और अपनी शाखा के बीच एक स्थान रखना सुनिश्चित करें:

git log -3 master..

Git 2.1 (अगस्त 2014) से पहले, यह गलती: git log -3master..वास्तव में आपको वर्तमान ब्रांच के अंतिम 3 कमिट (यहां my_experiment) दिखाएगी , masterसीमा की अनदेखी (जिसका अर्थ है कि यदि my_experimentकेवल एक कमिट होता है, तो 3 अभी भी सूचीबद्ध होगा, उनमें से 2 master)

जूनियो सी gitsterहमानो द्वारा प्रतिबद्ध e3fa568 देखें ( ) :

संशोधन: पार्स " git log -<count>" अधिक सावधानी से

यह गलत कमांड लाइन केवल " master" को नजरअंदाज करती है और वर्तमान से दो आवागमन दिखाती है HEAD:

$ git log -2master

क्योंकि हम फ़ीड " 2masterके लिए" atoi()लगता है कि पूरी स्ट्रिंग एक पूर्णांक के रूप में पार्स किया गया है नहीं करने पड़ते।

strtol_i()इसके बजाय हेल्पर फ़ंक्शन का उपयोग करें ।


1

आप केवल उपयोग कर सकते हैं git log --oneline


हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह समस्या का हल कैसे और / या इसके बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे उत्तर के दीर्घकालिक मूल्य में सुधार होगा।
DebanjanB

1

मुझे लगता है कि आपके उद्देश्यों के लिए एक विकल्प है git log --online --decorate। इससे आप चेक किए गए कमिट को जान सकते हैं, और प्रत्येक शाखा के लिए शीर्ष आपकी साइट पर आता है। ऐसा करने से, आपके पास अपने रेपो की संरचना और एक विशिष्ट शाखा से संबंधित संचार पर एक अच्छा विचार है। मैं पढ़ लगता है कि यह हो सकता है मदद करते हैं।


0

मुझे पता है कि इस एक के लिए बहुत देर हो चुकी है ... लेकिन यहाँ एक (इतना सरल नहीं है) जो आप देख रहे थे पाने के लिए ऑनलाइनर:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • हम शाखा नाम और वास्तविक शाखा वाले राज्यों के सापेक्ष पदों git show-branch(चेतावनी भेजते हुए /dev/null) के साथ सूचीबद्ध कर रहे हैं ।
  • फिर हम केवल उन ब्रांच के अंदर अपनी शाखा का नाम रखते हैं grep -E "\[$BRANCH_NAME"
  • जहाँ वास्तविक $BRANCH_NAMEप्राप्त होता है git branch | grep -E '^\*' | awk '{ printf $2 }'(किसी तारे के साथ शाखा, उस तारे के बिना प्रतिध्वनित)।
  • अपने परिणामों से, हम शुरुआत में निरर्थक रेखा को हटा देते हैं tail -n+2
  • और फिर, हम fianlly के [$BRANCH_NAME]साथ पूर्ववर्ती सब कुछ को हटाकर आउटपुट को साफ करते हैं sed -E "s/^[^\[]*?\[/[/"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.