git add --interactive "आपका संपादित हंक लागू नहीं होता है"


86

मैं git add --interactiveचुनिंदा रूप से अपने सूचकांक में कुछ बदलाव जोड़ने के लिए उपयोग करने की कोशिश कर रहा हूं , लेकिन मुझे लगातार "आपका संपादित हंक लागू नहीं होता है। फिर से संपादित करें ..." संदेश। मुझे यह संदेश मिलता है, भले ही मैं ई विकल्प चुनूं, और तुरंत अपने संपादक को बचा / बंद कर दूं। दूसरे शब्दों में, हंक को संपादित किए बिना, पैच लागू नहीं होता है।

यहां सटीक उदाहरण मैं उपयोग कर रहा हूं (मैं एक छोटा डेमो डालने की कोशिश कर रहा हूं):

मूल फ़ाइल:

first change
second change off branch
third change off branch
second change
third change
fourth change

नई फ़ाइल:

Change supporting feature 1
first change
second change off branch
third change off branch
second change
third change
fourth change
bug fix 1
change supporting feature 1

मैं यह दिखाने की कोशिश कर रहा हूं git add --interactiveकि सूचकांक में "बग फिक्स 1" लाइन को जोड़ने के लिए कैसे उपयोग किया जाए। फ़ाइल पर इंटरैक्टिव ऐड चल रहा है, मैं पैच मोड चुनता हूं। यह मुझे प्रस्तुत करता है

diff --git a/newfile b/newfile
index 6d501a3..8b81ae9 100644
--- a/newfile
+++ b/newfile
@@ -1,6 +1,9 @@
+Change supporting feature 1
 first change
 second change off branch
 third change off branch
 second change
 third change
 fourth change
+bug fix 1
+change supporting feature 1

मैं पहले हंक लागू करने के लिए "नहीं" के बाद, विभाजन के साथ प्रतिक्रिया करता हूं। दूसरा हंक, मैं संपादित करने की कोशिश करता हूं। मैंने मूल रूप से नीचे की रेखा को हटाने की कोशिश की - जो काम नहीं किया। अकेले हंक को छोड़कर पूरी तरह से काम नहीं करता है, और मैं यह पता नहीं लगा सकता कि क्यों।


यहाँ पर यह सुनिश्चित करने के लिए एक अच्छी बात यह है कि आप उन -लाइनों की शुरुआत में नहीं जोड़ रहे हैं जिनके साथ शुरू करने के लिए फाइल मौजूद नहीं है; यह एक अंतर है और यह उन लाइनों को नहीं हटा सकता है जो पहले से ही नहीं हैं। तो अगर अंतर में एक रेखा के साथ शुरू होता है +और आप इसे बदलने के लिए -WTF चला जाता है? क्योंकि अब हटाने के लिए चिह्नित लाइन शुरू नहीं होती है (इसके बजाय लाइन को इसके लिए चिह्नित किया गया था, और जब हटाने के लिए चिह्नित लाइन को हटाने के लिए चिह्नित किया जाता है तो वह लाइन को हटा नहीं सकता है जो पहले से फ़ाइल में नहीं है) ।
leeand00

1
मेरे मामले में लाइन एंडिंग (LF, CRLF) की भी जाँच करें, यह CRLF के बजाय एक LF के लिए लागू नहीं हुआ!
अल्बर्टो रिविल्ली

जवाबों:


37

इस विशेष उदाहरण के लिए, आपको हंक में पंक्ति संख्याओं को मोड़ना होगा। लाइन बदलें:

@@ -1,6 +2,8 @@

इतना है कि इसके बजाय यह पढ़ता है:

@@ -2,7 +2,8 @@

16
कुछ खुदाई के बाद, मैंने पाया कि वे लाइनें "से-फ़ाइल रेंज" और "टू-फाइल रेंज" दिखा रही हैं। मैं वास्तव में 1 को 2 में बदलने के पीछे के तर्क को नहीं समझता। मैंने इसकी कोशिश की, और यह काम करता है, लेकिन मुझे समझ में नहीं आता है कि "से-फाइल रेंज" में बदलाव क्यों होता है। मूल फ़ाइल समान है, चाहे मैं पूरे पैच को लागू कर रहा हूं, या सिर्फ संपादित हंक। क्या आप आगे स्पष्ट कर सकते हैं, या यूनिफाइड डिफरेंट फॉर्मेट पर मुझे डिसेंट रेफरेंस की ओर इशारा कर सकते हैं। मैं एक खोजने में असफल रहा हूं।
जोश

