git: शाखा स्विच करें और बिना किए किसी भी परिवर्तन को अनदेखा करें


318

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

त्रुटि: आपके पास "X" में स्थानीय परिवर्तन हैं; शाखाओं को स्विच नहीं कर सकते।

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


1
मेरा मानना ​​है कि यह केवल तब होता है जब वे बदलाव के लिए प्रतिबद्ध होते हैं, लेकिन प्रतिबद्ध नहीं होते? अगर आप अभी तक git ऐड या लाइक का उपयोग करके फ़ाइलों का मंचन नहीं किया है तो git चेकआउट शाखाओं को बदलने के लिए ठीक काम करता है।
जेरेमी वॉल

1
हाय जेरेमी, 'मंचन' से आपका क्या अभिप्राय है? परिवर्तन करने से पहले उपयोगकर्ता को मजबूर करने के लिए शाखाओं को एक महान कार्यप्रवाह की तरह नहीं लगता है। उदाहरण के लिए, अगर मैं मास्टर रिपॉजिटरी में हूं और जल्दी से एक शाखा में कुछ जांचना चाहता हूं। मुझे पहले मास्टर को कोड देना होगा, यहां तक ​​कि यह कोड आधा लिखा गया है! क्या आप कह रहे हैं कि वास्तव में, इस स्थिति में एक शाखा की जांच करना संभव होना चाहिए?
डैनियल फैरेल

@boyfarrell अस्थायी रूप से बिना किए गए परिवर्तनों को सहेजने के लिए 'Git stash' का उपयोग कर सकते हैं।
होवीकैंप


1
जब आप पुरानी शाखा में परिवर्तन किए बिना किसी शाखा में जाते हैं, तो गिट नई शाखा में फ़ाइलों में परिवर्तन को मर्ज करने का प्रयास करता है। यदि विलय बिना किसी संघर्ष के किया जाता है, तो स्वाइपिंग शाखाएं सफल होंगी और आप नई शाखा में बदलाव देख सकते हैं। लेकिन अगर कोई संघर्ष होता है, तो आप प्राप्त करेंगे error: You have local changes to '<filename>'; cannot switch branches.और शाखा नहीं बदलेगी। आप git checkout -m <branch-name>टकराव और चेकआउट को शाखा में विलय करने और अपने आप को सुलझाने के लिए, या git checkout -f <branch-name>परिवर्तनों को अनदेखा करने के लिए कर सकते हैं।
समद मोंटेज़री

जवाबों:


400

शाखाओं को बदलने के लिए आपको एक साफ राज्य की आवश्यकता है। शाखा चेकआउट की अनुमति तभी दी जाएगी जब यह 'गंदी फाइलों' को प्रभावित नहीं करता है (जैसा कि चार्ल्स बेली टिप्पणियों में करता है)।

अन्यथा, आपको या तो:

  • अपने वर्तमान परिवर्तन को रोकें या
  • reset --hard HEAD (यदि आप उन छोटे परिवर्तनों को खोने का बुरा नहीं मानते हैं) या
  • checkout -f (शाखाओं को बदलते समय, भले ही सूचकांक या काम करने वाला पेड़ HEAD से भिन्न हो। यह स्थानीय परिवर्तनों को दूर करने के लिए उपयोग किया जाता है।)

या, हाल ही में:

भले ही सूचकांक या काम करने वाला पेड़ HEAD से भिन्न हो।
स्विचिंग लक्ष्य से मिलान करने के लिए सूचकांक और काम करने वाले दोनों पेड़ बहाल हैं।

यह अलग-अलग है git switch -m <branch-name>, जो वर्तमान शाखा, आपके काम करने वाले पेड़ की सामग्री, और नई शाखा के बीच तीन-तरफ़ा मर्ज को ट्रिगर करता है, और नई शाखा की जाती है: आप इस तरह से अपने काम को आगे नहीं बढ़ाएंगे।


