चेक-इन के लिए परिवर्तित फ़ाइलों को दूसरी शाखा में ले जाना


422

यह अक्सर मेरे साथ होता है: मैं कुछ कोड लिखता हूं, अपने परिवर्तनों की जांच करने के लिए जाता हूं, और फिर महसूस करता हूं कि मैं उन परिवर्तनों की जांच करने के लिए उचित शाखा में नहीं हूं। हालाँकि मैं अपने परिवर्तनों को वापस लिए बिना किसी अन्य शाखा में नहीं जा सकता। क्या किसी अन्य शाखा में परिवर्तन की जाँच करने का एक तरीका है?

जवाबों:


751

git stash आपका दोस्त है।

यदि आपने अभी तक कमिटमेंट नहीं किया है, तो बस चलाएं git stash। यह आपके सभी परिवर्तनों को दूर कर देगा।

उस शाखा पर स्विच करें जिस पर आप परिवर्तन चाहते हैं और चलाएं git stash pop

गिट स्टैश के लिए बहुत सारे उपयोग हैं। यह निश्चित रूप से अधिक उपयोगी कारणों में से एक है।

एक उदाहरण:

# work on some code
git stash
git checkout correct-branch
git stash pop

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

2
मैंने इसे प्राप्त किया। इसलिए मुझे स्टैश, स्विच ब्रांच और फिर पॉप C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
इस्माइल जूल

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

ब्रावो बच्चे! अगर आपको कमिट करना चाहिए तो आपको क्या करना चाहिए
इशान श्रीवास्तव

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

248

यदि आपने पहले से ही अपने परिवर्तन नहीं किए हैं , तो बस git checkoutनई शाखा में जाने के लिए उपयोग करें और फिर उन्हें सामान्य रूप से करें - जब तक आप उन्हें नहीं करते तब तक फाइल में परिवर्तन किसी विशेष शाखा से बंधा नहीं होता है।

यदि आपने पहले ही अपने परिवर्तन कर लिए हैं:

  1. टाइप करें git logऔर उस SHA को याद रखें जिसे आप स्थानांतरित करना चाहते हैं।
  2. जिस शाखा को आप कमिट करना चाहते हैं, उसे देखें।
  3. git cherry-pick SHAऊपर से SHA को प्रतिस्थापित करने का प्रकार ।
  4. अपनी मूल शाखा में वापस जाएं।
  5. git reset HEAD~1अपनी गलत-शाखा प्रतिबद्ध करने से पहले रीसेट करने के लिए उपयोग करें ।

cherry-pick किसी दिए गए वचन को लेता है और वर्तमान में चेक-आउट किए गए सिर पर लागू होता है, इस प्रकार आप एक नई शाखा को प्रतिबद्ध करने की अनुमति देते हैं।


9
यहां आपको चेरी-पिक की भी आवश्यकता नहीं है। git reset HEAD~N --softऔर उसके बाद git checkout -bसभी स्थानांतरित करने के लिए अब एक नई शाखा को अप्रतिबद्ध कोड।
हारून

19
जब तक आप उन्हें नहीं करते तब तक फाइल में परिवर्तन किसी विशेष शाखा से नहीं जुड़ा होता है। <- यह। इससे मेरे लिए एक रहस्य सुलझ गया। धन्यवाद।
14

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

3
@ मिस्चा काम नहीं करता है अगर आप दो शाखाओं के बीच स्विच कर रहे हैं जो अलग-अलग इतिहास हैं
वाटशुन

1
@Aaron यह बहुत अच्छा है (पोस्ट-कमिट परिदृश्य के लिए)! कृपया एक अलग उत्तर दें।
जैकटोज़

16

दुर्भाग्य से यह मेरे लिए काफी नियमित रूप से और साथ ही होता है और मैं का उपयोग git stashकरता है, तो मैं पहले अपनी गलती का एहसास हुआ git commitऔर उपयोगgit cherry-pick अन्यथा, दोनों आदेशों अन्य उत्तर में बहुत अच्छी तरह से समझाया गया है

मैं इसके लिए एक स्पष्टीकरण जोड़ना चाहता हूं git checkout targetBranch: यह कमांड केवल आपकी वर्किंग डायरेक्टरी और स्टेज्ड स्नैपशॉट को सुरक्षित रखेगी यदि टारगेटब्रांच का आपकी वर्तमान ब्रांच के समान इतिहास हो।

यदि आपने पहले से ही अपने परिवर्तन नहीं किए हैं, तो नई शाखा में जाने के लिए बस गिट चेकआउट का उपयोग करें और फिर उन्हें सामान्य रूप से करें

@ एम्बर का कथन गलत नहीं है, जब आप एक नए ब्रांच में जाते हैं git checkout -b newBranch, तो एक नया पॉइंटर बनाया जाता है और यह आपकी वर्तमान शाखा की तरह ही सटीक होने की ओर इशारा करता है।
वास्तव में, यदि आपके पास एक अन्य शाखा है जो आपकी वर्तमान शाखा के साथ इतिहास साझा करती है (दोनों एक ही वचन पर) तो आप "अपने परिवर्तनों को आगे बढ़ा सकते हैं"git checkout targetBranch

हालांकि, आमतौर पर अलग-अलग शाखाओं का मतलब अलग-अलग इतिहास होता है, और Git आपको इन शाखाओं के बीच एक गंदे कार्य निर्देशिका या स्टेजिंग क्षेत्र के साथ स्विच करने की अनुमति नहीं देगा। जिस स्थिति में आप या तो कर सकते हैं git checkout -f targetBranch(क्लीन एंड थ्रो बदलाव) या git stage+ git checkout targetBranch(क्लीन एंड सेव चेंज), बस रनिंग git checkout targetBranchएक त्रुटि देगा:

त्रुटि: निम्नलिखित फ़ाइलों के लिए आपके स्थानीय परिवर्तन चेकआउट द्वारा अधिलेखित हो जाएंगे: ... कृपया अपनी परिवर्तन करें या शाखाओं को स्विच करने से पहले उन्हें रोकें। निरस्त


5

एक सॉफ्ट गिट रीसेट आपके सूचकांक में प्रतिबद्ध बदलाव वापस लाएगा। अगला, उस शाखा की जाँच करें जिसे आपने करने का इरादा किया था। तब Git प्रतिबद्ध एक नया के साथ संदेश के लिए प्रतिबद्ध।

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

से Git डॉक्स :

git reset [<mode>] [<commit>]यह फ़ॉर्म वर्तमान शाखा प्रमुख को रीसेट करता है और संभवतः अनुक्रमणिका (इसे पेड़ पर रीसेट करना) और उसके आधार पर कार्यशील वृक्ष को अद्यतन करता है। यदि छोड़ दिया जाता है, तो डिफाल्ट - एमिक्स किया जाता है। निम्नलिखित में से एक होना चाहिए:

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

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