Git - विशिष्ट शाखा की पहली प्रतिबद्धताओं को कैसे खोजें


93

निम्नलिखित उदाहरण पेड़ में:

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)

मैं एफ की तलाश कर रहा हूं - xxx शाखा में पहली प्रतिबद्ध। मुझे लगता है कि यह संभव है:

git log xxx --not master

और अंतिम सूचीबद्ध प्रतिबद्ध एफ होना चाहिए। क्या यह सही समाधान है या शायद इसके कुछ नुकसान हैं?

मुझे पता है कि स्टैकओवरफ्लो पर इसी तरह के सवाल थे, लेकिन किसी ने भी इस तरह के समाधान का प्रस्ताव नहीं किया, और मुझे यकीन नहीं है कि मैं इसे सही करूंगा।


के संभावित डुप्लिकेट stackoverflow.com/questions/6058308/...
nyzm

जवाबों:


111
git log master..branch --oneline | tail -1

जहां "शाखा" आपका विशिष्ट शाखा नाम है। डॉट-डॉट आपको उन सभी कमिटों को देता है जो शाखा के पास है जो मास्टर के पास नहीं है। tail -1पिछले आउटपुट से अंतिम पंक्ति देता है।


3
यह केवल तभी कार्य करता है यदि `शाखा` शीर्षलेखक। यदि शाखा हटाई जाती है तो आप इसे कैसे करेंगे?
20

2
@ Oz123 की शाखा को HEAD या sha1 या किसी टैग द्वारा बदला जा सकता है। लेकिन स्पष्ट रूप से आपको किसी प्रकार के संदर्भ की आवश्यकता है।
Zitrax

3
मुझे वह नहीं दिया जो मैं उम्मीद कर रहा था। मेरी शाखा (पुरानी एक) को पहले से ही मास्टर में वापस मिला दिया गया था, जिसका अर्थ है कि xxx में सभी संचार पहले से ही मास्टर हैं। फिर भी - मुझे यह जानने की जरूरत है कि उस शाखा में पहला कौन सा वचन था - या वास्तव में - मुझे अकेले उस शाखा के आवागमन के इतिहास की जांच करने की आवश्यकता है - मुझे परवाह नहीं है कि वे मास्टर हैं या नहीं।
मोति श्नोर

1
@MottiShneor इस बात पर निर्भर करता है कि आपने कैसे विलय किया, जो मुश्किल हो सकता है। यदि आपने एक तेज़-फ़ॉरवर्ड किया, तो ऐसा लगता है कि शाखा कभी अस्तित्व में नहीं थी। अन्यथा, आपको इस उत्तर में दिलचस्पी हो सकती है , जो शाखा बिंदु को खोजने के कई तरीकों को सूचीबद्ध करता है। एक बार जब आपके पास अपनी शाखा बिंदु होता है, तो SHA प्रतिस्थापित कर सकता है master, और जब तक आपकी शाखा हटा नहीं दी जाती है, तब git log <sha>..branch --oneline | tail -1भी आपको वे परिणाम देने चाहिए जो आप खोज रहे हैं।
ND Geek

1
आप --reverseरंगों के साथ पीछे की ओर लॉग्स पढ़ने के लिए उपयोग कर सकते हैं , आदि
डोमिनिक

8

आपको उस merge-baseकार्यक्षमता का उपयोग करना चाहिए जिसे वास्तव में इसे हल करने के लिए डिज़ाइन किया गया है:

git merge-base remotes/origin/<branch> develop 

मुझे नहीं लगता कि अगर आप मूल कांटे के बिंदु पर वापस जाने की इच्छा रखते हैं तो यह काम करेगा। यदि आप मर्ज में विकसित होते हैं तो शाखा </ b> मर्ज-बेस मूल कांटा बिंदु की तुलना में नया होगा।
अलेक्जेंडर मिल्स

5
इसके अलावा, यह एफ की ओर इशारा नहीं करेगा , लेकिन मास्टर शाखा में एक प्रतिबद्धता (हालांकि ओपी के ड्राइंग में देखना मुश्किल है, बी या सी लगता है)।
रोमेनवेलरी


1

यदि आपकी शाखा (पुरानी एक) एक बार फिर से मास्टर में विलय हो जाती है तो अपेक्षित परिणाम नहीं मिलता है। मैंने प्रारंभिक शाखा कमिट आईडी खोजने के लिए अजगर स्क्रिप्ट का उपयोग किया है।

git रि-लिस्ट --first- पैरेंट चेंजेस

-पहले माता-पिता मर्ज कमिट देखने के बाद केवल पहले माता -पिता का पालन करते हैं।

माता-पिता की शाखा मिलने तक, उपर्युक्त आदेश से परिवर्तन के परिवर्तन।

def status_check(exec_command, exec_dir=None, background=False):
    if exec_dir:
        os.chdir(exec_dir)
    res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if not background:
        result = res.communicate()
    return result



def findNewBranchCommits(changeset=None):
    cmd = "git rev-list --first-parent "+ changeset
    rev_list = status_check(cmd,self.module_dir)
    rev_list = str(rev_list[0]).split('\n')
    rev_list = list(filter(None, rev_list))
    for x in rev_list:                      # Iterate until branch base point
        rev_cmd = "git branch --contains " + x
        rev_cmd = status_check(rev_cmd,self.module_dir)
        rev_cmd = str(rev_cmd[0]).split('\n')
        if(len(rev_cmd) > 2): 
            print "First Commit in xxx branch",x
            break

findNewBranchCommits(changeset)

0
git cherry master -v | tail -1   

हालाँकि, यह आपको केवल शाखा xxx पर पहली प्रतिबद्ध देगा जो कि गुरु में नहीं है, शाखा xxx पर पहली प्रतिबद्ध नहीं है। उत्तरार्द्ध मुश्किल होगा यदि शाखा xxx को हटा दिया गया है और / या एक या अधिक बार फिर से बनाया गया है। यह मामला है कि आप निम्नलिखित की कोशिश कर सकते हैं:

git reflog | grep checkout | grep xxx | tail -1   

3
क्या आपको head -n 1इसके बजाय लिखने का मतलब था tail -1? tail -1पहले के बजाय सबसे हालिया कमिट लौटाता है।
नेल्लू

0

मैंने इस कमांड की कोशिश की और यह काम किया:

git log <source_branch> <feature_branch> --oneline | tail -1

-1

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1


मेरे रेपो में यह मास्टर को शाखा xxx में अंतिम विलय के बाद से पहली प्रतिबद्धताओं को दिखाता है, शाखा xxx की पहली प्रतिबद्धताओं को नहीं।
197 बजे jk7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.