Git: दो शाखाओं के सबसे हाल के सामान्य पूर्वजों का पता लगाएं


844

दो गिट शाखाओं का सबसे हाल का सामान्य पूर्वज कैसे खोजें?


3
सबसे हाल ही में परिभाषित करें: वास्तविक दुनिया का समय, कमिट की संख्या, अन्य मीट्रिक?
सिरो सेंटिल्ली :51 病毒 iro i 法轮功 '

2
प्रासंगिक (
क्राइस

1
@CiroSantilli 新疆 IC IC 996ICU 事件 the यह किसी भी मीट्रिक में समान है, है ना?
याकॉव

@YakovL का मानना ​​है कि मैं ब्रांचिंग के कारण नहीं हूं और क्योंकि आप अपनी प्रतिबद्ध वस्तुओं पर मनमाने ढंग से प्रतिबद्ध तारीखें निर्धारित कर सकते हैं: उस तारीख को संभवतः वह नहीं है जो आप चाहते हैं।
सिरो सेंटिल्ली 冠状 病毒 iro i 法轮功

1
@CiroSantilli 新疆 IC IC 996ICU 事件 to यह मुझे लगता है कि केवल तभी अलग हो सकता है जब पेड़ में अंतिम आम प्रतिबद्ध होने से पहले एक प्रतिबद्ध है जिसमें एक पुराना टाइमस्टैम्प है। क्या आप कम तुच्छ उदाहरण दे सकते हैं?
याकॉव

जवाबों:


1019

आप ढूंढ रहे हैं git merge-base। उपयोग:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

85
ध्यान दें कि यह सबसे हाल का सामान्य पूर्वज है ... जो मुझे विश्वास है कि प्रश्नकर्ता चाहता है, इसलिए +1। इसे ध्यान में रखते हुए, यदि कोई भी यहाँ सबसे पुराना सामान्य पूर्वज (जैसा मैंने किया था) खोजने की कोशिश कर रहा है - जिसके लिए, यह भी देखें: stackoverflow.com/questions/1527234/…
lindes

16
@ फर्राटेदार: या उसके लिए आशुलिपि:git log master...HEAD
सीबी बेली

17
@ लिंड्स सबसे पुराना सामान्य पूर्वज प्रारंभिक प्रतिबद्ध नहीं होगा?
थोरबजोर्न रेवन एंडरसन

8
@ ThorbjørnRavnAndersen, हाँ, मुझे लगता है कि ऐसा है ... वर्णन में कठिनाई इस तथ्य के साथ आती है कि गिट एक डायरेक्टेड एसाइक्लिक ग्राफ का उपयोग करता है, और फिर भी अक्सर इसे एक पेड़ के रूप में माना जाता है, जो तकनीकी रूप से नहीं है। अपने शब्दों में अधिक सावधानी बरतने के लिए, मैं उस मामले के बारे में बात कर रहा था जहाँ आप "शाखाओं" के पहले उदाहरण के अभिभावक को विचलन करना चाहते हैं ... क्योंकि उनके कई बिंदु हो सकते हैं जहाँ वे फिर से विलय और पुन: विभाजित हो जाते हैं, यह है इनमें से "सबसे पुराना", लेकिन वास्तव में सबसे पुराना पूर्वज नहीं है, जो (मुझे लगता है) हमेशा प्रारंभिक प्रतिबद्ध है।
lindes

5
जबकि यह प्रश्न दो शाखाओं के एक सामान्य पूर्वज को खोजने के बारे में कड़ाई से है , तीन या अधिक शाखाओं के सामान्य पूर्वजों को चाहने वाले किसी को भी ध्यान देना चाहिए कि उन्हें --octopusसही परिणाम प्राप्त करने के लिए ध्वज को पारित करने की आवश्यकता है । स्पष्ट-लेकिन-गलत git merge-base branch1 branch2 branch3आपको एक वचन देगा, लेकिन, जैसा कि डॉक्स में चर्चा अनुभाग में वर्णित है, यह आवश्यक रूप से सभी तीन शाखाओं का एक सामान्य पूर्वज नहीं है।
मार्क अमेरी

46

git diff master...feature

आपके वर्तमान (संभवत: मल्टी-कमिट) सुविधा शाखा के सभी नए संचार दिखाता है।

man git-diff दस्तावेज़ जो:

git diff A...B

के समान है:

git diff $(git merge-base A B) B

लेकिन ...टाइप करना और याद रखना आसान है।

जैसा कि डेव ने उल्लेख किया है , विशेष मामले को HEADछोड़ा जा सकता है। इसलिए:

git diff master...HEAD

के समान है:

git diff master...

यदि वर्तमान शाखा है तो पर्याप्त है feature

अंत में, याद रखें कि आदेश मायने रखता है! ऐसा करने git diff feature...masterसे परिवर्तन दिखाई देंगे जो चालू masterनहीं हैं feature

मैं चाहता हूं कि अधिक git कमांड उस सिंटैक्स का समर्थन करेंगे, लेकिन मुझे नहीं लगता कि वे करते हैं। और कुछ के लिए अलग-अलग शब्दार्थ भी हैं ...: डबल कमिट ".." और ट्रिपल-डॉट "" के बीच अंतर क्या है?


8
या सिर्फ अलग git diff master...करने के विशेष मामले मेंHEAD
डेव

"..." ने शक्तियुक्त तरीके से मेरे लिए काम नहीं किया, मजाकिया तौर पर गिट कंसोल में काम किया शायद रेपो पूरा नहीं हुआ था, git diff $ (git मर्ज-बेस AB) B किया था और चूंकि मैं git के लिए थोड़ा नया हूं मैं थोड़ा सशंकित था कि यह शाखाओं का विलय कर सकता है :)
Moiz Ahmed

