स्थानीय परिवर्तन को छोड़े बिना गिट स्विच शाखा


181

ठीक है, हम कहते हैं कि एक दिन हम संशोधनों का एक समूह बनाने के लिए होते हैं और जब हम उन्हें प्रतिबद्ध करने जाते हैं तो हम नोटिस करते हैं कि हम गलत शाखा पर काम कर रहे थे।

हम स्थानीय परिवर्तनों को समाप्त किए बिना शाखाओं को स्विच करने के लिए कैसे बाध्य कर सकते हैं

मैं शायद इसके बारे में एक भोली तरह से जा रहा हूं, जब मैं एक उत्तर की प्रतीक्षा करता हूं, लेकिन मैं जानना चाहूंगा कि क्या एक सही प्रक्रिया है क्योंकि मैं झूठ बोल रहा हूं अगर मैंने कहा कि यह मेरे साथ पहले नहीं हुआ है ...

  • बैकअप ने रेपो को बदल दिया
  • git reset --hard
  • git checkout right-branch
  • परिवर्तन पुनर्स्थापित करें
  • git commit -m "changes"

जवाबों:


342

आप कितने दूर हैं और किस शाखा (तों) पर आप उन्हें चाहते हैं, इस पर निर्भर करते हुए विभिन्न तरीकों का एक गुच्छा है।

आइए एक क्लासिक गलती करें:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

इसलिए अब आप ये बदलाव चाहते हैं, जो आपने अभी तक नहीं masterकिया है develop

  1. आप तो नहीं है एक developअभी तक, विधि तुच्छ है:

    $ git checkout -b develop
    

    यह developअब आप जहां भी हैं वहां से एक नई शाखा शुरू करते हैं। अब आप कर सकते हैं और नया सामान सब पर है develop

  2. आप की क्या ज़रूरत है एक develop। देखें कि क्या Git आपको कुछ किए बिना स्विच करने देगा:

    $ git checkout develop
    

    यह या तो सफल होगा, या शिकायत करेगा। अगर यह सफल होता है, तो बहुत अच्छा! बस कमिट करें। यदि नहीं ( error: Your local changes to the following files would be overwritten ...), आपके पास अभी भी बहुत सारे विकल्प हैं।

    शायद सबसे आसान है git stash(जैसा कि सभी अन्य उत्तर-ers कि मुझे क्लिक करने के लिए postकहा गया है)। भागो git stash saveया git stash push, 1 या सिर्फ सादा / के git stashलिए छोटा है :savepush

    $ git stash
    

    यह आपके कोड (हाँ, यह वास्तव में कुछ कमिट करता है) एक अजीब गैर-शाखा-वाई पद्धति का उपयोग करता है। यह बनाता है "किसी भी शाखा पर" नहीं हैं, लेकिन अब भंडार में सुरक्षित रूप से संग्रहीत हैं, इसलिए अब आप शाखाओं को स्विच कर सकते हैं, फिर स्टैश को "लागू करें":

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    यदि सब ठीक हो जाता है, और आप परिणाम पसंद करते हैं, तो आपको git stash dropस्टैश करना चाहिए । यह अजीब गैर-शाखा-वाई कमिट के संदर्भ को हटा देता है। (वे अभी भी रिपॉजिटरी में हैं, और कभी-कभी एक आपातकालीन स्थिति में पुनर्प्राप्त किए जा सकते हैं, लेकिन अधिकांश उद्देश्यों के लिए, आपको इस बिंदु पर उन पर विचार करना चाहिए।)

applyकदम रखे परिवर्तन, Git के शक्तिशाली अंतर्निहित मर्ज मशीनरी, बात एक ही प्रकार का उपयोग करता है जब आप शाखा का आपस में विलय कर उपयोग करने का एक मर्ज करता है। इसका मतलब है कि आप "मर्ज टकराव" प्राप्त कर सकते हैं यदि आप जिस शाखा पर गलती से काम कर रहे थे, वह उस शाखा से पर्याप्त रूप से अलग है जिस पर आप काम करना चाहते थे। इसलिए यह एक अच्छा विचार है कि आप यह मानने से पहले परिणामों का सावधानीपूर्वक निरीक्षण करें कि स्टैस्ट साफ-सुथरे तरीके से लगाया गया है, भले ही गिट खुद किसी मर्ज संघर्ष का पता नहीं लगाता हो।

