Git: मास्टर पर अनस्टेज / अनकमिज़्ड बदलाव से एक ब्रांच बनाएँ


991

संदर्भ: मैं एक साधारण सुविधा को जोड़ने के लिए मास्टर पर काम कर रहा हूं। कुछ मिनटों के बाद मुझे एहसास हुआ कि यह इतना आसान नहीं था और नई शाखा में काम करना बेहतर होना चाहिए था।

यह हमेशा मेरे साथ होता है और मुझे पता नहीं है कि किसी अन्य शाखा में कैसे स्विच किया जाए और मेरे साथ इन सभी असम्बद्ध परिवर्तनों को मास्टर शाखा को छोड़ दें। मुझे लगता है कि git stash && git stash branch new_branchबस यह पूरा होगा, लेकिन यह मुझे मिलता है:

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ echo "hello!" > testing 

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)

~/test $ git s
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git checkout master
M   testing
Switched to branch 'master'

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

क्या आप जानते हैं कि इसे पूरा करने का कोई तरीका है?


1
यद्यपि आपकी समस्या का एक सरल समाधान है, क्या आप यह निर्दिष्ट कर सकते हैं कि आपको जो परिणाम चाहिए उससे क्या भिन्न होता है?
गौथियर

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

1
मेरा संपादित उत्तर देखें। यदि आप एक स्वच्छ मास्टर की जांच करना चाहते हैं तो आपको नई शाखा में अपने स्थानीय परिवर्तन करने की आवश्यकता है। स्थानीय परिवर्तन वर्तमान HEAD और डिस्क पर आपकी फ़ाइलों के बीच अंतर हैं। स्थानीय फ़ाइलों पर इन परिवर्तनों को संस्करणबद्ध नहीं किया गया है, अगर आपको बाद में उन्हें फिर से प्राप्त करना है तो आपको उन्हें कहीं और सहेजने के लिए गिट को बताने की आवश्यकता है।
गौथियर

4
Git
CL

जवाबों:


1207

कोई ज़रूरत नहीं है।

git checkout -b new_branch_name

आपके स्थानीय परिवर्तनों को नहीं छूता है। यह सिर्फ वर्तमान HEAD से शाखा बनाता है और वहां HEAD सेट करता है। तो मुझे लगता है कि आप क्या चाहते हैं।

--- चेकआउट मास्टर का परिणाम समझाने के लिए संपादित करें ---

क्या आप भ्रमित हैं क्योंकि checkout masterआपके परिवर्तन नहीं हुए हैं?

चूंकि परिवर्तन केवल स्थानीय हैं, git नहीं चाहता कि आप उन्हें आसानी से खो दें। शाखा बदलने पर, गिट आपके स्थानीय परिवर्तनों को अधिलेखित नहीं करता है। आपका परिणाम checkout masterहै:

M   testing

, जिसका मतलब है कि आपकी कामकाजी फाइलें साफ नहीं हैं। git ने HEAD को बदल दिया, लेकिन आपकी स्थानीय फ़ाइलों को अधिलेखित नहीं किया। यही कारण है कि आपकी अंतिम स्थिति अभी भी आपके स्थानीय परिवर्तनों को दिखाती है, हालाँकि आप चालू हैं master

यदि आप वास्तव में स्थानीय परिवर्तनों को छोड़ना चाहते हैं, तो आपको चेकआउट के साथ बाध्य करना होगा -f

git checkout master -f

चूंकि आपके परिवर्तन कभी प्रतिबद्ध नहीं थे, इसलिए आप उन्हें खो देंगे।

अपनी शाखा में वापस जाने की कोशिश करें, अपने बदलाव करें, फिर मास्टर की जांच करें।

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

आपको Mपहले चेकआउट के बाद एक संदेश प्राप्त करना चाहिए , लेकिन उसके बाद और बाद में checkout masterऔर git statusसंशोधित फ़ाइलों को नहीं दिखाना चाहिए।

--- कार्य निर्देशिका (स्थानीय फ़ाइलों) के बारे में भ्रम को दूर करने के लिए संपादित करें ---

आपकी पहली टिप्पणी के जवाब में, स्थानीय परिवर्तन सिर्फ ... ठीक है, स्थानीय हैं। Git उन्हें स्वचालित रूप से सहेजता नहीं है, आपको इसे बाद में सहेजने के लिए बताना होगा। यदि आप परिवर्तन करते हैं और उन्हें स्पष्ट रूप से कमिट नहीं करते या स्टैश नहीं करते हैं, तो git उनका संस्करण नहीं बनाएगा। यदि आप HEAD ( checkout master) को बदलते हैं, तो स्थानीय परिवर्तन सहेजे नहीं गए हैं।


32
यहाँ भ्रमित करने वाली बात यह है, कि git का मैन पेज बताता है कि git checkout"इंडेक्स या निर्दिष्ट ट्री में वर्जन से मिलान करने के लिए वर्किंग ट्री में फाइल को अपडेट करता है।" यही कारण है कि मान लिया गया है आपकी फाइल सिस्टम में अपने परिवर्तन हो जाएगा चला गया बाद में। उन्हें वापस पाने का कोई मौका दिए बिना। यहां तक ​​कि अगर आप कहते हैं कि वे नहीं करेंगे, यह अभी भी एक बहुत बुरा लग रहा है। मुझे इस पर बिल्कुल भरोसा नहीं है । या तो प्रलेखन वास्तव में बुरा है या गिट का डिफ़ॉल्ट व्यवहार वास्तव में खतरनाक है। यह पता लगाने के लिए कि आपको इस परिवर्तन को खोना नहीं चाहिए, किसी को "स्वचालित" अनुमानी पर भरोसा नहीं करना चाहिए।
Evi1M4chine

