स्रोत कोड को पुन: सक्रिय करते समय, कभी-कभी आपको किसी फ़ाइल के अंदर टेक्स्ट के बड़े ब्लॉक या यहां तक कि एक नई फ़ाइल को स्थानांतरित करने की आवश्यकता होती है। आप एक शाखा refactored
बना सकते हैं और दूर के लिए प्रतिबद्ध:स्थानांतरित सामग्री का पालन करने के लिए गिट को बताएं (केवल फ़ाइलों को स्थानांतरित नहीं किया गया)
$git checkout master
$git branch refactored
$git checkout refactored
<move code around>
$git commit -m "refactored code"
हालांकि, लोगों को वर्ष पूर्व refactor शाखा के शीर्ष पर प्रतिबद्ध हो सकता है, कोड है कि ले जाया गया था बदल रहा है:
$git checkout master
<change code that was moved elsewhere on branch refactored>
$git commit -m "bugfix"
शाखा refactored
पर, आप तो master
में किए गए परिवर्तनों को शामिल करना चाहते हैं:
$git checkout refactored
$git merge master
<giant merge conflict>
यह एक बड़ा मर्ज संघर्ष की ओर जाता है। अगर गिट को बताने का कोई तरीका था कि सामग्री को आसानी से स्थानांतरित किया गया था, तो स्वचालित रूप से विलय करना संभव होना चाहिए।
<fix conflicts>
$git commit -m "merge master into refactored"
$git checkout master
<change more code>
$git commit -m "bugfix2"
$git checkout refactored
$git merge master
<another giant merge conflict>
बिल्कुल इस परिहार्य है:
बदतर बात यह है कि, संघर्ष को हल करने और इसे करने से जाने के बाद भी, Git अभी भी संकल्प उपयोग नहीं कर सकते आगे मर्ज के यह पता लगाने की है? मैंने git rerere
को आजमाया है और यह यहां संघर्षों को हल नहीं कर सकता है। क्या किसी भी तरह से गिट एक विलोपन और सम्मिलन के बजाय, वास्तविक चाल के रूप में टेक्स्ट के ब्लॉक को स्थानांतरित करने के लिए देख सकता है? यदि यह नहीं हो सकता है, तो विलय विवादों को कम करने के लिए सबसे अच्छा तरीका क्या है, यदि आपको थोड़ी देर के लिए दो समांतर शाखाएं रखने की आवश्यकता है?
हालांकि यह moving the contents of a complete file के लिए काफी आसान है, लेकिन मुझे केवल भाग को स्थानांतरित करने या उसी फ़ाइल के अंदर जाने पर जानकारी नहीं मिल सका।
इसके अलावा, यदि इसके लिए कोई समाधान है, तो git blame
का व्यवहार कोड पर क्या होगा? क्या यह रिफैक्टरिंग प्रतिबद्धता को इंगित करेगा, या इसे अनदेखा करेगा? क्या बाद में हासिल करने का कोई तरीका है?
मामले में किसी को भी रुचि है, मैं (बहुत कम) भंडार मैं on pastebin
संभावित समाधानों
के परीक्षण के लिए उपयोग कर रहा हूँ के एक बेस 64 इनकोडिंग tar.gz डाल दियाएक संभावित समाधान प्रदर्शन किया जा सकता है प्री-रिफैक्चरर्ड शाखा में हुए बदलावों के साथ एक (स्वचालित रूप से) संपादित पैच को लागू करके विलय करें। क्या ऐसा करने के लिए सॉफ्टवेयर विकसित किया गया है? इस दृष्टिकोण का उपयोग करके मुझे लगता है कि, चूंकि यह गिट के लिए पारदर्शी है, git blame
रिफैक्टरिंग प्रतिबद्धता को इंगित करेगा।
मुझे the same question, applied to diff मिला है। किसी मौजूदा गैर-स्वामित्व कार्यान्वयन में कोई उल्लेख नहीं है, लेकिन वहां एक एल्गोरिदम का उल्लेख है जो ब्लॉक आंदोलन को ट्रैक करता है
मैं सुझाव है कि आप और अधिक बनाने के लिए प्रतिबद्ध हैं। जब आप बहुत अधिक डेटा बदलते हैं, तो आपके पास अधिक प्रतिबद्धता होती है, कोड विलय करते समय कम समस्या होती है। – sensorario
@ सेंसरोरियो जो सामान्य रूप से एक अच्छा सुझाव है। मुझे यकीन नहीं है कि आप इसे रीफैक्टरिंग के लिए कैसे लागू करेंगे, हालांकि - एक समय में एक फ़ंक्शन/छोटे ब्लॉक को स्थानांतरित करने में मदद नहीं की जा रही है – goncalopp
यदि आप फ़ाइलों को बदलते हैं तो आपके पास दो अलग-अलग सामग्री होती है। हां, अगर आप किसी फ़ाइल से किसी फ़ंक्शन को किसी अन्य स्थान पर ले जाते हैं। यदि आप संघर्ष को कम करना चाहते हैं, तो अधिक से अधिक काम करें। प्रयास करें। – sensorario