वर्तमान परिवर्तनों के साथ Git शाखा बनाएँ


848

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

मैं एक नई शाखा कैसे बना सकता हूं और इन सभी बदलावों को बिना गंदे मास्टर के मेरे साथ ले जा सकता हूं ?




4
हां ये डुप्लिकेट प्रश्न हैं, लेकिन शब्दांकन इतना अलग है कि मुझे लगता है कि इसे रखना उपयोगी है। यहां कीवर्ड्स नोट करें: branch current changesबनाम existing uncommited branch। जो कोई भी अंग्रेजी बोलता है, वह तुरंत देखेगा कि वे समान हैं, लेकिन खोज इंजन शायद नहीं होगा। यह सवाल रखो।
स्कॉट Biggs

जवाबों:


690

यदि आपने अभी तक कोई कमिट नहीं किया है, तो केवल (1: शाखा) और (3: चेकआउट) ही पर्याप्त होगा।
या, एक आदेश में:git checkout -b newBranch

जैसा कि git resetमैन पेज में बताया गया है :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. आपने कुछ कमिट किए हैं, लेकिन एहसास है कि वे " master" शाखा में होने के लिए समय से पहले थे । आप उन्हें विषय शाखा में चमकाना जारी रखना चाहते हैं, इसलिए topic/wipकरंट की शाखा बंद करें HEAD
  2. masterउन तीन आवागमन से छुटकारा पाने के लिए शाखा को फिर से शुरू करें।
  3. " topic/wip" शाखा में स्विच करें और काम करते रहें।

नोट: एक git reset --hardकमांड के "विनाशकारी" प्रभाव के कारण (यह इंडेक्स और वर्किंग ट्री को रीसेट करता है। वर्किंग ट्री में ट्रैक की गई फाइलों में कोई भी बदलाव जो छूट गए <commit>हैं), मैं इसके साथ जाना चाहूंगा:

$ git reset --soft HEAD~3  # (2)

यह सुनिश्चित करेगा कि मैं कोई भी निजी फ़ाइल नहीं खो रहा हूं (सूचकांक में नहीं जोड़ा गया है)। विकल्प इंडेक्स फ़ाइल है और न ही सभी पर काम कर पेड़ को छूने नहीं (लेकिन सिर रीसेट करता है , जैसे सभी साधनों करते हैं)।
--soft<commit>


Git 2.23+ के साथ , नया कमांडgit switch एक लाइन में शाखा बनाएगा (एक ही तरह का reset --hard, इसलिए इसके प्रभाव से सावधान रहें):

git switch -f -c topic/wip HEAD~3

6
यह शायद यह भी ध्यान देने योग्य है कि यह एक अच्छा विचार नहीं होगा यदि आपने अपने मास्टर ब्रांच में उस विषय सामग्री को रिपॉजिटरी में रखा है जिसे अन्य वेबसाइट से खींचते हैं। या कम से कम, यदि आपको एक रीसेट करने की आवश्यकता है, तो आपको लोगों को यह बताने की आवश्यकता होगी कि आप ऐसा क्या कर रहे हैं ताकि उनके अगले पुल से चेतावनी बहुत अधिक झटका न हो।
एंड्रयू वॉकर

38
भविष्य के पाठकों पर ध्यान दें: नीचे से ऊपर तक पढ़ें (या पूरी बात पढ़ना सुनिश्चित करें)। git reset --hardआपके बदलावों को बनाएगा, और यदि वे अभी तक प्रतिबद्ध नहीं हैं तो वे अप्राप्य हैं! आपको बस आवश्यकता हो सकती हैgit checkout -b …
कॉनरेड मेयर

3
@ConradMeyer अच्छा बिंदु। मैंने उत्तर को संपादित किया है और git checkout -bपहला डाल दिया है ।
वॉनसी

5
विषय / शाखा क्यों ?? सिर्फ ब्रांचनाम ही क्यों नहीं, क्या इस नामकरण का कोई विशेष कारण है? बस सोच रहा।
सैम स्टोलिंगा

1
@ यह सिर्फ एक नामकरण नामकरण सम्मेलन है (आसानी से शाखाओं को वर्गीकृत करने का एक तरीका, नाम स्थान को परिभाषित करने के लिए पदानुक्रमित शाखा नामों का उपयोग करके ): stackoverflow.com/a/2527436/6309 । उदाहरण के लिए, मुद्दों के लिए: randyfay.com/content/… । आपको अपनी शाखाओं को नामांकित करते समय एक पदानुक्रम का उपयोग करने की आवश्यकता नहीं है। topic_wipकाम भी करेगा;)
वॉनज