9
@ जोश: stackoverflow.com/questions/2529441/… मदद कर सकता है, भले ही मुझे पूरी तरह से यूनिफ़ाइड फॉर्मेट न मिले हों। @William +1
VonC

5
@ जोश: यह देखने में ऐसा लगता है कि यह एक बग हो सकता है। आपके द्वारा हंक को संपादित करने के बाद, यह जाँच कर पैच को सत्यापित करने का प्रयास किया जाता है कि सभी हंक लागू होंगे (यह अत्यधिक हो सकता है)। दुर्भाग्य से, इस मामले में, इसका मतलब है कि पिछले हंक (जिसे आप लागू नहीं कर रहे हैं) की जाँच की जा रही है, और कुछ ओवरलैप है जो गिट लागू करते हैं - असफल रहने के लिए। मैं एक सुंदर समाधान नहीं जानता; git यहाँ अत्यधिक सतर्क होकर सही काम कर सकता है।
विलियम पुरसेल

22
कृपया लाइन नंबर बदलने के बारे में अधिक जानकारी? हमें ऐसा क्यों करना है? और कैसे? प्रत्येक संख्या का क्या अर्थ है?
बिल

4
@WilliamPursell git के कौन से संस्करण हैं? मैंने एक नए कंप्यूटर पर स्विच किया है और git v2.17.0 चल रहा है और अचानक मेरे सभी पैच संपादन कभी भी मान्य नहीं हैं।
डेनिस

105

क्या इस git-add पोस्ट में ऐसा है ?

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

  • एक स्थान (एक अपरिवर्तित रेखा इंगित करता है),
  • एक -संकेत है कि लाइन को हटा दिया गया था,
  • या एक +संकेत है कि लाइन जोड़ी गई थी।

और कुछ नहीं। यह या तो एक स्थान, एक - या + होना चाहिए। और कुछ भी, और आपको त्रुटियां मिलेंगी
(एक बदली हुई रेखा के लिए कोई चरित्र नहीं है, क्योंकि पुरानी लाइन को हटाकर, और नए के रूप में परिवर्तित किए गए को जोड़ दिया जाता है)।

जब से आपको अपने पसंदीदा टेक्स्ट एडिटर में फ़र्क ओपन हो गया है (आपने अपने पसंदीदा टेक्स्ट एडिटर को राइट करने के लिए Git को कॉन्फ़िगर किया है?)?

और उसमें झूठ निहित है। यदि आपने पहले कभी ऐसा नहीं किया है, तो गिट आपको बताएगा "आपका संपादित हंक लागू नहीं होता है। फिर से संपादित करें?" ऐसा अक्सर, आप इसे पता लगाने में असमर्थता के लिए खुद से घृणा करना शुरू कर देंगे , भले ही यह इतना आसान लगता है (या जीआईटी क्योंकि यह पता नहीं लगा सकता है कि आप क्या चाहते हैं)।

एक बात जो मुझे काफी बार कचोटती थी, वह यह कि मैं एक पात्र को भूल गया था।
मैं एक लाइन को हटाने के साथ चिह्नित करूँगा - लेकिन -इसमें सम्मिलित होने वाले अधिकांश टेक्स्ट संपादकों में , यह उस स्थान को अधिलेखित नहीं करता है जो पहले था। इसका मतलब है कि आप पूरी पंक्ति में एक अतिरिक्त स्थान जोड़ रहे हैं, जिसका अर्थ है कि अलग-अलग एल्गोरिथ्म मूल फ़ाइल में लाइन को ढूंढ / मैच नहीं कर सकता है, जिसका अर्थ है कि गिट आप पर चिल्लाएगा

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

भी इस देखें Git ऐड -p पर प्रतिबद्ध

Ortomala Lokni के जवाब के लिए संदर्भित करता जोकिन Windmüller ब्लॉग पोस्ट " Git के साथ प्रतिबद्ध करने के लिए चुनिंदा चयन परिवर्तन (या Imma संपादित अपने हंक) "

लाइनों को गिनने के बजाय, क्या करना चाहते हैं, यह कहा जाता है कि एडिटिंग हंक (जब एक संपादित किया जाता है) ओवरलैपिंग हंक को समतल करना है। 2018 के मध्य
में चर्चा की गई थी , और इस तरह के परिदृश्य से बचा जाएगा:

