मुझे लगता है कि समस्या के मूल कि Git (और संस्करण नियंत्रण आम तौर पर) बलों आप परिवर्तनों के दृश्यों के मामले में सोचने के लिए है, लेकिन एक changeset या सुविधा शाखा या जो भी आप एक फोन संबंधित परिवर्तनों का एकजुट समूह आम तौर पर तर्कसंगत अनुक्रमिक नहीं है। जिस क्रम में कोड लिखा गया था वह आकस्मिक है और आवश्यक रूप से उस क्रम से संबंधित नहीं है जिसमें इसे पढ़ा जाना चाहिए।
मेरे पास इसका कोई समाधान नहीं है, लेकिन मैंने पुनर्लेखन इतिहास की प्रक्रिया को स्वचालित करने में सहायता के लिए Perl script लिखा है। यह @MikaEloranta की पाइथन लिपि के समान है जिसे मैंने लिखा था जब मैंने इसे नहीं देखा था।
commit --fixup
और rebase --autosquash
बहुत अच्छे हैं, लेकिन वे पर्याप्त नहीं करते हैं। जब मेरे पास A-B-C
का अनुक्रम होता है और मैं अपने काम करने वाले पेड़ में कुछ और बदलाव लिखता हूं जो कि उनमें से एक या अधिक मौजूदा कामों में से एक है, तो मुझे इतिहास को मैन्युअल रूप से देखना होगा, तय करना होगा कि कौन से परिवर्तन संबंधित हैं, उन्हें मंच बनाएं और बनाएं fixup!
काम करता है। लेकिन गिट के पास पहले से ही पर्याप्त जानकारी तक पहुंच है जो मेरे लिए यह सब करने में सक्षम है।
प्रत्येक हंक के लिए git diff
में स्क्रिप्ट के लिए प्रतिबद्ध है कि पिछले प्रासंगिक लाइनों को छुआ लगता है git blame
का उपयोग करता है, और git commit --fixup
कॉल उचित fixup!
प्रतिबद्ध लिखने के लिए अनिवार्य रूप से एक ही बात मैं मैन्युअल रूप से पहले कर रहा था कर।
यदि स्क्रिप्ट एक एकल, स्पष्ट प्रतिबद्धता के लिए एक हंक को हल नहीं कर सकती है, तो यह एक असफल हंक के रूप में इसकी रिपोर्ट करेगा और आपको उस के लिए मैन्युअल दृष्टिकोण पर वापस आना होगा। यदि आपने दो अलग-अलग कामों में दो बार एक पंक्ति बदल दी है, तो स्क्रिप्ट उन पंक्तियों में से किसी एक बदलाव को हल करेगी जो कि हाल ही में सही रिज़ॉल्यूशन नहीं है। आईएमएचओ एक "सामान्य रूप" फीचर शाखा में आपको दो अलग-अलग कामों में दो बार लाइन नहीं बदलनी चाहिए, प्रत्येक प्रतिबद्धता समीक्षाकर्ताओं की सहायता के लिए लाइनों के अंतिम संस्करण को प्रस्तुत करना चाहिए। हालांकि, यह एक बगफिक्स शाखा में हो सकता है, उदाहरण के लिए लाइन foo(bar());
को प्रतिबद्ध ए (नाम foo
से fox
) को स्पर्श किया जा सकता है और बी (bar
से baz
का नाम बदलें) को स्पर्श किया जा सकता है।
यदि आपको स्क्रिप्ट उपयोगी लगता है, तो कृपया इसे बेहतर बनाने और इसे पुन: सक्रिय करने के लिए स्वतंत्र महसूस करें और शायद एक दिन हमें git
में ऐसी सुविधा मिल जाएगी। मुझे एक ऐसा टूल देखना अच्छा लगेगा जो समझ सकता है कि एक इंटरेक्टिव रीबेस द्वारा पेश किए जाने पर विलय संघर्ष को कैसे हल किया जाना चाहिए।
क्यों ए को ठीक करने की अजीब आवश्यकता ए में विलय करनी है? –
क्योंकि यह पहले स्थान पर ए में होना चाहिए था। – elmarco
मैं वही काम करता हूं; मुझे यकीन नहीं है कि लोग क्यों सोचते हैं कि यह अजीब है। यदि आप छोटे, तार्किक रूप से समूहित टुकड़ों में काम करने की कोशिश कर रहे हैं, तो एक बार में कई अप्रकाशित कामों की तैयारी करना स्वाभाविक है। (आप शायद यह नहीं जानते कि आप वास्तव में ए के साथ क्या कर रहे हैं जब तक आप सी खत्म नहीं करते)। – andy