Git में एक नई शाखा में मौजूदा, अप्राप्त कार्य को ले जाएं


3125

मैंने एक नई सुविधा पर कुछ काम शुरू किया और थोड़ा सा कोड करने के बाद, मैंने तय किया कि यह सुविधा अपनी शाखा पर होनी चाहिए।

मैं मौजूदा अप्रयुक्त परिवर्तनों को एक नई शाखा में कैसे स्थानांतरित करूं और अपना वर्तमान रीसेट करूं?

मैं नई सुविधा पर मौजूदा कार्य को संरक्षित करते हुए अपनी वर्तमान शाखा को रीसेट करना चाहता हूं।


वही दिलचस्प विषय stackoverflow.com/q/556923/269514 ?
गिल्बर्टो

जवाबों:


3640

निम्न का उपयोग करें:

git checkout -b <new-branch>

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

git add <files>

और अपनी नई शाखा के लिए प्रतिबद्ध :

git commit -m "<Brief description of this commit>"

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

आप अपनी मूल शाखा को रीसेट नहीं करते हैं , यह वैसे ही रहता है। अंतिम प्रतिबद्ध <old-branch>अभी भी वही होगा। इसलिए आप checkout -bऔर फिर प्रतिबद्ध।


अद्यतन 2020 / Git 2.23

Git 2.23 नए switchसबकुंड को कुछ भ्रमों को दूर करने के प्रयास में जोड़ता है जो कि ओवरलोड किए गए उपयोग checkout(स्विचिंग शाखाओं, फ़ाइलों को पुनर्स्थापित करना, HEAD को बंद करना आदि) से आता है।

Git के इस संस्करण से शुरू होकर, ऊपर के कमांड को इसके साथ बदलें:

git switch -c <new-branch>

व्यवहार समान है और अपरिवर्तित रहता है।


15
बस यह सुनिश्चित करने के लिए, मुझे अपनी मूल शाखा को रीसेट करने से पहले अपूर्ण सुविधा की आवश्यकता है? या फिर कम्‍पोजिट की गई फाइलों को बिना कमिट किए संरक्षित किया जाएगा?
डेन ओ'कॉर्प

192
FYI करें: वर्किंग डायरेक्टरी में बदलाव और इंडेक्स में होने वाले बदलाव ब्रांच से संबंधित नहीं हैं। git checkout -b <new branch>उन बदलावों को समाप्त किया जाएगा जहां परिवर्तन होगा।
याकूब नारबस्की

152
यदि आपके पास पहले से ही एक शाखा है और अपने परिवर्तनों को मौजूदा शाखा में ले जाना चाहते हैं, तो checkout stackoverflow.com/questions/556923/…
चिरंतन

14
यदि आप अपनी नई शाखा को दूरस्थ रिपॉजिटरी में
भेजना चाहते हैं

10
@ जेडडीएसएम: अनचाहे बदलाव किसी भी शाखा से संबंधित नहीं हैं। वे केवल कार्यशील निर्देशिका में रहते हैं git checkout ./ git reset --hardunrecoverably जाएगा हटाने उन्हें
Knittl

329

वैकल्पिक रूप से:

  1. अस्थायी परिवर्तन के लिए वर्तमान परिवर्तन सहेजें:

    $ git stash

  2. इस स्‍टैश के आधार पर एक नई शाखा बनाएँ, और नई शाखा पर जाएँ:

    $ git stash branch <new-branch> stash@{0}

युक्ति: स्‍टेश नाम लिखना कम करने के लिए टैब कुंजी का उपयोग करें।


51
यदि दूसरी शाखा पहले से मौजूद है, तो आप इसे चेकआउट के साथ बदल सकते हैं, फिर git stash apply
आर्कियोनिक डेस

6
मैं टिप "टिप: स्टैशन नाम टाइप करने को कम करने के लिए टैब कुंजी का उपयोग नहीं करता।" "" @ @ 0 "नाम नहीं है? मैं इसे सफलतापूर्वक नहीं चला सकता।
हर्बर्ट

