Emacs में Git विरोधों को कैसे मर्ज किया जाए


84

मेरे हालिया गिट मर्ज ने बड़ी संख्या में संघर्षों को जन्म दिया है। मेरा वर्तमान तरीका '<<<' की अगली घटना की खोज करना है और फिर मानक पाठ संपादन द्वारा मर्ज करना है।

प्रश्न : क्या कोई ऐसा तरीका है जिससे Emacs मेरे संस्करण, उनके संस्करण और फ़ाइल के आधार संस्करण के बारे में Git में उपलब्ध जानकारी का उपयोग कर विलय कर सकता है?


संपादित करें: यह प्रश्न इस संबंधित प्रश्न की तुलना में एक अलग गुंजाइश है , क्योंकि यह एडिटिंग एडिफ तक सीमित नहीं है।


7
यदि आप मैगिट का उपयोग करते हैं, तो आप स्थिति बफर को लोड कर सकते हैं और फिर eपरस्पर विरोधी के रूप में दिखाई गई फाइलों पर दबा सकते हैं। मैगिट ediffआपके बदलावों की पुष्टि करने के लिए विलय और उसके बाद आपको लॉन्च करने के लिए लॉन्च करेगा , फिर आप विलय की गई फ़ाइल को चरणबद्ध कर सकते हैं।
wvxvw

@Beginner: 3 अन्य लोगों ने सोचा कि यह एक डुप्लिकेट था, और मैं आखिरी वोट था। क्यों: अन्य धागे का उल्लेख एक ही उत्तर देता है ( smergeऔर vc-resolve-conflict, साथ ही एक पर ediff) और लंबे समय तक रहा है। मैं मानता हूं कि पहला धागा बेहतर शीर्षक का उपयोग कर सकता है, हालांकि।
दान

@ मैं असहमत हूं: यह एक अलग सवाल है और इसका जवाब समान है कि यह नहीं बदलता है।
शुरुआत

1
@ इकबालअंसारी: मुझे लगता है कि दूसरे धागे को एक बेहतर शीर्षक की जरूरत है ताकि लोग इसे और आसानी से जान सकें। वास्तव में, मुझे लगता है कि बिग्रेड का थ्रेड शीर्षक इसके लिए बहुत अच्छा होगा। हालांकि, अभी थोड़ा इंतजार करना होगा कि लोग इस धागे को फिर से खोलना चाहते हैं या नहीं। यदि नहीं, तो मैं शुरुआत के शीर्षक के साथ पहले धागे का नाम बदलने के पक्ष में हूं।
दान

1
और इसके लायक क्या है, मुझे लगता है कि यह अच्छा जवाब है। यह सिर्फ इतना है कि मुझे यह भी लगता है कि यह एक डुप्लिकेट है - लेकिन अन्य लोग उस राय (दोहराव के बारे में, जो है) को साझा नहीं कर सकते हैं।
दान

जवाबों:


86

आप शायद smerge-modeविवादित फ़ाइल को खोलने और करने की कोशिश करना चाहते हैं M-xsmerge-modeRET। यह सभी परस्पर विरोधी क्षेत्रों को उजागर करेगा। यह आसानी से संघर्षों को हल करने के लिए कीबाइंडिंग भी जोड़ता है, C-hfsmerge-modeRETउन्हें जानने के लिए इसके डोक्यूमेंटेशन से परामर्श करें।

डिफ़ॉल्ट उपसर्ग

मुझे smerge-mode C-c^बोझिल के लिए डिफ़ॉल्ट उपसर्ग लगता है इसलिए मैंने इसे बदल दिया है C-cv

(setq smerge-command-prefix "\C-cv")

महत्वपूर्ण कीबाइंडिंग

मेरे लिए सबसे महत्वपूर्ण बाइंडिंग हैं:

smerge-nextsmerge-command-prefixnअगले संघर्ष के लिए आगे बढ़ने के लिए बाध्य ।

smerge-previoussmerge-command-prefixpपिछले संघर्ष में जाने के लिए बाध्य ।

smerge-keep-currentsmerge-command-prefixRETकर्सर को चालू रखने के लिए बाध्य है।

smerge-keep-minesmerge-command-prefixmअपने परिवर्तनों को रखने के लिए बाध्य ।

