मैं गिट में बाइनरी फाइलों के साथ दो शाखाएं रखने की कोशिश कर रहा हूं - एक "विकास" और एक "स्थिर"। विकास शाखा में इन फ़ाइलों के कई बदलाव हो सकते हैं इससे पहले कि मैं उन्हें स्थिर शाखा में "रिलीज़" करना चाहता हूं (और स्थिर शाखा में उन फ़ाइलों का नाम बदल दिया गया है, यदि यह प्रासंगिक है)।गिट मर्ज स्क्वैश बार-बार
मैं सामान्य विलय कर सकता हूं, यह ठीक काम करता है, लेकिन "स्थिर" शाखा खींचते समय बहुत अधिक इतिहास को संरक्षित करता है, "विकास" शाखा से सभी मध्यवर्ती कार्य भी खींचे जाते हैं (क्योंकि वे माता-पिता होते हैं) । लेकिन हम बाइनरी फाइलों के बारे में बात कर रहे हैं जिनके पास कोई समझदार विलय रणनीति नहीं है (उनके/हमारे को छोड़कर), इसलिए विकास शाखा पर फ़ाइलों का वास्तविक इतिहास बेकार है। जब मैं "स्थिर" शाखा खींच, मैं इस मिल:
X-------------------G stable / / a---b---c---d---e---f---g development
क्योंकि जी विकास शाखा में एक माता पिता है, मैं विकास शाखा के पूरे इतिहास (के लिए सी, डी, ई, एफ डेटा वस्तुओं मिलता है और जी) मेरे भंडार में, जिसमें मुझे कोई दिलचस्पी नहीं है (एक्स बी के समान है, कुछ फ़ाइल नामांकन लागू होने के साथ)।
तो मैंने विकास शाखा से स्थिर शाखा तक git merge --squash
परिवर्तनों की कोशिश की। इस तरह की पहली मर्ज और प्रतिबद्ध ठीक चला गया, परिणाम अपेक्षित थे के रूप में (प्रतिबद्ध संदेश, विकास शाखा से कोई संबंध नहीं में अच्छे परिवर्तन लॉग):
X-------------------G stable / a---b---c---d---e---f---g development
बाद मैं इस कुचल शाखा स्थिर खींच, मुझे इस मिल मेरी भंडार है, जो मैं चाहता:
a---b---X---G
लेकिन दूसरे मर्ज करना विफल (क्योंकि Git कोई रास्ता पता करने के लिए कितना मैं पहले से ही विलय कर दिया और उलझन में मिल गया था)।
- क्या किसी भी तरह से दो माता-पिता के साथ "विलय प्रतिबद्धता" उत्पन्न किए बिना विलय को रिकॉर्ड करना संभव है?
- या, क्या एसवीएन में संशोधन की केवल एक निश्चित "सीमा" को मर्ज करने के लिए गिट को बताना संभव है?
- या, खींचते समय दूसरी शाखा से सभी रेफरी डाउनलोड किए बिना सामान्य विलय करना संभव है?
- या मुझे प्रश्न में फाइलों के लिए एक कस्टम मर्ज ड्राइवर प्रदान करना चाहिए, जो कि "उनके" संस्करण को "हमारे" में बदल देता है, जिससे संघर्ष हल हो जाता है? मुझे अभी भी डर है कि
--squash
हमेशा पूरे इतिहास को मर्ज करने की कोशिश करेगा, आम माता-पिता तक, मेरी समस्या का केवल आधा हल करेगा।
अद्यतन: रिबेसिंग
मैं सही ढंग से रिबेसिंग को समझते हैं, मैं इस के साथ खत्म हो जाएगा:
X stable / a---b---c---d---e---f---g development
कौन सा मुझे हो जाता है सभी डेटा मैं (ग में कोई दिलचस्पी नहीं हूँ , डी, ई, एफ) और बोनस के रूप में, मैं जानकारी खो दूंगा कि बी शाखा में एक स्थिर संस्करण था।
प्रत्येक विकास संशोधन भंडार आकार में लगभग 5 एमबी जोड़ता है (और पूरे रेपो को केवल 10% घटता है), "स्थिर" शाखा लगभग मुफ्त में आती है (डेटा पहले से मौजूद है)। मैं केवल नई 5 एमबी खींचने के लिए स्थिर शाखा से एक नया संशोधन खींचना चाहता हूं, लेकिन एक्स से जी से 25 एमबी डाउनलोड करने के बजाय, क्योंकि मैं किसी भी तरह से यह कहने में सक्षम नहीं हूं कि मुझे सी, डी की सामग्री की परवाह नहीं है , ई और एफ।
यह बहुत अच्छा लग रहा है, लेकिन मुझे समझ में नहीं आता कि अस्थायी शाखा बनाने के लिए इसकी आवश्यकता क्यों है और फिर इसका नाम बदलें। क्या ऐसा इसलिए है क्योंकि आप अभी भी प्रतिबद्ध होने के बाद अलग हैं? –
@ किम-सुलिवान: "बिल्कुल क्यों": जब आप उपरोक्त उदाहरण में प्रतिबद्धता करते हैं, तो यह नई प्रतिबद्धता को इंगित करने के लिए 'HEAD' चलाता है लेकिन 'स्थिर' नहीं होता है - सिर अभी भी" अलग "होता है, और' स्थिर 'अभी भी पिछले संस्करण (एक्स, आपके मूल उदाहरण में) को इंगित करता है। शाखा करना और नाम बदलें (चेकआउट तकनीकी रूप से वैकल्पिक है, हालांकि इसके बिना आपको 'गिट शाखा-एम' के लिए तर्कों की आपूर्ति करने की आवश्यकता होगी, और आप अभी भी अलग हो जाएंगे, जो संभवतः गैर-वांछनीय है) स्थिर बिंदु पर कारण बनता है जे के लिए (उत्तर प्रति)। – lindes
इसके अलावा: आपको सूचनाओं के लिए आदेशों की इस श्रृंखला के साथ प्रत्येक बिंदु पर 'गिट लॉग - ग्राफ़ - ऑनलाइन - सभी - डिकोरेट' और 'गिट स्थिति' चल रहा है। और/या .git /, शायद 'grep' के साथ विभिन्न फ़ाइलों की सामग्री को देख रहे हैं। .git/HEAD .git/refs/head/* ' – lindes