2010-02-02 12 views
24

में शाखाओं के बीच अनचाहे फ़ाइलों को मैं एक उत्तर देखने के लिए यहां खोज रहा हूं और ऐसा लगता है कि मैं गिट शाखाओं को कैसे काम करना चाहता हूं, इस बारे में गलत धारणाएं कर रहा हूं।गिट

मेरे पास मेरी master शाखा है और मैंने profiles नामक एक फीचर शाखा बनाई है जहां मैं प्रोफ़ाइल के लिए कुछ विशिष्ट काम कर रहा हूं। प्रोफाइल पर काम करते समय मैंने 5 या 6 फाइलें बदल दी हैं और एक और 5 या 6 नई फाइलें जोड़ दी हैं। मुझे त्वरित बग को ठीक करने के लिए master शाखा पर वापस स्विच करने की आवश्यकता थी और वहां मौजूद सभी नई फाइलें और संशोधित फ़ाइलों को भी देखा गया था। मुझे लगता है कि यह समझ में आता है क्योंकि गिट master शाखा से अनचाहे फ़ाइलों को हटाने जा रहा है और उन्हें वापस profiles शाखा के लिए वापस लाएगा क्योंकि वास्तव में, वे अनचाहे हैं। लेकिन मौजूदा फाइलों में बदलावों के बारे में क्या। वे मास्टर शाखा में क्यों दिख रहे हैं।

यहां सबसे अच्छा अभ्यास क्या है। मैं अभी तक स्थानीय रूप से परिवर्तन करने के लिए तैयार नहीं हूं। क्या मुझे इन सभी परिवर्तनों को छेड़छाड़ करना चाहिए, master पर स्विच करें, छोटा फिक्स करें, profiles पर वापस स्विच करें और फिर स्टैश को दोबारा लागू करें?

किसी भी मदद की सराहना की है। धन्यवाद

उत्तर

33

"मैं अभी तक स्थानीय रूप से परिवर्तन करने के लिए तैयार नहीं हूं।"

Git में

करता स्थानीय चीजें हैं जो, पूर्ववत किया जा सकता होगा पर पुनः किया और फिर से पुनः किया गया है। यह केवल तब होता है जब आप कहीं भी प्रतिबद्धता को दबाते हैं कि आपको ध्यान देना होगा।

प्लस, स्थानीय उपकरण जैसे gitk पर दिखाई देता है, और उनमें से भिन्नताएं हो सकती हैं और अन्य कामों आदि पर छूट दी जा सकती है। यह एक बहुत ही शक्तिशाली टूल है। इसका उपयोग करना सीखें।

मैं अक्सर करते हैं:

git add .; git commit -a -m 'WIP' 

सिर्फ वर्तमान काम पेड़ में सब कुछ दूर छिपाया जा अगर मुझे लगता है कि मैं बाधित हो गया हो। यदि मैं कुछ और परिवर्तन करता हूं, तो मैं उपयोग करता हूं:

git add .; git commit --amend 

मेरे "डब्ल्यूआईपी" प्रतिबद्धता को अद्यतन करने के लिए। जब मैं वास्तव में असली प्रतिबद्धता के लिए तैयार हूं, तो मैं बस:

git reset --soft HEAD~; git reset 

और अब मैं ध्यान से नियंत्रित कर सकता हूं कि अंतिम प्रतिबद्धता क्या होगी।

+1

मेरे पास एक भयानक स्मृति है और यह देखने के लिए गिट का उपयोग करना है कि मैं अपने काम पर कहां हूं (और मैगिट के साथ यह भी आसान है, और मेरे वर्कफ़्लो में शामिल है)। वास्तव में, आप समाधान हालांकि अधिक समझ में आता है। बस अधिक बार प्रतिबद्ध करें। बस मेरे वर्कफ़्लो को थोड़ा सा ट्विक करने की आवश्यकता है। धन्यवाद – Clarence

+2

सिर्फ स्पष्टीकरण के लिए, क्या 'गिट रीसेट - सॉफ्ट हेड ~ के बीच कोई इरादा अंतर है; गिट रीसेट 'और 'गीट रीसेट HEAD ^'? जहां तक ​​मैं देख सकता हूं कि वे दोनों "वाईआईपी" के माता-पिता को हेड और इंडेक्स को रीसेट कर देते हैं, कुछ या सभी काम करने वाले वृक्ष परिवर्तनों का उपयोग करके वास्तविक प्रतिबद्धता बनाने के लिए तैयार हैं लेकिन मुझे एक सूक्ष्मता याद आती है। –

+2

@ चार्ल्स बेली: "--सोफ्ट इंडेक्स फ़ाइल और न ही काम करने वाले पेड़ को स्पर्श नहीं करता है, बल्कि उन्हें एक अच्छे क्रम में रहने की आवश्यकता होती है। इससे आपकी सभी बदली गई फाइलें" परिवर्तन करने के लिए परिवर्तन "छोड़ देती हैं, क्योंकि गिट स्थिति डाली जाएगी यह। " यदि आप "गिट रीसेट हेड ^" का उपयोग करते हैं तो आपको यह घातक नहीं मिलेगा: मर्ज के बीच में सॉफ्ट रीसेट नहीं कर सकता। – maletin

5

वे मास्टर शाखा में दिखाई नहीं दे रहे हैं - अगर आपने हार्ड रीसेट और क्लीन किया है, तो वे गायब हो जाएंगे। जब आप शाखाएं स्विच करते हैं तो गिट केवल आपके स्थानीय संशोधनों को संरक्षित करता है।

यह आमतौर पर उपयोगी है; हो सकता है कि आपने महसूस किया हो कि आप उन संशोधनों को एक अलग शाखा में करना चाहते हैं जो आप वर्तमान में कर रहे हैं। यदि संशोधनों में दो शाखाओं के बीच अंतर के साथ संघर्ष किया गया है, तो गिट शाखाओं को बदलने से इनकार कर देगा।

आप सबसे अच्छे दृष्टिकोण के बारे में सही हैं, हालांकि - स्विचिंग शाखाएं मेरे अनुभव में git stash के सबसे आम उपयोगों में से एक है।

3

ऐसा लगता है जैसे आपने git branch profiles के साथ शाखा बनाई है, लेकिन इसे स्विच नहीं किया है, इसलिए आप master में रहे, और जब आपने प्रतिबद्ध किया तो फ़ाइल में बदलाव आया।

शाखा बनाने के बाद, आपको git checkout के साथ स्पष्ट रूप से स्विच करने की आवश्यकता है (केवल git checkout -b का उपयोग करके एक ही चरण में इसे नई शाखा बनाएं और इसे स्विच करें)।

आप परिवर्तन हैं, तो आप खोने के लिए नहीं करना चाहते हैं (या वर्तमान शाखा के लिए प्रतिबद्ध), लेकिन इसके बजाय अन्य शाखा में डाल दिया, कार्य करें:

git add -A 
git stash 
git checkout <other branch> 
git stash pop 
git stash पर

अधिक जानकारी git-scm.com

से उपलब्ध है