smerge-keep-othersmerge-command-prefixoअन्य परिवर्तन रखने के लिए बाध्य ।

smerge-ediffsmerge-command-prefixEसंघर्षों का विलय करने के लिए एक एडिफ सत्र शुरू करने के लिए बाध्य । यह ऐसा ही है vc-resolve-conflicts(धन्यवाद @phils और @Malabarba इस ओर इशारा करते हुए)।

स्मार्गर-मोड को स्वचालित रूप से सक्षम करना

अद्यतन: निम्नलिखित केवल Emacs संस्करणों पर ही प्रासंगिक है 25.1, निम्नलिखित बाद के संस्करणों पर समस्याएँ पैदा कर सकते हैं, https://github.com/magit/magit/issues/3897 देखें

इसके अतिरिक्त, आप स्वचालित रूप से सक्षम smerge-modeहोने में दिलचस्पी ले सकते हैं जब किसी फ़ाइल / बफर पर जाकर संघर्ष मार्करों के साथ आप इसे प्राप्त करने के लिए निम्नलिखित जैसे कुछ का उपयोग कर सकते हैं

(defun my-enable-smerge-maybe ()
  (when (and buffer-file-name (vc-backend buffer-file-name))
    (save-excursion
      (goto-char (point-min))
      (when (re-search-forward "^<<<<<<< " nil t)
        (smerge-mode +1)))))

(add-hook 'buffer-list-update-hook #'my-enable-smerge-maybe)

ध्यान दें कि मैं उपयोग कर रहा हूं buffer-list-update-hookऔर इसलिए नहीं कि find-file-hookज्यादातर बार मुझे एक बफर में संघर्ष मिलता है जो पहले से ही ईएमएसी में खुला है, जिसमें find-file-hookकोई मदद नहीं करता है।

इस उत्तर में वर्णित अन्य विधियों की भी जाँच करें


1
(1) मत भूलना smerge-ediff(२) आप किस Emacs वर्जन पर हैं? वर्तमान emacs मास्टर शाखा पर, स्मारिका स्वचालित रूप से चालू हो जाती है। (३) आप buffer-list-update-hookइसके बजाय क्यों इस्तेमाल कर रहे हैं find-file-hook?
मालाबार

अतिरिक्त स्पष्टीकरण के लिए, ध्यान दें कि smerge-ediffऔर vc-resolve-conflictsएक ही चीज हैं।
फिल्स

@ मलबारबा 1) मैंने उल्लेख किया है कि smerge-modeकीबाइंडिंग का दस्तावेजीकरण किया गया है। शायद मैं पूर्णता के लिए मैनुअल यहाँ उद्धृत कर सकता हूँ। प्रतिक्रिया के लिए धन्यवाद। 2) मैं v24.5 पर हूं, हालांकि मैं कभी-कभी मास्टर शाखा की कोशिश करता हूं, मुझे याद नहीं है कि स्मार्गर अपने आप चालू हो जाता है (क्या यह हालिया बदलाव है?)। 3) ऐसा इसलिए है क्योंकि ज्यादातर बार मुझे पहले से ही खुले बफ़र्स में संघर्ष होता है, जिस स्थिति में मुझे स्पष्ट रूप से चालू करने की आवश्यकता होगीsmerge-mode
इकबाल अंसारी

@IqbalAnsari smerge-modeहर समय सक्षम नहीं होने का कोई कारण है ? शायद यह बहुत कुछ नहीं करता है जब तक कि आह्वान नहीं किया जाता है।
PythonNut

@PythonNut अच्छा सवाल, दुर्भाग्य से मेरे पास कोई जवाब नहीं है क्योंकि मैंने कभी भी इसे हर समय सक्षम रखने की कोशिश नहीं की है, फिर भी इसकी कोशिश की जा रही है
इकबाल अंसारी

32

संपादित करें: चूंकि यह उत्तर मेरी अपेक्षा से अधिक बढ़ गया था, इसलिए मैंने इसे थोड़ा विस्तारित किया।