बहुत से लोग उपयोग करते हैं git stash pop, जो शॉर्ट-हैंड के लिए है git stash apply && git stash drop। यह ठीक है जहां तक ​​यह जाता है, लेकिन इसका मतलब है कि यदि आवेदन में गड़बड़ी होती है, और आप तय करते हैं कि आप इस रास्ते को आगे नहीं बढ़ाना चाहते हैं, तो आप आसानी से वापस नहीं आ सकते। इसलिए मैं अलग-अलग सलाह देता हूं apply, परिणामों का निरीक्षण करता हूं , dropकेवल तभी जब / जब संतुष्ट हो। (यह निश्चित रूप से एक और बिंदु पेश करता है जहां आप एक और कॉफी ब्रेक ले सकते हैं और भूल सकते हैं कि आप क्या कर रहे थे, वापस आओ, और गलत काम करें, इसलिए यह एक पूर्ण इलाज नहीं है।)


1save में git stash saveएक नया गुप्त कोष बनाने के लिए वर्ष क्रिया है। Git संस्करण 2.13 ने चीजों को अधिक सुसंगत बनाने popऔर निर्माण कमांड में अधिक विकल्प जोड़ने के लिए नई क्रिया की शुरुआत की । Git संस्करण 2.16 ने पुरानी क्रिया को औपचारिक रूप से हटा दिया (हालांकि यह अभी भी Git 2.23 में काम करता है, जो कि मैं इसे संपादित कर रहा हूं उस समय नवीनतम रिलीज़ है)।


3
क्या होगा यदि मैं वर्तमान शाखा (जैसे परिवर्तन समाप्त नहीं हुआ है) को समाप्त किए बिना किसी अन्य शाखा में स्विच करना चाहता हूं और बाद में ले जाने के लिए वापस स्विच करता हूं?
stt106

@ stt106: आपको अभी भी प्रतिबद्ध होना चाहिए, लेकिन आप इसे कर सकते हैं, क्योंकि इसमें और अन्य उत्तर, git stashताकि कमिट्स-के लिए git stash, आपको एक असामान्य व्यवस्था में, स्टैश एंट्री के लिए दो कमिट मिलें- किसी भी शाखा में नहीं हैं । बहुत कम अवधि के विशेष मामलों को छोड़कर, हालांकि, मैं आमतौर पर एक सामान्य प्रतिबद्ध बनाना पसंद करता हूं। आप कर सकते हैं git reset --softया git reset --mixedबाद में, या का उपयोग git commit --amendएक तरफ को गिरवी रखना, जब आप उस शाखा पर काम कर रहे हैं वापस। (आधुनिक Git में, आप भी उपयोग कर सकते हैं git worktree add, एक और भी बेहतर समाधान हो सकता है।)
torek

"यह या तो सफल होगा, या शिकायत करेगा।" चेकआउट करते समय सफलता या त्रुटि के कौन से कारण होंगे?
नैनोकव

1
@nanocv: देखने stackoverflow.com/questions/22053757/...
torek

मेरे सभी स्थानीय परिवर्तन तब समाप्त हो रहे हैं जब मैं उपरोक्त चरणों के साथ स्विच कर रहा हूँ जो कि मैं <a> शाखा में हूँ और अपने परिवर्तन कर रहा हूँ और मैं <b> शाखा में जाना चाहता हूँ और उसमें अपने सभी परिवर्तनों को धकेलना चाहता हूँ। जब मैं गिट स्टैश कर रहा हूं और अन्य शाखाओं में जा रहा हूं तो इसकी सभी फाइलें <b> शाखा की और खींच रही हैं और मेरे स्थानीय परिवर्तन नष्ट हो रहे हैं
मुकुल मुंजाल

38

गिट स्टैश का प्रयोग करें

git stash

यह एक स्टैक में परिवर्तन को धक्का देता है। जब आप उन्हें वापस उपयोग करना चाहते हैं

 git stash apply

तुम भी व्यक्तिगत आइटम बाहर खींच सकते हैं। पूरी तरह से धमाके को दूर करने के लिए:

 git stash clear

7
अंतिम आदेश शायद होना चाहिए git stash drop; git stash clearपूरी तरह से स्टैक को मिटा देगा, जिसमें संभवतः इस क्रम के असंबंधित झड़प भी शामिल है।
लेलैंड

15
  • git stash अपने असम्बद्ध परिवर्तनों को बचाने के लिए
  • git stash list अपने सहेजे गए अनछुए स्टैड को सूचीबद्ध करने के लिए
  • git stash apply stash@{x} जहाँ x 0,1,2 हो सकता है..जो आपके द्वारा किए गए चोरी का है

4

आप या तो यह कर सकते हैं :

  • का प्रयोग करें git stashअपने परिवर्तनों को स्थगित करने की या,

  • एक और शाखा बनाएं और वहां अपने बदलाव करें, और फिर उस शाखा को अपनी कार्यशील निर्देशिका में मर्ज करें

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