जब एक पैच लागू करना संघर्षों को हल करने का कोई तरीका है?


124

मैं खिड़कियों पर हूँ।

विभिन्न कारणों से हमारे पास विभिन्न svn शाखाओं के कई गिट उदाहरण हैं।

कई बार मैं रिपॉजिटरी ए में एक समस्या को ठीक करना चाहता हूं, एक पैच उत्पन्न करता हूं, और इसे रिपॉजिटरी बी में लागू करता हूं। यह ठीक काम करता है सिवाय इसके कि यदि संघर्ष हो।

रीबासिंग करते समय मैं सिर्फ फ़ोल्डर पर क्लिक करता हूं और tortioseGit का उपयोग करता हूं और संकल्प विकल्प का चयन करता हूं। यह मुझे अपने संघर्षों के माध्यम से काम करने के लिए एक अच्छा gui लाता है।

वहाँ खारिज पैच विखंडू के साथ यह पूरा करने के लिए कोई रास्ता नहीं है?

यहाँ पैच बनाने / लागू करने का मेरा वर्तमान तरीका है

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch

3
मैं आमतौर पर हाथ से करता हूं जब सभी पैचिंग विकल्प विफल हो जाते हैं ...
stdcall

यदि मर्ज विफल हो जाता है, तो यह इसलिए है क्योंकि प्रोग्राम यह पता नहीं लगा सकता है कि मर्ज कैसे करें। आपको <<<<, ===, >>>> सेट के साथ एक फ़ाइल मिलनी चाहिए और आपको उन्हें हाथ में लेकर हल करना होगा।
ताकसवेल

हाँ यह हाथ से करना एक वास्तविक चिता है जब आपकी बात कुछ 100 rej hunks है।
Kenoyer130

यही कारण है कि जब आप का उपयोग करना चाहते हैं git mergetoolऔर अपनी पसंद के gui के साथ एक 3-तरफ़ा मर्ज करें (मैं विंडोज़ पर kdiff के लिए आंशिक हूँ) ...
g19fanatic

जवाबों:


254

अपना पैच बनाने के लिए निम्नलिखित कार्य करें:

git format-patch --stdout first_commit^..last_commit > changes.patch

अब जब आप पैच लगाने के लिए तैयार हैं:

git am -3 < changes.patch

-3अगर वहाँ संघर्ष कर रहे हैं एक तीन तरह से मर्ज कर सकते हैं। इस बिंदु पर आप एक कर सकते हैं git mergetoolअगर आप एक जीयूआई के लिए जाने के लिए या सिर्फ मैन्युअल vim (मानक का उपयोग करके फ़ाइलें मर्ज करना चाहते हैं <<<<<<, ||||||, >>>>>>संघर्ष समाधान)।


3
यह भी करने के लिए जोड़ने के --ignore-whitespace --ignore-space-changeलिए उपयोगी हो सकता git amहै। मेरे पास तुच्छ विलय था जो इसके बिना नहीं गुजरता था।
कोणीयसेन

12
git apply -3 changes.patchमेरे लिए भी काम करने लगता है
peterflynn

1
भले ही पैच सफाई से लागू नहीं होता है फिर भी मुझे "कोई फ़ाइलों को मर्ज करने की आवश्यकता नहीं है" git mergetool। इसके बजाय मुझे आधार को इस्तेमाल किए गए मूल पैच का पता लगाना था, उसके ऊपर आवेदन करना (सौभाग्य से मेरे रेपो में यह था) और फिर रिबेट।
jozxyqk

4
मुझे @jozxyqk जैसी ही समस्या है। न तो git am -3और न ही git apply -3वास्तव में मेरी फ़ाइलों में संघर्ष मार्करों को छोड़ देगा, भले ही मुझे संदेश मिलते हैं जैसे Applied patch to 'configure.ac' with conflicts.और error: patch failed: ...। यह चालू है git 2.17.1। शायद जब कुछ फ़ाइलों को बिल्कुल पैच नहीं किया जा सकता है, तो गिट रोल वापस?
nh2

1
मुझे @ nh2 जैसा ही मुद्दा मिला, क्या आपको कभी समस्या मिली?
एरिडानिस

12

यदि आप अक्सर पैच, रिबासिंग या मर्ज करते समय एक ही संघर्ष सेट में चल रहे हैं, तो आप गिट रेयर (रिकॉर्ड किए गए रिज़ॉल्यूशन) फ़ंक्शन का उपयोग कर सकते हैं। यह आपको पूर्व-परिभाषित करने की अनुमति देता है कि अतीत में आपने उन्हें कैसे हल किया था, इसके आधार पर संघर्षों को कैसे हल किया जाना चाहिए। यह कैसे काम करता है, इसके विवरण के लिए http://git-scm.com/blog/2010/03/08/rerere.html देखें ।


5

TortoiseGit में एक मर्ज सुविधा है जो पैच फ़ाइलें खोल सकती है।

यहाँ इसकी एक तस्वीर है


वास्तव में मर्ज विकल्प वह हो सकता है जिसकी मुझे तलाश है।
केनोयेर 1:30

वास्तव में? मैंने लंबे समय में कछुए का उपयोग नहीं किया है, लेकिन लिंक किए गए पृष्ठ में "TortoiseMerge सीधे Git पैच फ़ाइल खोल सकता है, आप इसकी समीक्षा करते हैं और काम करने वाली कॉपी को पैच कर देते हैं।", इसलिए ऐसा लगता है जैसे यह होना चाहिए!
एम्स

यह पैच फ़ाइलें खोलता है ... हालाँकि, कभी-कभी पैच फ़ाइल स्वरूप tortoisegitmerge को तोड़ देता है। मैं diff -u के साथ कभी सफल नहीं रहा हूं, बल्कि diff -c आउटपुट।
थीस्लोट्नॉट

आप किसी कार्यशील ट्री फ़ोल्डर पर पैच को राइट ड्रैग भी कर सकते हैं और "अप्लाई पैच सीरियल" (0001-xxx.patch, ... 0002-xxy.patch जैसे पैच के लिए) या "सिंगल पैच फाइल लागू करें" का चयन करें।
MrTux

2

मेरा दृष्टिकोण है:

  • एक "एकीकरण" बनाएँ -ब्रांच जहां फाइलें समान हैं
  • पैच को इस एकीकरण-शाखा में लागू करें
  • इसे मर्ज करने के लिए मर्ज करें या रिबेट करें (पता नहीं कि रिबास यहां उपयोगी है, क्योंकि मुझे नहीं पता कि आगे पैच लगाने पर क्या होगा)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.