@IqbalAnsari द्वारा उत्तर को पूरक करने के लिए, आप भी इस्तेमाल कर सकते हैं vc-resolve-conflicts(जैसा कि दूसरों द्वारा उल्लेख किया गया है, यह एक उपनाम है smerge-ediff)। यह ediffइंटरफ़ेस शुरू करेगा । बाईं ओर पहला मर्ज माता-पिता होगा, और दाईं ओर दूसरा मर्ज माता-पिता होगा। वे क्रमशः MINEऔर साथ मॉडललाइन पर लेबल किए जाते OTHERहैं। मर्ज किए गए बफ़र को नीचे दिखाया गया है (स्क्रीनशॉट देखें)।

<Code> ediff </ code> इंटरफ़ेस का स्क्रीनशॉट

कुंजी बाइंडिंग

  • के साथ संघर्ष के माध्यम से नेविगेट करें nऔर p
  • के साथ aया संस्करणों को स्वीकार करेंb
  • पूर्वज को साथ देखो/ !
  • के साथ संपादन सत्र छोड़ेंq

आप मर्ज किए गए बफ़र के साथ भी नेविगेट कर सकते हैं other-windowऔर यदि किसी संस्करण को स्वीकार करने की तुलना में संघर्ष को हल करने के मामले में हाथ से संपादित किया जाता है। जब आप कर लेते हैं, तो आप बफर को बचा सकते हैं और हमेशा की तरह Emacs छोड़ सकते हैं। अधिक मदद के लिए, बस सत्र के ?दौरान उपयोग करें ediff, वहां बहुत उपयोगी कमांडों का एक पूरा गुच्छा है। मैं अभी भी नहीं जानता कि उनमें से आधे क्या करते हैं!


2
यह सबसे अच्छी विधि IMO है। मेरे पास यह करने के लिए बाध्य है C-x v <, हालांकि व्यवहार में मैं इसे मैगिट (wvxvw की टिप्पणी के अनुसार) के साथ लागू करने की अधिक संभावना है।
फिल्स

1
चूंकि वर्ष 2000 के vc-resolve-conflictलिए एक उपनाम है smerge-ediff, जैसा कि नाम से पता चलता है कि एक एडिफ सत्र शुरू होता है, न कि एक इमर्जिंग सत्र। वैसे, लाइब्रेरी के हेडर ediff.elस्वीकार करते हैं emerge.elऔर फिर कहते हैं कि "एडिफ़ का वर्तमान संस्करण इमर्ज को सुपरसीड करता है। यह एक बेहतर उपयोगकर्ता इंटरफ़ेस प्रदान करता है और इसमें एमर्ज में कई प्रमुख विशेषताएं नहीं पाई जाती हैं। विशेष रूप से, यह पैचिंग कर सकता है, और। 2-वे और 3-वे फ़ाइल तुलना, विलय और निर्देशिका संचालन।
तारसियस

6
यह भी ध्यान दें कि magit-ediff-resolve( Emया eसंघर्ष वाली फ़ाइल पर) smerge-ediffआंतरिक रूप से उपयोग करता है । यह हालांकि ediff-quit-hookथोड़ा बेहतर सत्र परिष्करण अनुभव प्रदान करने के लिए ओवरराइड करता है। यह बताने के बजाय कि आप "बफ़र" को बचा सकते हैं (कई बफ़र्स हैं), यह आपसे पूछता है कि क्या आप बफ़र को सहेजना चाहते हैं (जबकि आपको उसका नाम दिखाते हुए)।
तारसियस

क्या विमीडिफ की तरह 4 विंडो (हमारे, माता-पिता, उनके, कार्यक्षेत्र) को दिखाने का कोई तरीका है?
user1133275

9

यदि आप Spacemacs का उपयोग करते हैं, तो मैं "स्मार्गर-ट्रांसिएंट-मोड" को सक्रिय करने की सलाह दूंगा, जो सभी संभव स्मार्गन कमांड के साथ हाइड्रा मेनू लाता है।

ऐसा करने के लिए, बस Mx को कॉल करें spacemacs/smerge-transient-state/body, जो कि निर्धारित डिफ़ॉल्ट के अनुसार है SPC-g-r

यहाँ एक स्क्रीनशॉट है:

यहाँ छवि विवरण दर्ज करें

अपनी फ़ाइल का संपादन तब सहज होना चाहिए:

  1. nअगले हंक पर जाने के लिए दबाएँ ।
  2. एक मर्ज कार्रवाई चुनें ।
  3. तब तक दोहराएं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.