यदि आप एक हंक को विभाजित करते हैं, तो पहले सबहंक को संपादित करें, एक अनुगामी संदर्भ रेखा को एक विलोपन में बदल दें फिर यदि आप दूसरे सबहंक को चरणबद्ध करने का प्रयास करते हैं, तो यह विफल हो जाएगा।


5
लिंक के लिए धन्यवाद, लेकिन मैंने पहले ही यह देख लिया था। मैं अतिरिक्त पंक्ति नहीं जोड़ रहा / छोड़ रहा था। समस्या लाइन नंबरों में थी, लेकिन मैं अभी भी इसे ठीक नहीं समझता।
जोश

9
मैं एक रिक्त स्थान के साथ हटाए गए '-' को प्रतिस्थापित नहीं कर रहा था - इस प्रकार इंडेंटेशन को खराब कर रहा था। धन्यवाद!!
पेडोरो

बस सुनिश्चित करें कि आप रिक्त स्थान वाले हिस्से को गलत न समझें। मैंने सोचा था कि सभी अपरिवर्तित लाइनें केवल एक काले रंग की रेखा होनी चाहिए - केवल इंडेंट कैरेक्टर के बजाय ... अगर "समझे नहीं तो एक घंटा" एडिट हंक लागू नहीं होता ": - /
ओलिगोफ़्रेन

@oligofren मुझे यकीन नहीं है कि मैं आपको समझता हूं: अपने संपादित हंक को लागू करने के लिए आपको क्या करना था?
वॉनसी

1
@VonC: मैंने पहले सोचा था कि मुझे - foo `` (केवल एक रिक्त स्थान है, न कि "एक रिक्त स्थान और संपूर्ण पंक्ति") में बदलना चाहिए । मुझे समझने में थोड़ा समय लगा कि यह `फू` होना चाहिए था।
ऑलिगॉफ्रेन

48

बेशक मुझे इस पर देर हो रही है लेकिन फिर भी रिकॉर्ड के लिए उल्लेख करना चाहता था कि इस मुद्दे पर पिछले साल गिट मेलिंग सूची पर चर्चा की गई थी और ऐसा लगता है कि बहुत कुछ नहीं बदला है।

यह विशेष मुद्दा बंटवारे और उसी हंक को संपादित करने के प्रयास से उपजा है । मूल रूप से जेफ किंग द्वारा मूल रूप से पोस्ट किया गया विश्लेषण अनिवार्य रूप से है:

हम्म। ठीक है मैं समझा। "यह अलग है लागू होता है" चेक विभाजन पैच के दोनों हिस्सों को गिट-अप करने के लिए फ़ीड करता है । लेकिन निश्चित रूप से दूसरा भाग कभी भी सही तरीके से लागू नहीं होगा, क्योंकि इसका संदर्भ पहले भाग के साथ ओवरलैप होता है, लेकिन इसे ध्यान में नहीं रखता है।

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

जेफ अपने पद को बहुत ही व्यावहारिक दृष्टिकोण के साथ समाप्त करता है जो हमेशा सफल होता है, और इस प्रकार अत्यधिक अनुशंसा की जाती है:

इसलिए सामान्य तौर पर, मुझे लगता है कि एक ही हंक का विभाजन और संपादन स्वाभाविक रूप से खतरनाक है और इस प्रकार की समस्याओं को जन्म देने वाला है। और क्योंकि संपादन कार्यक्षमता का एक सुपरसेट प्रदान करता है, मुझे लगता है कि आपको सिर्फ संपादित करना चाहिए और या तो अपनी पसंद के आधार पर हंक के पहले भाग को लागू करने की अनुमति देनी चाहिए या नहीं।

केवल पहले से विभाजित हंक को संपादित करने का चयन करके, आपको लाइन नंबरों से निपटना नहीं होगा।


6
धन्यवाद, यह वास्तव में लाइन नंबरों के बारे में कल्पना करने की तुलना में आसान है।
मचिआकिग

3
यह मेरा मुद्दा था। जरूरत है मेरे हंक को छोटा करने की। इंटरैक्टिव में एक विभाजन का प्रदर्शन किया। विभाजन वह नहीं था जो मैं चाहता था इसलिए मैंने मैन्युअल रूप से कोशिश करने और संपादित करने का फैसला किया। त्रुटि हो रही है। शुरुआत की, पहले प्रयास में काम किया।
काइल ने

यह इस धागे में सबसे अच्छा जवाब है। विभाजित और संपादित न करें। बस संपादित करें।
Dr_Zaszuś