269

जैसे कि इस प्रश्न में कहा गया है: Git: मास्टर पर अनस्टैग / अनकमेटेड बदलावों से एक शाखा बनाएँ : स्टैश आवश्यक नहीं है।

महज प्रयोग करें:

git checkout -b topic/newbranch

नई शाखा के साथ कोई भी काम नहीं किया जाएगा।

यदि आप धक्का देने की कोशिश करते हैं तो आपको निम्न संदेश मिलेगा

घातक: वर्तमान शाखा सुविधा / NEWBRANCH की कोई अपस्ट्रीम शाखा नहीं है। वर्तमान शाखा को पुश करने के लिए और रिमोट को अपस्ट्रीम के रूप में सेट करें, उपयोग करें

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

बस के रूप में दूर से शाखा बनाने का सुझाव दिया:

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


3
आपको नई शाखा को धक्का देने पर ही 'नो अपस्ट्रीम ब्रांच' की त्रुटि मिलेगी, न कि जब आप नया काम करते हैं।
सैम

2
@ ससम ने मेरे अनुसार उत्तर में संशोधन किया है
निक केनेडी

73

इन कदमों का अनुसरण करें:

  1. एक नई शाखा बनाएँ:

    git branch newfeature
    
  2. चेकआउट नई शाखा: (यह आपके काम को रीसेट नहीं करेगा।)

    git checkout newfeature
    
  3. अब इस नई शाखा पर अपना काम करें:

    git commit -s
    

उपरोक्त चरणों का उपयोग करने से आपकी मूल शाखा साफ रहेगी और आपको कोई भी 'रीसेट रीसेट - हार्ड' नहीं करना होगा।


3
चरण 3 में '-s' क्या करता है?
स्कॉट बिग्स

12
@ScottBiggs यह अनावश्यक है, लेकिन कुछ लोगों द्वारा पालन एक अभ्यास है। यह "--signoff" के लिए छोटा है और भविष्य के लोगों के लिए अपने उपयोगकर्ता नाम को लॉग में देखते हुए यह जानने के लिए जोड़ता है कि आपने इस प्रतिबद्ध की निंदा की है।
फ्रैंक ब्रायस

5
अच्छा जवाब, लेकिन -sचरण 3 में कोई ज़रूरत नहीं है
मोहम्मद अली

मैंने टिप्पणी से कुछ नया सीखा, धन्यवाद @FrankBryce
Kasparov92

30

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

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list

9
या के रूप में VonC ने बताया कि 'git checkout -b newbranch' और 'stash स्किप करें'
willcodejavaforfood

@will: मैं सोच रहा था कि एक नई शाखा बनाने से आपके द्वारा किए गए किसी भी अपरिवर्तित परिवर्तन को अधिलेखित कर दिया जाएगा, लेकिन अगर यह मामला नहीं है, तो हाँ आप स्लैश को छोड़ सकते हैं।
ईथर

1
मैंने इसे आज़माया और यह ठीक काम किया, git बहुत विचारशील है और किसी भी स्थानीय परिवर्तन को अधिलेखित नहीं
करेगा

2
मुझे लगता है कि यह एक टाइपो था, लेकिन सिर्फ एक हेड अप जो git stash pushएक कमांड नहीं है। आप संभवतः उपयोग करना चाहते हैं git stashया git stash save। यदि आप स्‍टेश में अनट्रैक की गई फ़ाइलों को शामिल करना चाहते हैं, तो --include-untrackedविकल्‍प का उपयोग करें । इसी तरह, यदि आप स्टैक्ड में अनट्रैक और उपेक्षित दोनों फ़ाइलों को शामिल करना चाहते हैं, तो --addइसके बजाय विकल्प का उपयोग करें ।
छह

यदि आपने पहले ही शाखा बना ली है, तो यह मददगार है।
निश्चित रूप से

13

एक नई शाखा में नए परिवर्तन जोड़ने और दूरस्थ करने के लिए धक्का:

git branch branch/name
git checkout branch/name
git push origin branch/name

अक्सर बार मैं पुश करने के लिए मूल भाग को जोड़ना भूल जाता हूं और भ्रमित हो जाता हूं कि मैं नई शाखा / बिटबकेट में क्यों नहीं देख रहा हूं

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