2009-12-08 6 views
8

मैं अपने रेपो में एक फ़ाइल में परिवर्तन करने के लिए, तो मानना ​​है कि फ़ाइल मर्ज ना किए गए है और git status में इतनी तरह दिखाने के लिए Git बाध्य करना चाहते हैं:मैं यह सोचने के लिए गिट को कैसे बल दूं कि फ़ाइल अनमोल है?

# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add <file>..." to mark resolution) 
# 
#  both modified:  lib/delayed/recipes.rb 
# 

मेरे सवाल का संपूर्णता है। क्यों एक स्पष्टीकरण के लिए पढ़ें, क्योंकि मुझे पता है कि यह पहली बात है जिसे पूछा जाएगा।

यहां उद्देश्य Piston के लिए एक बगफिक्स है जो आज इंडेक्स में संघर्ष विलय छोड़ देता है जहां उन्हें आसानी से अनदेखा किया जाता है।

तरह से एक Git रेपो के साथ काम करता है piston update है:

  • क्लोन एक नए अस्थायी Git रेपो
  • चेकआउट कि पिछले करने के लिए अस्थायी रेपो प्रतिबद्ध हमने देखा में दूरस्थ रेपो (.piston.yml में बचाया)
  • चेकआउट हमारे स्थानीय रेपो (एक नई शाखा में) पिछले करने के लिए प्रतिबद्ध है जहां .piston.yml अद्यतन किया गया था
  • अस्थायी रेपो में हमारे स्थानीय रेपो की फाइलें कॉपी
  • अस्थायी में सभी परिवर्तन हो रेपो
  • भागो git merge master अस्थायी रेपो में दूरस्थ रेपो के परिवर्तन
  • ध्यान न दें संघर्ष (!) मर्ज और सभी कॉपी के साथ हमारे स्थानीय परिवर्तन मर्ज करने के लिए (ये हमारे स्थानीय परिवर्तन पिछली बार के रूप में हम इस vendored परियोजना अद्यतन कर रहे हैं) हमारे स्थानीय रेपो
  • को अस्थायी रेपो से फाइल वापस अपने मूल प्रारंभिक बिंदु को
  • चेकआउट स्थानीय रेपो हमारे स्थानीय रेपो के लिए उन फ़ाइलों (हमारे नए अस्थायी शाखा में) कमिट
  • स्थानीय रेपो में
  • मर्ज अस्थायी शाखा (किसी भी कहते हैं हमारे द्वारा किए गए और परिवर्तन)

मैं इस समस्या को ठीक करने की उम्मीद करता हूं कि फ़ाइल को विवाद विवादों को अस्थायी संघर्ष में करने की अनुमति देकर, लेकिन अंत में (git merge --squash चलाता है) मैं उन फ़ाइलों के बारे में बताना चाहता हूं जिनके विलय में विवाद हुआ था अस्थायी रेपो

+0

देखें "चुनिंदा राज्य को चुनिंदा तरीके से कैसे बनाया जाए?" गिट मेलिंग सूची पर धागा: http://thread.gmane.org/gmane.comp.version-control.git/135059 –

उत्तर

12

गिट फ़ाइल में विलय विवादों में (आमतौर पर) इंडेक्स में तीन संस्करण होते हैं, और diff3 -E/rcsmerge संघर्ष मार्कर के साथ कार्यक्षेत्र में एक संस्करण है। इंडेक्स में संस्करण सामान्य पूर्वजों से चरण 1, "हमारे" संस्करण के लिए चरण 2 और "उनके" संस्करण के लिए चरण 3 हैं। अनमोल फ़ाइल के लिए चरण 0 में कोई संस्करण नहीं है (आप चरण 0 को हटाकर अनर्जित स्थिति को पुनर्स्थापित करने के लिए git update-index --unresolve का उपयोग कर सकते हैं)।

आप git ls-files --stage या git ls-tree <commit> का उपयोग करने के धब्बे (फ़ाइल संस्करण) का SHA-1 पहचानकर्ता प्राप्त करने के लिए आप सूचकांक में रखना चाहते हैं की आवश्यकता होगी, या git hash-object -w <file> यदि आप क्षेत्र संस्करण काम करने से खरोंच/से एक फ़ाइल का संस्करण उत्पन्न करना चाहते हैं। इसके बाद आप इंडेक्स फ़ाइल में उच्च क्रम चरणों को रखने के लिए git update-index --index-info का उपयोग करें (और git update-index --unresolve इसके बाद, या git update-index --force-remove इंडेक्स से चरण 0 को हटाने के लिए उच्च चरणों को भरने से पहले)। आप git checkout --conflict=merge -- <file> का उपयोग कर कार्यक्षेत्र में मर्ज मार्कर के साथ फ़ाइल को पुन: उत्पन्न कर सकते हैं।

HTH (उम्मीद है कि मदद करता है)


यह भी देखें: "How to selectively recreate merge state?" Git मेलिंग सूची पर धागा।

+0

मर्ज विवाद वाले दो फ़ाइल संस्करण एक अन्य रेपो में हैं, और हो सकता है कि एक तीसरा संस्करण विलय हो अब तक क्या यह कोई समस्या नहीं है? (हालांकि मैं कबूल करता हूं कि मैं अभी तक आपकी प्रतिक्रिया पूरी तरह समझ नहीं पा रहा हूं।) – ScottJ

+0

मुझे बेहतर समझना शुरू हो रहा है। मुझे लगता है कि मुझे इसे ऑक्टोपस विलय के रूप में प्रकट करने के लिए सेट करना होगा, नहीं? आम पूर्वजों प्लस विक्रेता परिवर्तन और स्थानीय परिवर्तन विलय। यह अपेक्षाकृत अधिक जटिल है और मुझे नहीं लगता कि मैं इसके लिए और अधिक हूं। हालांकि, उत्तर के लिए धन्यवाद। – ScottJ

+0

कोई ऑक्टोपस नहीं: विलय गिट में 3-तरफा विलीन हैं, इसलिए तीन संस्करणों की आवश्यकता है। मैं बाद में एक उदाहरण के साथ आने की कोशिश करूंगा। –

संबंधित मुद्दे