मेरे मामले में, एक अतिरिक्त समस्या विंडोज लाइन एंडिंग्स से आ रही थी ^Mजो कि अलग फाइल में दिखाई गई थी। एक बार जब मैंने सीआर एंडिंग्स के साथ फाइल को बचाया, तो इंटरेक्टिव एडिट पैच से गुजरा!
Dr_Zaszuś

धन्यवाद, यह मेरे लिए चाल चली गई। मुझे एक विशाल चोक पर काम करना था, इसलिए मैंने इसे अलग कर दिया, और सब कुछ टूट गया। इसे बेदाग रखने से सब कुछ ठीक हो गया।
मथायस फिशर

16

जब आप उस लाइन को डिलीट नहीं करना चाहते हैं जो डिलीट करने के लिए स्टेज पर है, जैसे कि

 first line
-second line
 third line

जहां आप दूसरी पंक्ति रखना चाहते हैं, सुनिश्चित करें कि आप -पूरी पंक्ति को हटाने के बजाय एक स्थान के साथ प्रतिस्थापित करते हैं (जैसा कि आपको एक जोड़ा रेखा से छुटकारा पाना होगा)। Git संदर्भ के लिए लाइन का उपयोग करेगा।


1
यह मेरे लिए स्पष्ट नहीं था, मुझे लगा कि Git मुझे लाइन को एकल स्थान बनाने के लिए कह रहा था।
जैकहेसकेबोर्ड

15

हंक हेडर (जैसे @@ -1,6 +1,9 @@) को सही ढंग से संशोधित करना भी महत्वपूर्ण है । जोकिन विंडमुल्लर ने अपने एक ब्लॉग पोस्ट में हंक हेडर एडिटिंग के रहस्य को उजागर किया है ।

संपादन के रहस्य

हॉक को संपादित करना पहली बार में भ्रमित करने वाला हो सकता है, यह निर्देश जो गिट आपको मदद करता है लेकिन आरंभ करने के लिए पर्याप्त नहीं है।

# —||

# To remove ‘-’ lines, make them ’ ’ lines (context).

# To remove ‘+’ lines, delete them.

# Lines starting with # will be removed.

#

# If the patch applies cleanly, the edited hunk will immediately be

# marked for staging. If it does not apply cleanly, you will be given

# an opportunity to edit again. If all lines of the hunk are removed,

# then the edit is aborted and the hunk is left unchanged.

गुप्त सॉस है ... लाइनों की गिनती:

  • यदि आप एक ऐसी रेखा को हटाते हैं जो + से शुरू होती है तो एक को नई लाइन की संख्या (हंक के हेडर का अंतिम अंक) में घटाएं
  • यदि आप एक पंक्ति को हटाते हैं जो इसके साथ शुरू होती है - तो एक नई पंक्ति गणना (हंक के हेडर का अंतिम अंक) में जोड़ें
  • अन्य पंक्तियों (संदर्भ लाइनों) को न निकालें।

इससे आपको अपने इच्छित भागों का चयन करने के लिए झटके को जल्दी से संशोधित करने की अनुमति मिलनी चाहिए।


1
क्या हंक हेडर के संपादन को स्वचालित करने या उपयुक्त लाइन काउंट को निर्धारित करने के लिए गिट कॉन्फ़िगर करने का कोई तरीका है?
डेनिस

आप शायद इसे पसंद करने के लिए अपने पसंदीदा संपादक को स्क्रिप्ट कर सकते हैं। हो सकता है कि इसके लिए पहले से ही कुछ प्लगइन्स हों, लेकिन यह संपादक पर निर्भर है।
ओरतमाला लोकनी

13

मैंने हाल ही में इस सूत्र को पढ़ने से पता लगाया कि मैन्युअल संपादन कैसे किया जाता है।

मैंने जिस तरकीब का इस्तेमाल किया, वह यह था कि अगर मेरे पास एक अंतर है:

+ Line to add
+ Line to add
+ Line I dont want to include
+ Line I dont want to include

ट्रिक को उन दो लाइनों को पूरी तरह से हटा देना है जिन्हें मैं नहीं चाहता, जिसके परिणामस्वरूप अलग दिख रहा है:

+ Line to add
+ Line to add

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


2
मैं आपको पर्याप्त धन्यवाद नहीं दे सकता! मैं बदलने के लिए कोशिश कर रहा था +एक में ' 'कम से कम एक घंटे के लिए।
सुमेर

