git - Merging without changing the working directory -
मेरे पास निम्न परिदृश्य है:
* ab82147 (हेड, विषय) परिवर्तन * 89 9 3636 परिवर्तन * 82f4426 परिवर्तन * 18बी 5 ए 3 (मास्टर) पहले
मैं मर्ज करना चाहते हैं (गैर फास्ट फॉरवर्ड) topic
में master
। यह मेरे लिए निम्न है:
-
git चेकआउट मास्टर
-
git मर्ज --no-ff विषय
लेकिन मास्टर की जाँच कर रहा है, और उसके बाद विषय में विलय करने के कारण git को मेरी कार्यशील निर्देशिका बदलना पड़ता है (हालांकि अंतिम परिणाम मास्टर की जांच करने से पहले एक जैसा है), और मेरे पास समस्या है हमारे प्रोजेक्ट के आकार के कारण, इसे बनाने के लिए लगभग 30 मिनट लगते हैं (IncrediBuild के साथ) हालांकि कुछ भी वास्तव में बदल नहीं है और यह बस असहनीय है।
तो मुझे क्या करना है, निम्न है:
<पूर्व> * 9075cf4 (हेड, मास्टर) मर्ज शाखा 'विषय' | \ | * Ab82147 (विषय) में परिवर्तन। | * 8993636 परिवर्तन | * 82f4426 परिवर्तन / / 18be5a3 पहले
वास्तव में काम कर रहे निर्देशिका को छूने के बिना (या कम से कम किसी भी तरह git धोखाधड़ी)।
दिलचस्प है! मुझे नहीं लगता कि ऐसा करने के लिए एक अंतर्निहित तरीका है, लेकिन आप इसे पाइपलाइन का उपयोग करने में सक्षम होना चाहिए:
#! / Bin / bash branch = master # या कोई तर्क ले लो: # अगर [$ @ इक् 1]; # Branch = "$ 1"; # Fi # सुनिश्चित करें कि शाखा मौजूद है अगर! Git rev-parse --verify --quiet --heads "$ branch" & gt; / Dev / बातिल; फिर "त्रुटि: शाखा $ शाखा मौजूद नहीं है" से बाहर निकलें "# 1 से बाहर निकलें" यह सुनिश्चित करें कि अगर यह ["$ (जीआईटी मर्ज-बेस हेड $ शाखा)" = $ "$ (git rev-parse $ branch ) "]; फिर # हेड currentbranch = $ (git प्रतीकात्मक-रीफ हेड | sed @। * / @@ ') के साथ संबद्ध शाखा का नाम ढूंढें # प्रतिबद्ध कमांड = $ (इको "मर्ज शाखा' $ currentbranch '' '| git commit -ट्रेट $ (जीआईटी लॉग-एन 1 - एनपीटीआई =% टी हेड) -पी $ शाखा -पी हेड) # शाखा को नए कमेंट जीआईटी अपडेट-रेफरी-एम "को इंगित करें $ currentbranch मर्ज करें: सिम्युलेटेड No-ff "refs / heads / $ branch" $ newcommit else गूंज "त्रुटि: $ currentbranch को $ शाखा में विलय करना एक तेज़ अग्रेषित नहीं होगा" exit 1 fi
दिलचस्प बिट यह है कि newcommit =
लाइन; यह मर्ज कमिट को सीधे बनाने के लिए प्रतिबद्ध-पेड़ का उपयोग करता है। पहला तर्क है कि उपयोग करने के लिए पेड़; यह पेड़ के सिर, जिसकी सामुग्री आप रखना चाहते हैं प्रतिबद्ध संदेश stdin पर आपूर्ति की जाती है, और शेष तर्क नए माता-पिता के पास होना चाहिए। प्रतिबद्ध की SHA1 को stdout पर मुद्रित किया जाता है, इसलिए सफल होने पर, आप उस पर कब्जा करते हैं, फिर उस पर विलीन हो जाते हैं (जो कि तेज़ी से आगे बढ़ेगा)। यदि आप जुनूनी हो, तो आप यह सुनिश्चित कर सकते हैं कि कमिट-ट्री सफल हो गया है - लेकिन यह बहुत अधिक गारंटी की जानी चाहिए।
सीमाएं:
- यह केवल मर्ज पर काम करता है < Em> हो सकता था एक तेज़-आगे जाहिर है आपको उस मामले में वास्तव में बाहर की जाँच करनी होगी (संभवतः एक क्लोन में, आपका बिल्ड सिस्टम सहेजने के लिए)।
- रेफरल संदेश अलग है। मैंने जानबूझकर यह किया है, क्योंकि जब आप
- no-ff
का उपयोग करते हैं, तो गिट वास्तव में डिफ़ॉल्ट (पुनरावर्ती) रणनीति का उपयोग करने के लिए खुद को मजबूर करेगी, लेकिन यह लिखने के लिए कि पुनर्जन्म में एक झूठ होगा। - यदि आप अलग हैंड मोड में हैं, तो चीजें बुरी तरह से जाएंगी। इसका विशेष रूप से व्यवहार करना होगा।
और हाँ, मैंने इसे एक खिलौना रेपो पर परीक्षण किया है, और यह ठीक से काम करने लगता है! (हालांकि मैंने इसे तोड़ने की कोशिश नहीं की।)
Comments
Post a Comment