2012-01-12 5 views
11

मैं वर्तमान में गिट की कई सामग्री ट्रैकिंग सुविधाओं को देख रहा हूं। यह जानना बहुत अच्छा है कि गिट मुझे कोड को समझने की अनुमति देता है जिसे एक फ़ाइल से दूसरे में स्थानांतरित कर दिया गया है, लेकिन मैं सोच रहा हूं कि यह सुविधा विलय में संघर्ष समाधान करते समय उपयोग करने योग्य कैसे है।स्थानांतरित सामग्री को सही ढंग से मर्ज करने के लिए गिट कैसे प्राप्त करें (न केवल फाइलें)

मैं दो फ़ाइलों hello.cc और bye.cc बनाया है:

यहाँ परिदृश्य है। मैं एक शाखा topic शुरू करता हूं और hello.cc से bye.cc पर कुछ कोड ले जाता हूं। अगर मैं अब git blame -C bye.cc करता हूं तो मैं देख सकता हूं कि यह कोड मूल रूप से hello.cc से आया है जो जानना अच्छा है। हालांकि अब मैं स्थानांतरित सामग्री के बिना मूल शाखा में स्विच करता हूं और hello.cc में अनुभाग के भीतर कुछ कोड बदलता हूं जो कि अन्य प्रतिबद्धता में स्थानांतरित हो गया है। अगर मैं अब git merge topic करता हूं तो मुझे hello.cc के लिए संघर्ष मिलता है। हालांकि जब तक मैं एक diff3 शैली का उपयोग नहीं करता (जो मैं यद्यपि करता हूं), मैं केवल यह देख सकता हूं कि इस विधि को अन्य शाखा में hello.cc से हटा दिया गया है, लेकिन यह नहीं कि बाद में इसे बदल दिया गया है। bye.cc पर भी संघर्ष करना अच्छा होगा, क्योंकि यह जांचना आवश्यक होगा कि अन्य शाखाओं के उन परिवर्तनों को कोड में दोबारा लागू किया जाना है या नहीं। क्या यह किसी भी तरह से संभव है?

मुझे पता है कि मैं मैन्युअल रूप से पता लगा सकता हूं कि कोड git blame --reverse -C topic... कर कर स्थानांतरित हो गया है। हालांकि, इस संभावना को समझने में मुझे थोड़ी देर लग गई और शायद अन्य लोगों को इसके बारे में पता नहीं चलेगा। दूसरे के लिए मैं आलसी हूं और शायद यह भूल जाऊंगा कि कोड स्थानांतरित हो सकता है। साथ ही मुझे यकीन नहीं है कि यह तब काम करता है जब कोड एक से अधिक फाइलों में स्थानांतरित हो जाता है।

इस स्थिति को यथासंभव सुरक्षित रखने का आपका तरीका क्या होगा?

संपादित:

मैं सिर्फ पता चला कि git blame --reverse -C hello.cc $(git merge-base HEAD topic)..topic भी पता लगाने के लिए जहां सामग्री ले जाया गया काम करता है। और अगर मैं सही ढंग से गिट समझता हूं, तो यह शायद तेज़ है, क्योंकि यह पूर्ण भंडार में सामग्री की पूर्ण खोज नहीं करेगा।

संपादित:

मैं भंडार मैं उपयोग कर रहा हूँ अपलोड github के लिए चारों ओर खेलने ताकि आप अपने आप के लिए मर्ज की कोशिश कर सकते हैं। जिस प्रतिबद्धता को मैंने समारोह में स्थानांतरित किया वह विषय शाखा में है। वह वचन जहां शाखा में उसी कार्य को मास्टर merge_here के हेड पर मास्टर में बदल दिया गया है। मास्टर में एक अतिरिक्त प्रतिबद्धता है जिसमें मैं कुछ अन्य विलय तकनीकों के साथ खेल रहा था, जिसे आपको इस प्रश्न के लिए अनदेखा करना चाहिए।

उत्तर

5

मुझे डर है कि गिट के लिए स्वचालित रूप से मर्ज करने और विवादों का उत्पादन करने के लिए स्थानांतरित कोड को पहचानना संभव नहीं है, जब तक कि पूरी फाइलों का नाम बदल नहीं जाता है।

इस विषय पर पहले से ही कुछ चर्चाएं हुईं, जैसे how does git handle merging code that was moved to a different file? और git merge: apply changes to code that moved to a different file

-4

आप अपनी प्रतिबद्धता में जो भी डाल सकते हैं उसे गिट का उपयोग कर सकते हैं, यह ठीक काम करेगा।

+0

हाँ यकीन । मुझे यह पता है। लेकिन गिट को पाने के लिए सबसे अच्छा तरीका क्या है कि मुझे उपकरण के उपयोग के माध्यम से या संघर्ष विलय के माध्यम से, प्रतिबद्धता में क्या डालना है, इस पर संकेत देने और चेतावनी देने का सबसे अच्छा तरीका क्या है। – LiKao

0

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

रखें कोड आंदोलन, परिवर्तन

GIT ऐसे मामलों ट्रैक नहीं कर सकते से अलग अब के लिए के रूप में। और ऐसा लगता है कि फ़ाइल चाल के बाद संभावित समस्याओं को समझने के लिए कोई त्वरित/स्वचालित समाधान नहीं है और फिर विलय करें।

यहां तक ​​कि अगर आपको पता चल जाएगा दोनों करता है जहां समस्या हुआ है, और पैच लागू या वापस लौटने चाल के बाद खो परिवर्तन + विलय करने की कोशिश करेंगे, तो आप अभी भी एक जैसे Git से अस्वीकार मिल जाएगा:

'git apply' failed with code 1:'error: patch failed: filename.js:81' 
संबंधित मुद्दे