7
यह स्वीकृत उत्तर stackoverflow.com/a/1394804/754997 से बेहतर क्यों है ?
क्रिस पेज

10
मुझे समझ नहीं आ रहा है कि यह बेहतर क्यों हैgit checkout -b <new branch name>
Noitidart

6
git add -Aचोरी करने से पहले आपको जरूरत नहीं है ।
विचले 13

48

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

  1. अपने वर्तमान इतिहास को एक नई शाखा में कॉपी करें, जिसमें कोई भी परिवर्तन नहीं किया गया है:

    git checkout -b <new-feature-branch>
    
  2. अब मूल "गड़बड़" शाखा को वापस रोल करने के लिए मजबूर करें: (इसे स्विच किए बिना)

    git branch -f <previous-branch> <earlier-commit-id>
    

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

    git branch -f master origin/master
    

    या अगर आपने 4 कमिट किए थे:

    git branch -f master HEAD~4
    

चेतावनी: उस शाखा के लिए ट्रैकिंग जानकारीgit branch -f master origin/master को रीसेट कर देगा। इसलिए यदि आपने अपनीmasterशाखा को कहीं और धक्का देने के लिएorigin/masterकॉन्फ़िगर किया है,तो वह कॉन्फ़िगरेशन खो जाएगा।

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


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

26

सामान्य परिदृश्य निम्न है: मैं नई सुविधा के लिए नई शाखा बनाना भूल गया था, और पुरानी सुविधा शाखा में सभी काम कर रहा था। मैंने मास्टर शाखा में सभी "पुराने" काम की सराहना की है, और मैं चाहता हूं कि मेरी नई शाखा "मास्टर" से बढ़े। मैंने अपने नए काम के लिए एक भी कमिट नहीं किया है। यहाँ शाखा संरचना है: "मास्टर" -> "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

18

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

git cherry-pick <commitID>

यहाँ वर्णित के रूप में आप चेरी-पिक के साथ कर सकते हैं , लेकिन यह आपके लिए उपयोग-मामला हो सकता है।


2
एक नई शाखा में आंशिक परिवर्तन करने के लिए अच्छे समाधान ... चूंकि आप अभी जो चाहते हैं वह कर सकते हैं, अन्य सभी परिवर्तनों को रोकें, जिस शाखा से आप शाखा लेना चाहते हैं, उसकी जांच करें, नई शाखा पर प्रतिबद्ध होने वाली चेरी-पिक वापस जाएं मूल शाखा के लिए, हार्ड एक प्रतिबद्ध वापस रीसेट करें, फिर एक स्लैश पॉप करें, जोड़ें, कमिट करें, और हललेलुजा गाएं।
मेरेडिथ

1
@ मेरेडिथ, हाहा, हां ऐसा ही कुछ। यह बहुत अच्छा है, जब तक आप अपने परिवर्तनों की योजना आगे नहीं बढ़ाते ... और वह कौन करता है?)
पासवर्ड

1

यह जीआईटी के लिए सभी उपकरणों का उपयोग करने के लिए सहायक हो सकता है

आदेश

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

 $ git checkout -b <new-branch>

TortoiseGIT

अपनी रिपॉजिटरी पर राइट-क्लिक करें और फिर TortoiseGit-> स्विच / चेकआउट का उपयोग करें

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

SourceTree

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

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


0

मैंने @Robin उत्तर और लिस्टिंग का उपयोग किया जो मैंने किया,

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! यदि रेपो में एक से अधिक स्लैश हैं, तो देखें कि कौन सी नई-शाखा में आवेदन करना है:

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

और द्वारा व्यक्तिगत छप का निरीक्षण करें,

git stash show stash@{1}

या एक बार में सभी बाधाओं का निरीक्षण करें:

git stash list -p

0

GitHub डेस्कटॉप के साथ ऐसा करने के लिए वास्तव में एक आसान तरीका है अब मुझे विश्वास नहीं होता कि पहले एक सुविधा थी।

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

GitHub डेस्कटॉप

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