git - मैं दूरस्थ परिवर्तनों को कैसे हटा सकता हूं और फ़ाइल को "हल" के रूप में चिह्नित कर सकता हूं?




merge conflict (2)

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


संघर्ष मूल के बारे में सुनिश्चित करें: यदि यह git merge का परिणाम है, तो का answer ।

लेकिन अगर git rebase (उनके) परिवर्तनों को छोड़ने और स्थानीय परिवर्तनों का उपयोग करने के लिए, git rebase का नतीजा है, तो आपको एक करना होगा:

git checkout --theirs -- .

देखें " ours " और " theirs " का अर्थ क्यों उलट रहा है यह देखने के लिए कि कैसे ours और theirs रिबेस के दौरान स्वैप किए जाते हैं (क्योंकि upstream शाखा की जांच की जाती है)।


git checkout में आपके द्वारा स्थानीय रूप से फ़ाइल के संस्करण को देखने के लिए --ours विकल्प है (जैसा कि --theirs विपरीत है, जो संस्करण आपने खींचा है)। आप पास कर सकते हैं पेड़ में सब कुछ देखने के लिए यह बताने के लिए git checkout करने के लिए। फिर आपको संघर्षों को हल करने के रूप में चिह्नित करने की आवश्यकता है, जिसे आप git add साथ कर सकते git add , और एक बार अपना काम पूरा कर सकते हैं:

git checkout --ours .  # checkout our local version of all files
git add -u             # mark all conflicted files as merged
git commit             # commit the merge

ध्यान दें git checkout कमांड में। यह बहुत महत्वपूर्ण है, और याद करने में आसान है। git checkout में दो मोड हैं; एक जिसमें यह शाखाएं स्विच करता है, और एक जिसमें यह इंडेक्स से काम करने वाली प्रतिलिपि में फाइलों की जांच करता है (कभी-कभी उन्हें पहले किसी अन्य संशोधन से इंडेक्स में खींचता है)। जिस तरह से यह अंतर करता है यह है कि क्या आपने फ़ाइल नाम पास किया है; यदि आपने फ़ाइल नाम में पास नहीं किया है, तो यह शाखाओं को स्विच करने की कोशिश करता है (हालांकि यदि आप किसी शाखा में पास नहीं करते हैं, तो यह केवल मौजूदा शाखा को फिर से जांचने का प्रयास करेगा), लेकिन अगर संशोधित फाइलें हैं तो ऐसा करने से इनकार कर दिया जाता है वह प्रभावी होगा। इसलिए, यदि आप एक ऐसा व्यवहार चाहते हैं जो मौजूदा फाइलों को ओवरराइट करेगा, तो आपको पास करने की आवश्यकता है . या git checkout से दूसरा व्यवहार प्राप्त करने के लिए एक फ़ाइल नाम।

यह एक अच्छी आदत है, जब फ़ाइल नाम में गुजरती है, इसे ऑफसेट करने के लिए -- जैसे git checkout --ours -- <filename> । यदि आप ऐसा नहीं करते हैं, और फ़ाइल नाम किसी शाखा या टैग के नाम से मेल खाता है, तो गिट सोचता है कि आप उस फ़ाइल नाम की जांच करने के बजाय उस संशोधन को देखना चाहते हैं, और इसलिए checkout के पहले फॉर्म का उपयोग करें आदेश।

मैं गिट में संघर्ष और merging करने के तरीके पर थोड़ा सा विस्तार करूंगा। जब आप किसी और के कोड में विलय करते हैं (जो एक पुल के दौरान भी होता है; एक पुल अनिवार्य रूप से एक विलय के बाद होता है), कुछ संभावित स्थितियां होती हैं।

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

एक और संभावना यह है कि उनका संशोधन केवल तुम्हारा वंशज है, जिस स्थिति में आप डिफ़ॉल्ट रूप से "फास्ट-फॉरवर्ड विलय" करेंगे, जिसमें आपका HEAD केवल उनकी प्रतिबद्धता के लिए अपडेट किया गया है, बिना विलय होने के कारण (यह अक्षम किया जा सकता है आप वास्तव में --no-ff का उपयोग करके एक विलय रिकॉर्ड करना चाहते हैं)।

फिर आप उन परिस्थितियों में आते हैं जिनमें आपको वास्तव में दो संशोधनों को मर्ज करने की आवश्यकता होती है। इस मामले में, दो संभावित परिणाम हैं। एक यह है कि विलय साफ हो जाता है; सभी परिवर्तन अलग-अलग फाइलों में हैं, या एक ही फाइल में हैं लेकिन काफी दूर हैं कि परिवर्तन के दोनों सेट बिना किसी समस्या के लागू किए जा सकते हैं। डिफ़ॉल्ट रूप से, जब एक स्वच्छ विलय होता है, तो यह स्वचालित रूप से प्रतिबद्ध होता है, हालांकि आप इसे पहले से संपादित करने की आवश्यकता होने पर --no-commit साथ अक्षम कर सकते हैं (उदाहरण के लिए, यदि आप bar फ़ंक्शन foo का नाम बदलते हैं, और कोई अन्य नया कोड जोड़ता है जो foo को कॉल करता है, यह साफ़ रूप से विलय करेगा, लेकिन एक टूटे हुए पेड़ का उत्पादन करेगा, ताकि आप इसे किसी भी टूटी हुई काम से बचने के लिए विलय प्रतिबद्धता के हिस्से के रूप में साफ़ करना चाहें)।

अंतिम संभावना यह है कि एक वास्तविक विलय है, और संघर्ष हैं। इस मामले में, गिट जितना कर सकता है उतना विलय करेगा, और विवाद मार्करों के साथ फाइलें उत्पन्न <<<<<<< ( <<<<<<< , ======= , और >>>>>>> ) आपके कामकाजी प्रतिलिपि इंडेक्स में ("स्टेजिंग एरिया" के रूप में भी जाना जाता है; वह स्थान जहां फाइलों को git add द्वारा संग्रहीत किया जाता है उन्हें git add से पहले), आपके पास प्रत्येक फ़ाइल के 3 संस्करण विवादों के साथ होंगे; आपके द्वारा विलय कर रहे दो शाखाओं के पूर्वजों से फ़ाइल का मूल संस्करण है, HEAD (मर्ज का आपका पक्ष) का संस्करण, और दूरस्थ शाखा से संस्करण।

संघर्ष को हल करने के लिए, आप या तो अपनी कार्यशील प्रतिलिपि में फ़ाइल को संपादित कर सकते हैं, संघर्ष मार्करों को हटा सकते हैं और कोड को ठीक कर सकते हैं ताकि यह काम कर सके। या, आप git checkout --ours या git checkout --theirs का उपयोग कर, मर्ज के एक या दूसरे किनारे से संस्करण देख सकते हैं। एक बार जब आप फ़ाइल को उस स्थिति में डाल देते हैं जिसे आप चाहते हैं, तो आप इंगित करते हैं कि आप फ़ाइल को विलय कर रहे हैं और यह git add का उपयोग करके प्रतिबद्ध करने के लिए तैयार है, और फिर आप git commit साथ विलय कर सकते git commit





conflict