तुम्हें पता है, पागलपन एक ही काम कर रहा है और एक अलग परिणाम की उम्मीद कर रहा है। मैं 20 मिनट के लिए अपने आप से कह रहा हूं कि मुझे लगा कि मुझे बस हटाने की ज़रूरत है :)
सॉलिडक

7

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

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


6

मैं एक ही समस्या के समाधान की तलाश में इस सवाल पर आया था, और यह समझ नहीं पाया कि मेरे मामले में स्वीकार करने के लिए हंक में लाइन संख्या (जैसा कि ऊपर सुझाव दिया गया है) को कैसे बदला जाए। मैं एक बेहतर तरीका है कि git guiहालांकि का उपयोग कर पाया । वहां आप उस लाइन में लाइनों का चयन कर सकते हैं जिसे आप चरणबद्ध करना चाहते हैं, फिर राइट क्लिक करें और "कमिट से स्टेज लाइनें" चुनें। मुझे याद है कि git-cola की कार्यक्षमता भी समान है।


यह वास्तव में जवाब होना चाहिए। git-colaलिनक्स, विंडोज और मैकओएस पर काम करता है।
18

5

जब मुझे यह त्रुटि मिली, तो एक अतिरिक्त समस्या यह थी कि जब मैंने संपादन फ़ाइल को सहेजा था, तो लाइन समाप्त हो गई थी।

मैं विंडोज का उपयोग कर रहा था और अपने संपादन के लिए नोटपैड का उपयोग कर रहा था (केवल विंडोज लाइन-एंडिंग के साथ बचाता है)। मेरा कोड नोटपैड ++ के साथ लिखा गया था और मैंने इसे यूनिक्स / लिनक्स स्टाइल लाइन एंडिंग के लिए सेट किया था।

जब मैंने नोटपैड ++ को डिफ़ॉल्ट git संपादक के रूप में बदलने के लिए अपनी सेटिंग्स बदल दीं तो मैं अपने संपादन को हंक करने में सक्षम था।

git config --global core.editor "notepad++"

1
इसने मेरे लिए काम किया। लेकिन मुझे नोटपैड ++ के लिए पूर्ण पथ की आवश्यकता थी और इसे सही होने में थोड़ा समय लगा: git config --global core.editor '"C:/Program\ Files\ \(x86\)/Notepad++/notepad++.exe"' (इसे अपने पीसी पर नोटपैड ++ स्थापित करने के अनुसार अनुकूलित करें)
एनाबेल

1
मेरे लिए वही समस्या है। यह नोटपैड था जो समस्याएं पैदा कर रहा था। एक बार जब मैंने अपने डिफ़ॉल्ट संपादक को नोटपैड ++ पर स्विच किया, तो सब कुछ फिर से काम करना शुरू हो गया।
जॉनी ओशिका

4

अजीब "आपका संपादित हंक लागू नहीं होता" संदेशों के लिए एक कारण (संभवतः कुछ त्रुटि के साथ: लाइन पर हेडर के बिना पैच टुकड़ा ... ") आपके संपादक हो सकता है अगर यह पट्टी अनुगामी व्हाट्सएप से कॉन्फ़िगर किया गया हो। यह स्पष्ट रूप से बड़ी समस्याओं का कारण होगा क्योंकि पैच खाली लाइनों को एक स्थान के साथ संलग्न करते हैं क्योंकि किसी भी हंक युक्त रिक्त स्थान को ऐसे संपादक के साथ सहेजे जाने पर लागू करने में विफल होगा। तो किसी भी अपरिवर्तित खाली लाइनों वाले किसी भी हंक के प्रभाव में, संपादन के बाद लागू करने में विफल होगा यदि स्ट्रिपिंग व्हाट्सएप चालू है।


0

FYI करें, मुझे थोड़ी इंटरलेटेड एरर मिल रही थी ... जब मैं ऊपर दिए गए निर्देश का पालन करते हुए पैचअप करता हूं ... हालांकि यह कोई त्रुटि नहीं दिखा रहा था। मैं इसे बार-बार पूछ रहा था कि मुझे एक ही हंक मंच करने के लिए कहा जाए ... मैंने देखा कि मैं विम 7.4 का एक पुराना संस्करण चला रहा था ... मैंने विम को अपग्रेड किया और यह अब उम्मीद के मुताबिक काम कर रहा है। उम्मीद है कि यह किसी की मदद करेगा ..

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.