त्रुटि: छूट के साथ नहीं खींच सकता: आपके पास अस्थिर परिवर्तन हैं


138

मैंने एक परियोजना पर कुछ दोस्तों के साथ सहयोग करना शुरू कर दिया है और वे हरोकू गिट रिपॉजिटरी का उपयोग करते हैं।

मैंने कुछ दिन पहले रिपॉजिटरी को क्लोन किया और उन्होंने कुछ बदलाव किए हैं इसलिए मैं नवीनतम अपडेट प्राप्त करने की कोशिश कर रहा हूं

मैंने git pull --rebaseयहां बताए अनुसार कमांड चलाया (क्या इसे करने का यह सही तरीका है?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

मुझे निम्नलिखित त्रुटि मिलती है:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

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

कोई भी विचार जो मैं कर सकता हूं?

जवाबों:


173

क्या git status, यह आपको दिखाएगा कि क्या फाइलें बदल गई हैं। चूंकि आपने कहा था कि आप उन परिवर्तनों को नहीं रखना चाहते जो आप कर सकते हैं git checkout -- <file name>या git reset --hardपरिवर्तनों से छुटकारा पाने के लिए।

अधिकांश भाग के लिए, git आपको बताएगा कि परिवर्तनों के बारे में क्या करना है। उदाहरण के लिए, आपका त्रुटि संदेश git stashआपके परिवर्तनों के लिए कहा गया है । यदि आप उन्हें रखना चाहते हैं तो यह होगा। खींचने के बाद, आप तब करेंगे git stash popऔर आपके परिवर्तनों को फिर से लागू किया जाएगा।

git status यह भी कि फ़ाइल को कमिट करने के लिए मंचित किया गया है या नहीं, इसके आधार पर परिवर्तनों से कैसे छुटकारा पाया जाए।


1
यह काम करने लगा था, लेकिन अब मैं एक और त्रुटि का सामना कर रहा हूं (भविष्य के
अभिजात वर्ग को

मैं सचमुच यह हर बार कर रहा हूँ, अभी हाल ही में। फ़ाइलों को खींचने से पहले, जो आपके वर्तमान परिवर्तनों को प्रभावित नहीं करती हैं, ठीक है, लेकिन अब, आपको उन सभी चीज़ों की आवश्यकता है जो आपने बदल दी हैं। मैं धक्का भी नहीं दे सकता, मैं उपयोग करने के लिए मजबूर हूंgit push -f
कर्मा ब्लैकशॉ

@ कर्मबालाशॉ आपको पुश करने के लिए मजबूर करने की आवश्यकता नहीं होनी चाहिए। यदि आपको एक बल पुश करना है, तो इसका मतलब है कि आपका स्थानीय इतिहास और दूरस्थ इतिहास अलग हैं और यह एक अलग प्रश्न है कि यह उत्तर क्या है।
Schleis

यह वास्तव में एक अलग बात है कि इस प्रश्न का दायरा क्या है। लेकिन मुझे वर्तमान शाखा को हटाने और विकास से एक नई शाखा बनाने का एक तरीका मिला। मुझे लगता है कि यह मेरी शाखा थी जिसमें कुछ चीजें गलत तरीके से कॉन्फ़िगर की गई थीं।
कर्मा ब्लैकशॉ

91

यदि आप रिबास करते समय अपने कामकाजी बदलावों को रखना चाहते हैं, तो आप उपयोग कर सकते हैं --autostash। से प्रलेखन :

रिबास शुरू करने से पहले, स्थानीय संशोधनों को दूर हटा दें ( यदि आवश्यक हो तो गिट-स्टैश [1] देखें ) और जब किया जाता है, तो इसे लागू करें।

उदाहरण के लिए:

git pull --rebase --autostash

7
यह आधुनिक उत्तर है।
adl

13
यदि आप चाहते हैं कि ऑटोस्टैश आपके द्वारा निर्धारित डिफ़ॉल्ट व्यवहार हो git config --global rebase.autoStash true तो आपको स्विच पास करने की आवश्यकता नहीं है।
ज़ॉडेचेस

1
यह, मैं क्या देख रहा था! (ध्यान दें कि कमांड लाइन स्विच git 2.9 से उपलब्ध है, लेकिन विकल्प rebase.autostash2.6 से उपलब्ध है)।
20

यह git rebase --interactiveभी महान काम करता है!
दान डैस्कलेस्क्यू

6
यह डिफ़ॉल्ट क्यों नहीं है?
निक

49

रिबास के साथ खींचना सामान्य तौर पर एक अच्छा अभ्यास है।

हालाँकि आप ऐसा नहीं कर सकते हैं कि यदि आपका सूचकांक साफ नहीं है, यानी आपने ऐसे बदलाव किए हैं जो प्रतिबद्ध नहीं हैं।

आप अपने बदलावों को बनाए रखना चाहते हैं, यह मानकर आप काम कर सकते हैं:

  1. इसके साथ अपने परिवर्तनों को रोकें: git stash
  2. रिबास के साथ मास्टर से खींचो
  3. आपके (1) में git stash apply stash@{0}या फिर सरल किए गए परिवर्तनों को फिर से लागू करेंgit stash pop

1
यह काम करने लगा था, लेकिन अब मैं एक और त्रुटि का सामना कर रहा हूं (भविष्य के
अभिजात वर्ग को

6
@nehemiahjacob आप git stash popहाल ही में किए गए परिवर्तनों को लागू करने और लंबे समय तक याद रखने से भी बच सकते हैं apply stash@{0}
कोस्टा रोस

मुझे हर समय यही करना है। कोई आसान तरीका?
Alper

@alper आमतौर पर आप दूसरी (सुविधा) शाखा पर काम करते हैं। मेरे अनुभव में, मैं केवल अपना काम करने के बाद ही मास्टर के खिलाफ उठता हूं और फिर से उठता हूं, इसलिए मुझे स्टैश / पॉप की आवश्यकता नहीं है। यदि आप अपने आप को पाते हैं कि आपके विकास कार्य के दौरान बहुत कुछ कर रहे हैं, तो आप हमेशा अपने .bashrc(या जो भी आप का उपयोग करते हैं) में एक उपनाम बना सकते हैं :alias stashpull='git stash; git pull; git stash pop'
कोस्टस रूसिस

@ KostasRousis मेरे पास सटीक उपनाम, योग्य है। मैं इसे 'sppgit'
कहता हूं

30

पहले एक के साथ शुरू करो git status

देखें कि क्या आपके पास कोई लंबित परिवर्तन है। उन्हें छोड़ने के लिए, भागो

git reset --hard

यह काम करने लगा था, लेकिन अब मैं एक और त्रुटि का सामना कर रहा हूं (भविष्य के
अभिजात वर्ग को


10

आप हमेशा कर सकते हैं

git fetch && git merge --ff-only origin/master

और आपको या तो (ए) कोई परिवर्तन नहीं होगा यदि आपने परिवर्तन किए बिना परिवर्तन किए हैं जो कि अपस्ट्रीम परिवर्तन या (बी) के साथ टकराव के रूप में एक ही प्रभाव है / खींच / लागू करें: आपको एचएएडी से नवीनतम बदलावों पर लगाने के लिए एक छूट और आपके अनधिकृत परिवर्तन जैसा है।


6

जब अस्थिर परिवर्तन होता है क्योंकि गिट एक फाइल पर ईओएल सम्मेलनों को ठीक करने का प्रयास कर रहा है (जैसा कि हमेशा मेरा मामला है), कोई भी राशि की चोरी या चेक-आउट या रीसेट करना इसे दूर नहीं करेगा।

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

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

देखा! यह मुझे अभी तक विफल नहीं हुआ है।


2

यदि आप अपने परिवर्तनों को स्वचालित रूप से रोकना चाहते हैं और उन्हें हर छूट के लिए अस्थिर करना चाहते हैं, तो आप ऐसा कर सकते हैं:

git config --global rebase.autoStash true

1
यह एकमात्र उत्तर है जो गिट के नवीनतम संस्करण को उसी तरह से काम करता है जिस तरह से गिट ने हमेशा अतीत में काम किया है। क्यों लोगों को जोड़ते हैं --autostashजब यह सिर्फ हो सकता है ... स्वचालित?
एंड्रयू कॉस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.