16
यदि आप एक ऐसी प्रतिबद्धता की जाँच कर रहे हैं, जो आपके स्थानीय परिवर्तनों (यदि वर्तमान वचन और लक्ष्य प्रतिबद्ध के बीच का इतिहास आपकी स्थानीय रूप से संशोधित फ़ाइलों को छूती है) को अस्वीकार कर देगी, तो इनकार कर देती है। केवल अगर checkoutआपके स्थानीय परिवर्तनों के साथ संघर्ष नहीं होता है, तो चेकआउट काम करता है और अकेले स्थानीय परिवर्तनों को छोड़ देता है। मैं बुरी भावना को समझता हूं, हालांकि, मैन पेज को शायद "अपडेटेड काम के पेड़ में अनमॉडिफाइड फाइलें अपडेट करें" कहना चाहिए। दूसरी ओर Git स्थानीय परिवर्तनों को खोना आसान नहीं बनाता है। git checkoutया तो अपने स्थानीय परिवर्तन को अकेले करने देता है, या यदि कोई संघर्ष होता है तो मना कर देता है।
गौथियर

1
अच्छा, मैं स्थानीय परिवर्तन लाए बिना किसी अन्य शाखा में कैसे चेकआउट करूंगा?
ア ッ ア ア

5
@ एलेक्स git checkout <other_branch> -f। आप चेतावनी के बिना अपने स्थानीय परिवर्तन खो देंगे।
गौथियर

2
@ Evi1M4chine पहले वाला। प्रलेखन है वास्तव में बुरा नहीं है।
Qwertie

62

प्रयत्न:

git stash
git checkout -b new-branch
git stash apply

6
क्या यह केवल 'git चेकआउट -b नई-शाखा' करने के लिए अलग है?
एड्रियन मौट

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

6
या अंतिम दो चरणों के बजाय: git stash branch new-branch
पुनर्वसन

1
git stash की अब आवश्यकता नहीं है
kory

जब आपके पास पहले से मौजूद शाखा होती है, जहाँ आप अपना सारा सामान रखना चाहते हैं, तो स्टैश मेरे लिए समझ में आता है: (आखिरकार gitch --all, दूरस्थ शाखा मूल पर पाने के लिए) git stash; git चेकआउट <मौजूदा-शाखा>; गिट स्टैश लागू;
पाओलोफ़ Pa६

24

दो चीजें जो आप कर सकते हैं:

git checkout -b sillyname
git commit -am "silly message"
git checkout - 

या

git stash -u
git branch sillyname stash@{0}

( git checkout -<- डैश आपके द्वारा पिछली शाखा के लिए एक शॉर्टकट है)

( git stash -u<- -uइसका मतलब यह है कि यह अस्थिर परिवर्तन भी लेता है)


7

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

यहां छवि विवरण दर्ज करें


यह नई शाखा बनाने से पहले परिवर्तनों को चुरा लेता है इसलिए यह उन्हें नहीं रखता है (मैक ओएस पर संस्करण 223)
फर्नांडो गैलेगो

2

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

git checkout -b branch_name

यह आपकी वर्तमान शाखा से एक नई शाखा बनाएगा (इसे मास्टर माना जाएगा), असम्बद्ध परिवर्तनों की प्रतिलिपि बनाएँ और नई शाखा में स्विच करें।

नई शाखा में अपने परिवर्तन करें।

git commit -m "First commit"

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

git push --set-upstream origin feature/feature/NEWBRANCH

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

अब, यदि आप मास्टर ब्रांच से अपने अन-कम किए गए परिवर्तनों को फेंकना चाहते हैं, तो उपयोग करें:

git checkout master -f

यह चेकआउट पर किसी भी स्थानीय परिवर्तन को हटा देगा।


यह उत्तर स्वीकृत से अलग कैसे है?
kometen

यद्यपि स्वीकृत उत्तर के साथ कुछ ओवरलैप है, यह कदम गाइड द्वारा एक सरल कदम प्रदान करता है, और इसमें एक नई शाखा को दूरस्थ रूप से धक्का देने के लिए आवश्यक संचालन भी शामिल है। सरल, स्पष्ट और उपयोगी।
केजरतन

यह उत्तर स्पष्ट है और इससे मुझे बहुत मदद मिली।
वादिम

0

Windows के लिए नवीनतम GitHub क्लाइंट में , यदि आपके पास परिवर्तन रहित हैं, और एक नई शाखा बनाने के लिए चुनें। यह आपको संकेत देता है कि आप इस सटीक परिदृश्य को कैसे संभाल सकते हैं:

यहां छवि विवरण दर्ज करें

यदि आप केवल शाखा को स्विच करते हैं तो भी यही लागू होता है।

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