2013-06-07 7 views
6

में विशिष्ट फ़ाइलों को मर्ज करने मान लीजिए मैं php फ़ाइलों के 100s के साथ मास्टर शाखा पर एक परियोजना है। परियोजना में एक बग फिक्सिंग करने के लिए, मैं एक अलग शाखा बनानेकैसे Git

git checkout -b bugfix 

तो (जैसे index.php, register.php और login.php के लिए) 3 फाइलों में बग फिक्सिंग के बाद, मैं इसे में विलय मास्टर शाखा

git checkout master 
git merge bugfix 

ऊपर कोड सभी 3 फ़ाइलों में मर्ज हो जाएगी मैं परिवर्तन किए हैं, लेकिन है कि मैं केवल 2 फ़ाइलें विलय करने के लिए मजबूर कर सकते हैं GIT वहाँ वैसे भी है, login.php कहना और केवल register.php?

+1

मुझे लगता है कि एक ही तरीके से उन दो फाइलों को एक प्रतिबद्धता में और दूसरे में अंतिम रूप देने के लिए एक तरीका होगा, मुझे लगता है कि आप एक प्रतिबद्धता निर्दिष्ट कर सकते हैं और उस पर विलय कर सकते हैं। – dutt

+0

@dutt ओपी समस्या यह है कि फ़ाइल परिवर्तन पहले से ही प्रतिबद्ध हैं, मुझे लगता है। – arkascha

+0

शायद यह एक तरीका खोजने में मदद कर सकता है http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge – hellectronic

उत्तर

0

Git में एक आंशिक मर्ज रिकॉर्ड करने के लिए कोई तरीका नहीं है, सभी का आपस में विलय सब करता विलय कर दिया जा रहा है की पूरी जड़ पेड़ विलय करना होगा।

आप निश्चित रूप से माता-पिता में से किसी एक की फ़ाइलों की अपरिवर्तित प्रति चुनकर उस विलय को हल करने का विकल्प चुन सकते हैं, लेकिन यह अभी भी एक "पूर्ण" विलय है और उस फ़ाइल में हुए परिवर्तनों को विलय माना जाएगा जब आने वाली शाखाओं के बीच आने वाले विद्रोह या विलय की बात आती है।

0

नहीं, एक सीधा रास्ता मौजूद नहीं है। हालांकि; आप उस शाखा से फ़ाइलों का चयन कर सकते हैं जिन्हें आप मर्ज करना चाहते हैं और उन्हें मास्टर शाखा में मौजूदा लोगों पर ओवरराइट कर सकते हैं। आदेश में आदेश में किया जाएगा:

git checkout master 
git show bugfix:login.php > login.php 
git show bugfix:register.php > register.php 
git add . 
git commit -m "Select login and register from branch/bugfix" 

ठीक है, उपरोक्त विधि "नष्ट" फ़ाइल इतिहास होगा। this mailing list में इसके बारे में एक पुरानी चर्चा है।

एक तकनीकी दृष्टिकोण से, बात इतिहास बात है कि बनाता है (और क्यों "तिथि के क्रम में प्रतिबद्ध के सेट" बेकार है), क्योंकि यह हमें पूर्वज एक ही थे देता है! और कि एकमात्र चीज है जो मायने रखती है।

अब, क्या प्रति-फ़ाइल इतिहास कर के साथ मौलिक रूप से गलत है?

अब, अगर आप इस तर्क का पालन किया है, तुम्हें जाना चाहिए "Aaahh! स्पष्ट!"।

पूरे पैराग्राफ को अनदेखा करना; आप वैकल्पिक हल मिल जाएगा:

git diff commit..othercommit filename | git-apply --index && git commit 

आपके मामले में, commit = आप सिर/मास्टर शाखा के हैश; और othercommit = बगफिक्स शाखा का हैश।

+0

यह शाखा को 'मास्टर' में विलय नहीं करता है। – axiac

3

निम्नलिखित समाधान a blog post

से अपनाया जाता है यह पता चला कि चेकआउट भी इस मामले में सहायक हो सकता है। आप बस एक और शाखा से (चेकआउट) उन विशिष्ट फ़ाइलों कॉल आउट कर सकते हैं:

# switch to the branch you want to be your merge destination 
git checkout master 

# checkout specific files from specific branch 
git checkout bugfix login.php register.php 

# check the status 
git status 

# merge them in 
git commit -m "your merge comment" 
+0

यह शाखा को 'मास्टर' में विलय नहीं करता है। – axiac

+1

@axiac यदि आप सावधानी से प्रश्न पढ़ते हैं तो आपको पता चलेगा कि सवाल एक शाखा विलय करने के बारे में नहीं है, यह एक फाइल विलय करने के बारे में है (जो किसी अन्य शाखा से वांछित शाखा में एक विशिष्ट फाइल लाने के लिए गलत शब्दावली है)। उपर्युक्त समाधान –

0

आप व्यवहार आप चाहते हैं, लेकिन क्या परिवर्तन आप तीसरे फ़ाइल पर किया था के साथ होता है अनुकरण कर सकते हैं?

तीसरे फ़ाइल पर परिवर्तन शाखा पर प्रतिबद्ध में रहते हैं, लेकिन वे वर्तमान में विलय कर दिया में प्रतिबद्ध नहीं हो जाएगा, यह है की तरह फ़ाइल शाखा पर बिल्कुल भी बदला नहीं गया था।

इस तरह आप यह कर सकते हैं है:

git checkout master 
git merge bugfix --no-commit 

--no-commit विकल्प git बताता फ़ाइलें विलय लेकिन उन्हें करने से पहले रोकने के लिए। अब आप फाइलों का निरीक्षण कर सकते हैं, उन्हें बदल सकते हैं, जो कुछ भी आप चाहते हैं। आदेश परिवर्तन आप index.php पर किया था रद्द करने के लिए आप चला सकते हैं:

git checkout master -- index.php 

git status चल रहा है आप देख सकते हैं के रूप में किसी भी अधिक संशोधित (सूचकांक में या काम कर पेड़ में न तो) कि index.php प्रकट नहीं होता है। अब आप git commit कर सकते हैं और यह सब कुछ है।

+0

काम करता है यह समाधान सभी फ़ाइलों को बदलने जैसा है और फिर गड़बड़ को मैन्युअल रूप से सही करने का प्रयास करें !! [इस पोस्ट] को पढ़ें (http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/) यह ढेर क्या है इसके बारे में है और आपका समाधान समय और श्रमिक काम का अपशिष्ट क्यों है। –