1
वाह। सचमुच अद्भुत। और यदि आप जिस शाखा को चाहते हैं वह आपके स्थानीय रेपो में मौजूद नहीं है क्योंकि आपने इसे कभी नहीं देखा है, तो आप बस कर सकते हैंgit diff origin/branchname...
मार्क च

25

जैसा कि एक पूर्व उत्तर में उल्लेख किया गया है, git merge-baseकाम करता है:

$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

लेकिन अगर myfeatureवर्तमान शाखा है, जैसा कि आम है, आप उपयोग कर सकते हैं --fork-point:

$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

यह तर्क केवल पर्याप्त रूप से हाल के संस्करणों में काम करता है। दुर्भाग्य से, यह हमेशा काम नहीं करता है, और यह स्पष्ट नहीं है कि क्यों। कृपया इस उत्तर के अंत में दी गई सीमाओं को देखें ।


पूर्ण जानकारी के लिए, विचार करें:

$ git log -1 $(git merge-base --fork-point develop) 

मेरे पास है git version 2.14.1.windows.1git merge-base --fork-point branch2एक शाखा के साथ चल रहा है (अपने स्वयं के साथ) जो मुझे पता है कि वर्तमान शाखा git merge-base branch1 branch2से कांटा गया है , इससे कोई परिणाम नहीं मिलता है, जबकि सही ढंग से कांटा बिंदु दिखाता है। क्या समस्या हो सकती है?
एडीटीसी

@ADTC चेकआउट करें branch2और फिर चलाएं git merge-base --fork-point branch1
एक्यूमेनस

@ADTC gitkयह देखने के लिए कि चित्र कैसा दिखता है , चित्रमय प्रतिबद्ध दर्शक, जैसे , आदि का उपयोग करें । शायद आपको अपना जवाब मिल जाएगा।
एक्यूमेनस

मैं पेड़ के बारे में कुछ भी अजीब नहीं देखता हूं क्योंकि मैं इसे ग्राफिक रूप से देखता हूं। मैं रास्तों का पता लगा सकता हूं और सामान्य पूर्वजों को खोज सकता हूं जो के परिणाम से मेल खाता है git merge-base branch1 branch2। लेकिन अजीब बात यह है कि --fork-pointकुछ भी नहीं देता है। क्या आपने पुष्टि की है कि यह आपके लिए काम करता है?
ADTC

1
मुझे वही मिलता है जो @ADTC। कमांड 'git log -1 $ (git मर्ज-बेस --fork-पॉइंट एक और ब्रंच)' git संस्करण 2.16.2.windows.1 का उपयोग करके कोई परिणाम नहीं दिखाता है।
मसिंजर

10

gitkआप दो शाखाओं को रेखांकन के साथ देख सकते हैं:

gitk branch1 branch2

और फिर दो शाखाओं के इतिहास में सामान्य पूर्वजों को खोजना आसान है।


6
हर मामले में हर चीज दृष्टिगोचर नहीं की जा सकती। ऐसे कारण हैं कि चीजों को प्रोग्रामेटिक रूप से स्वचालित करने की आवश्यकता हो सकती है।
ADTC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.