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


197

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


1
नीचे दिया गया उत्तर मेरे लिए सुपर रोशन रहा है। वहाँ सूक्ष्म बिंदुओं के एक जोड़े को बनाया गया है जो वास्तव में मेरे लिए स्पष्ट हैं, मैं किसी भी गैर-विशेषज्ञ जीआईटी उपयोगकर्ताओं को नीचे दिए गए पोस्ट के सभी टिप्पणियों को पढ़ने के लिए सलाह देता हूं, और धन्यवाद ब्रायन!
टॉम डेमिल

जवाबों:


332

git checkout--oursआपके पास स्थानीय रूप से फ़ाइल का संस्करण देखने का विकल्प है (जैसा कि विरोध किया गया है --theirs, जो कि आपके द्वारा खींचा गया संस्करण है)। आप इसे पेड़ की हर चीज की जांच .करने के git checkoutलिए बता सकते हैं । फिर आपको हल के रूप में संघर्षों को चिह्नित करने की आवश्यकता है, जिसे आप 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कमांड के पहले रूप का उपयोग करें ।

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

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

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

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

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

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


7
आपको शायद ध्यान देना चाहिए कि git add --allसभी फ़ाइलों को रिपॉजिटरी में जोड़ता है ताकि यह तब तक अधिक फ़ाइलों को जोड़ सके जब तक कि आपके .gitignoreपैटर्न एक परिपूर्ण स्थिति में न हों। git add -uशायद इस स्थिति के लिए अधिक उपयुक्त है, आप ट्रैक की गई फ़ाइलों के संपादन कम कर सकते हैं, जिसे आप मर्ज को हल करते समय जोड़ना नहीं चाहते हैं।
सीबी बेली

अरे! माफ़ करना। मेरा मतलब यही था। अब ठीक कर दिया।
ब्रायन कैंपबेल

1
आपके विस्तृत उत्तर के लिए धन्यवाद। मैंने वास्तव में गिट चेकआउट की कोशिश की - और एक त्रुटि संदेश प्राप्त किया (जो मुझे अब याद नहीं है)। विचाराधीन फाइलें dll हैं (हमारे पास कुछ हैं जो हम करते हैं, 3 पार्टी संदर्भों को अधिकांशतः) और मैं सिर्फ यह कहना चाहता था कि 'ओके मेरी कॉपी वही है जो मैं चाहता हूं, लेकिन त्रुटि कुछ ऐसी थी जैसे' विलय के समय चेकआउट नहीं कर सकते ' ..... मैं इस लेख को एक संदर्भ के रूप में रखूँगा और अगली बार जब यह होगा तब इसे फिर से आज़माएँ और देखें कि क्या यह काम करता है या यदि मैं उस संदेश को पोस्ट कर सकता हूँ। धन्यवाद फिर से
टॉम DeMille

लेकिन आपका स्पष्टीकरण प्रक्रिया के बारे में मेरे लिए बहुत कुछ स्पष्ट करता है, फिर से धन्यवाद ... सवाल का पालन करें: मेरे पास मर्ज को साफ़ करने के बाद .orig फ़ाइलों को हटाने के लिए कोई भी तरीका मिल सकता है?
टॉम डेमिल

2
आपको करने की आवश्यकता है git checkout --ours ..महत्वपूर्ण है, एक फ़ाइल नाम (इस मामले में, पूरी निर्देशिका) में से गुजरना दो अलग-अलग तरीकों के संचालन के बीच का चयन करता है checkout, एक जो शाखाओं को स्विच करता है और एक जो सूचकांक से फाइलों को काम की प्रतिलिपि में स्थानांतरित करता है। मैं सहमत हूं, यह बहुत भ्रामक है। आप git checkout --ours -- <filename>एक समय में एक व्यक्ति की फाइल को देख सकते हैं।
ब्रायन कैंपबेल

23

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

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

git checkout --theirs -- .

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

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