34
"आपको शाखाओं को बदलने के लिए एक स्वच्छ राज्य की आवश्यकता है।" केवल तभी सच है जब शाखा परिवर्तन 'गंदी फ़ाइलों' को प्रभावित करता है।
सीबी बेली

10
स्टैश विधि के लिए, मैंने "git stash save", "git checkout otherbranch" टाइप किया, फिर अंत में "git stash pop"।
वेंकट डी।

1
वर्तमान में मुझे यह त्रुटि संदेश दिखाई नहीं देता है, और एक शाखा पर किए गए परिवर्तन दूसरे पर दिखाई देते हैं जब मैं "स्थिति" करता हूं। कुछ बदल गया है?
सेंटिल ए कुमार

2
धन्यवाद। चेकआउट -f मुझे क्या चाहिए था। मैंने git को रीसेट किया - git क्लीन -फिट git चेकआउट mybranch -f
nologo

1
यहाँ एक महान बात यह है कि एक शाखा की मूल परिभाषा का उल्लंघन करके गिट पूरी तरह से गलत हो गया। गिट शाखा के विपरीत एक रिपॉजिटरी से कांटे से दो पूरी तरह से अलग कार्यक्षेत्र का मतलब है।
nehem

125

यदि आप परिवर्तनों को छोड़ना चाहते हैं,

git checkout -- <file>
git checkout branch

यदि आप परिवर्तन रखना चाहते हैं,

git stash save
git checkout branch
git stash pop

10
वास्तव में रोमेरुन क्या कहता है (पूर्ण होने के लिए): git stash save(जब काम करने वाली शाखा में) तो git checkout branchXकुछ करें git add/commit -mआदि git checkout branchYऔर git stash popवापस पाने के लिए
Highmastdon

2
संभावित हो। मेरे पास एक स्थिति है, जहां मैं वह करना चाहता हूं जो उत्तर कहता है, अगर मैं इसे सही समझ रहा हूं: स्टेश परिवर्तन, वाई से एक्स पर स्विच करें, फिर पॉप बदलें और एक्स पर उन्हें प्रतिबद्ध करें।
बेन क्लेन

1
ध्यान दें कि git stash saveअब git stash push
अर्जेंटीना

यह उपनाम शाखाओं को बदलते समय परिवर्तन रखने के मामले को सरल करता है।
टॉम हेल

62

खैर, यह होना चाहिए

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
हां, स्टैश ग्लोबल है, ब्रांच स्पेसिफिक नहीं, अगर मैं ब्रांच को स्विच करने के बाद पॉप करता हूं तो मुझे दूसरी ब्रांच की तरह ही स्टैश मिलेगा (एससी)
आदित्य मित्तल

6
ध्यान दिया जाना चाहिए git stashलागू हो जाएगीgit stash save
चार्ली-Greenman

धन्यवाद, यह मेरे लिए बहुत उपयोगी है
गोविंद कुमार


16

ध्यान दें कि यदि आपने दूरस्थ शाखाएँ मर्ज कर दी हैं या आपके पास स्थानीय कमिटियाँ हैं और आप जिस दूरस्थ HEAD को करना चाहते हैं, उसे वापस जाना चाहते हैं:

git reset --hard origin/HEAD

HEAD अकेले ही स्थानीय कमेटी / मर्ज का उल्लेख करेंगे - कई बार मैं भूल गया हूं कि जब रीसेट करना और "आपकी रिपॉजिटरी एक्स एक्सम आगे है .." के साथ समाप्त होता है, जब मैं पूरी तरह से ड्यूक करने का इरादा रखता हूं / कमिट करता हूं और दूरस्थ शाखा में वापस लौटता हूं ।


9

यदि आपने उन फ़ाइलों में परिवर्तन किया है जो शाखाओं को स्विच करते समय Git को भी बदलना होगा, तो यह आपको नहीं होने देगा। काम के परिवर्तनों को त्यागने के लिए, उपयोग करें:

git reset --hard HEAD

फिर, आप शाखाओं को स्विच करने में सक्षम होंगे।


9

इन जवाबों में से किसी ने भी मेरी मदद नहीं की क्योंकि रीसेट और स्टैश के बाद भी मेरे पास फाइलें नहीं थीं। मुझे करना था:

git reset --hard HEAD
git clean -d -f

4

परिवर्तनों को खोने वाली एक नई शाखा में स्विच करना:

git checkout -b YOUR_NEW_BRANCH_NAME --force

किसी मौजूदा शाखा में परिवर्तन होने पर स्विच करना:

git checkout YOUR_BRANCH --force

4

आसान जवाब:

एक शाखा को चेकआउट के लिए मजबूर करना है

git checkout -f <branch_name>

एक शाखा की जाँच करने वाला बल वर्तमान शाखा में आपके द्वारा किए गए सभी परिवर्तनों को छोड़ने के लिए गिट को बता रहा है, और वांछित चेकआउट करें।

या यदि आप एक कमिट की जाँच कर रहे हैं

git checkout -f <commit-hash>


"मैंने सोचा था कि मैं बिना कमिटमेंट के शाखाएँ बदल सकता हूँ। यदि हां, तो मैं इसे कैसे स्थापित कर सकता हूँ? यदि नहीं, तो मुझे इस समस्या से कैसे छुटकारा मिलेगा?"

इसका उत्तर नहीं है , यह वस्तुतः Git का दर्शन है जिसे आप सभी परिवर्तनों पर नज़र रखते हैं, और यह कि प्रत्येक नोड (यानी प्रतिबद्ध) को आपके द्वारा किए गए नवीनतम परिवर्तनों के साथ अप-टू-डेट रहना होगा, जब तक कि आपने नहीं किया है पाठ्यक्रम की एक नई प्रतिबद्धता बनाई।


आपने बदलाव रखने का फैसला किया?

फिर उन्हें इस्तेमाल करके स्टैश करें

git stash

और फिर वांछित शाखा में अपने परिवर्तनों को अनस्टैश करने के लिए, उपयोग करें

git stash apply

जो आपको परिवर्तनों को लागू करेगा, लेकिन उन्हें स्टैश कतार में भी रखेगा। यदि आप उन्हें स्टाॅक स्टैक में नहीं रखना चाहते हैं, तो उनका उपयोग करके पॉप करें

git stash pop

वह applyतब और उसके बराबर हैdrop


2

टर्मिनल बंद करें, उस फ़ोल्डर को हटाएं जहां आपकी परियोजना है, फिर अपनी परियोजना और फिर से क्लोन करें।


2
git को प्रोजेक्ट को हटाने और फिर से क्लोन करने के लिए आपको पुश करने के लिए डिज़ाइन नहीं किया गया है! आप मूल से नवीनतम संस्करण प्राप्त करना चाहते हैं, तो आप बस reset --hard!
अहमद नूर जमाल अल-दीन

2

यदि आप परिवर्तनों को रखना चाहते हैं और शाखा को एकल पंक्ति कमांड में बदलना चाहते हैं

git stash && git checkout <branch_name> && git stash pop

1

एक नई शाखा में अनवामिटेड परिवर्तन ले जाएँ

मैंने इसके .gitconfigलिए एक उपनाम बनाया :

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

बदलने के लिए new-branch-name, उपयोग करने के लिए:

git spcosp new-branch-name

और किसी भी गैर-कमिट की गई फ़ाइल और इंडेक्स में बदलाव किए जाएंगे।


1

git checkout -f your_branch_name

git checkout -f your_branch_name

यदि आपको परिवर्तनों को बदलने में समस्याएँ हैं:

git checkout .

अगर आप अनरक्ड निर्देशिका और फ़ाइलों को हटाना चाहते हैं:

git clean -fd

0

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

git checkout -f शाखा-नाम

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