पूरी तरह से Git में दूरस्थ शाखा के साथ स्थानीय शाखा को कैसे बदलें?


777

मेरी दो शाखाएँ हैं:

  1. स्थानीय शाखा (मैं जिसके साथ काम करता हूं)
  2. दूरस्थ शाखा (सार्वजनिक, केवल अच्छी तरह से परीक्षण किए गए आवागमन वहां जाते हैं)

हाल ही में मैंने अपनी स्थानीय शाखा को गंभीर रूप से गड़बड़ कर दिया।

मैं स्थानीय शाखा को पूरी तरह से दूरस्थ एक के साथ कैसे बदलूंगा, इसलिए मैं अपना काम जारी रख सकता हूं जहां से दूरस्थ शाखा अब है?

मैंने पहले ही एसओ को खोज लिया है और दूरस्थ शाखा को स्थानीय स्तर पर जांचने से कोई प्रभाव नहीं पड़ता है।


1
मुझे पता है कि स्वीकृत उत्तर में 1280 वोट हैं, लेकिन आपको वास्तव में @TTT द्वारा स्वीकार किए गए उत्तर को बदलने पर विचार करना चाहिए।
जेमी

जवाबों:


1286
  1. सुनिश्चित करें कि आपने अपनी शाखा की जाँच की है (ज़ोल्टन की टिप्पणी से )।
  2. मान लें कि आपके द्वारा प्रतिस्थापित की जाने वाली स्थानीय शाखा है, और वह "मूल / मास्टर" वह दूरस्थ शाखा है जिसे आप रीसेट करना चाहते हैं:

    git reset --hard origin/master
    

यह आपकी स्थानीय HEAD शाखा को मूल / मास्टर के समान संशोधन करने के लिए अद्यतन करता है, और --hardइस परिवर्तन को अनुक्रमणिका और कार्यक्षेत्र में भी सिंक करेगा।


4
आपके सुझाव के लिए धन्यवाद, मैं पहले से ही 'डर' का उपयोग कर रहा हूँ - भार और - प्रवर्तन पहले से ही है, इसलिए मैंने केवल समाधान निकाला जो उन का उपयोग नहीं करता है।
यमसत

13
@KonstantinLevin: आह हाँ, उन विकल्पों के नामकरण बल्कि परेशान है। git resetडिफ़ॉल्ट रूप से आपकी वर्तमान शाखा को फिर से परिभाषित करेगा और सूचकांक को सिंक करेगा। --softइंडेक्स को अपडेट करना छोड़ देगा, --hardकार्यक्षेत्र को सिंक भी करेगा। मेरा अपना अनुभव --hardज्यादातर समय का उपयोग कर रहा है, सिवाय जब मैं अंतिम प्रतिबद्ध को पूर्ववत करना चाहता हूं (जो कि बस है git reset HEAD^)
araqnid

9
Git के साथ अधिक अनुभव होने के बाद मुझे विश्वास है कि यह एक बेहतर समाधान है, धन्यवाद।
यमसत

24
शायद आपको पहले लाना होगा:git fetch origin remote_branch
b1r3k

53
आपको ध्यान देना चाहिए कि यह मास्टर की सामग्री के साथ वर्तमान में जो भी आपकी शाखा को प्रतिस्थापित करेगा । इसलिए यदि आप उदाहरण के लिए एक सुविधा-शाखा पर हैं, तो यह इसके सभी कमिट को बदल देगा , इसलिए सुनिश्चित करें कि आपने पहले जिस ब्रांच की जगह ले ली है, उसकी जाँच कर लें। master
जोल्तान

218

यह तीन चरणों जितना आसान है:

  1. अपनी स्थानीय शाखा हटाएं: git branch -d local_branch
  2. नवीनतम दूरस्थ शाखा लाएँ: git fetch origin remote_branch
  3. रिमोट के आधार पर स्थानीय शाखा का पुनर्निर्माण करें: git checkout -b local_branch origin/remote_branch

7
दरअसल @araqnid ने जो कहा वह सही और अधिक संक्षिप्त है। मैंने इसका परीक्षण किया है और आप इसे भी आजमा सकते हैं।
12

वाह, git checkout -b local_branch मूल / Remote_branch महान है! मैंने हमेशा दो अलग-अलग आदेशों में ऐसा किया। धन्यवाद!
केंडेपेलिन

11
git branch -D local_branchयदि आपकी शाखा विलय नहीं हुई है तो आपको पहले चरण में करने की आवश्यकता हो सकती है ।
szeryf

धन्यवाद, मेरे पास एक कठिन समय था जब gitflow का उपयोग करते हुए, एक शाखा को प्रकाशित करने और फिर इसे खत्म करने के बाद, मैं हटाए गए शाखा में जाना चाहता था, और आपका समाधान केवल एक ही था जो काम करता था, खींचने से काम नहीं लगता .. इसे अच्छी तरह से इस्तेमाल नहीं किया है -
Decebal

2
हमें यह सुनिश्चित करना चाहिए कि वर्तमान शाखा वह नहीं है जिसे हटाया जाना है।
a_secenthyer

43
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>

--ट्रैक पार्ट क्या करता है?
eonist

3
@GitSync, यह वही git help branchहै जिसके बारे में कहते हैं --trackWhen creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out. मैंने जवाब में यह आदेश तय किया। बात बढ़ाने के लिए धन्यवाद।
सैलेश

तो आम शब्दों में: यह नई शाखा में दूरस्थ URL जोड़ता है। इसलिए वे हमेशा के लिए सिंक में हैं। इतनी बात करने के लिए।
इयोनिस्ट

2
आप कह सकते हैं कि यह सिर्फ सुविधा के लिए है। यदि आप करते हैं git status, तो यह रिपोर्ट करेगा कि क्या आपकी स्थानीय शाखा दूरस्थ शाखा से आगे या पीछे है यदि आपने उन्हें संबद्ध किया है। इसके अतिरिक्त, यदि आप पहले से ही अपनी शाखा को ट्रैक करने के लिए सेट कर चुके हैं, तो आप पूर्ण के बजाय git pull(या push) कर सकते हैं । git pull <remote> <branch><remote/branch>
सैलेश

22

रिमोट शाखा के साथ सब कुछ बदलें; लेकिन , केवल उसी प्रतिबद्ध से आपकी स्थानीय शाखा चालू है:

git reset --hard origin/some-branch

या , दूरस्थ शाखा से नवीनतम प्राप्त करें और सब कुछ बदलें:

git fetch origin some-branch
git reset --hard FETCH_HEAD

एक तरफ के रूप में, यदि आवश्यक हो, तो आप अनकही फ़ाइलों और निर्देशिकाओं को मिटा सकते हैं जिन्हें आपने अभी तक प्रतिबद्ध नहीं किया है:

git clean -fd

git cleanआदेश मेरे लिए ऐसा किया। git reset hard origin/masterअनकही फ़ाइलों को मिटा नहीं है। धन्यवाद!
सुबह 10'19

9

दूरस्थ के साथ वर्तमान स्थानीय शाखा को बदलने का सबसे सुरक्षित और सबसे पूर्ण तरीका:

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

stashलाइन परिवर्तन है कि आप के लिए प्रतिबद्ध नहीं है बचाता है। branchलाइन एक अलग नाम करने के लिए अपने शाखा चलता है, मूल नाम फ्री हो गया। fetchलाइन रिमोट की नवीनतम प्रति प्राप्त करता है। checkoutलाइन एक ट्रैकिंग शाखा के रूप में मूल शाखा का पुनर्निर्माण करने वाला।

या बैश फ़ंक्शन के रूप में:

replaceWithRemote() {
    yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}
    git stash
    git merge --abort
    git rebase --abort
    git branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`
    git fetch origin ${yourBranch}:${yourBranch}
    git checkout ${yourBranch}
}

जो मौजूदा शाखा का नाम बदलकर बदल दिया गया है जैसे कि__________08_25 पर लागू करें।


git stash popउस वर्कफ़्लो में शामिल करना चाहते हैं । यदि आप अपनी स्टैक्ड फ़ाइलों को फिर से लागू करना चाहते हैं।
eonist

आप स्टैक्ड ब्रांच के साथ क्या करते हैं? मुझे डर है कि भविष्य में लंबे समय के बाद कहीं यह फिर से पॉप हो जाएगा कि मैं क्या भूल गया था।
स्कॉट बिग्स

1
@ScottBiggs यदि आप स्टैक्ड ब्रांच को हटाना चाहते हैं, तो "git stash clear" का उपयोग करें।
मार्क ए डरहम

4

मुझे आश्चर्य है कि किसी ने अभी तक इसका उल्लेख नहीं किया है; मैं इसे लगभग हर दिन उपयोग करता हूं:

git reset --hard @{u}

मूल रूप से, @{u}अपस्ट्रीम शाखा के लिए सिर्फ शॉर्टहैंड है कि आपकी वर्तमान शाखा ट्रैकिंग कर रही है। उदाहरण के लिए, यह आम तौर पर समान है origin/[my-current-branch-name]। यह अच्छा है क्योंकि यह शाखा अज्ञेय है।

git fetchदूरस्थ शाखा की नवीनतम प्रति प्राप्त करने के लिए पहले सुनिश्चित करें ।


1
यह वास्तव में अच्छा लग रहा है, मैं रीसेट करने के लिए शाखा के नाम को कॉपी करने और चिपकाने से थक गया!
पेड्रोक्ट92

1
मेरे पास कुछ उदाहरण हैं जहां मैंने पुराने प्रश्नों के उत्तर जोड़े हैं, और मेरे उत्तरों ने लीडरबोर्ड पर अपना काम किया है। मुझे उम्मीद है कि यह एक करता है।
जेमी

3

यह बेहतर ज्ञान परिप्रेक्ष्य फैलाने के लिए इस उत्तर को संपादित करने के लिए कई तरीकों से किया जा सकता है।

1) हार्ड रीसेट करें

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

git reset --hard origin/develop

2) वर्तमान शाखा को हटा दें, और दूरस्थ रिपॉजिटरी से फिर से चेकआउट करें

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

git branch -D develop
git checkout -b develop origin/develop

3) एबोर्ट मर्ज

यदि आप एक बुरे मर्ज के बीच में हैं (गलती से गलत शाखा के साथ), और नीचे के रूप में नवीनतम शाखा में वापस जाने के लिए मर्ज से बचना चाहते थे:

git merge --abort

4) एबॉर्ट रिबेस

यदि आप एक बुरे रिबास के बीच में हैं, तो आप रिबास के अनुरोध को निम्नानुसार निरस्त कर सकते हैं:

git rebase --abort

2

आप @Hauro के @Laurent के रूप में कह सकते हैं, या आप उन कमियों को दूर करने के git rebaseलिए उपयोग कर सकते हैं जिनसे आप छुटकारा चाहते हैं, यदि आप जानते हैं कि कौन से हैं। मैं git rebase -i head~Nइस तरह के संचालन के लिए (जहां एन एक संख्या है, आपको अंतिम एन कमिट्स में हेरफेर करने की अनुमति देता है) का उपयोग करने की प्रवृत्ति है ।


वास्तव में यह 'git rebase' कमांड था जिसने पूरी चीज़ को गड़बड़ कर दिया था, फिर कुछ मजबूर विलय और हार्ड रीसेट .. वैसे भी, जो मैं देख रहा था वह बिना विलय के दूरस्थ सर्वर से पूरे रेपो को खींचने का कुछ आसान तरीका है।
यमसत

2

चयनित जवाब बिल्कुल सही है , लेकिन यह मुझे नवीनतम के साथ नहीं छोड़ा था प्रतिबद्ध / धक्का ...

तो मेरे लिए:

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

चूँकि मुझे पता है कि मैं अपनी अपस्ट्रीम शाखा को कुछ हफ्तों के लिए अस्थायी रूप से एक विशिष्ट शाखा में स्थापित करना चाहता हूं (उसी के रूप में जिसे मैंने पहले स्विच / चेक आउट किया था और एक हार्ड रीसेट किया था)

इसलिए AF रीसेट करें

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 

1

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

git fetch -f origin rbranch:lbranch

0

जैसा कि चुने गए स्पष्टीकरण में प्रदान किया गया है, गिट रीसेट अच्छा है। लेकिन आजकल हम अक्सर उप-मॉड्यूल का उपयोग करते हैं: रिपॉजिटरी के अंदर रिपॉजिटरी। उदाहरण के लिए, यदि आप अपने प्रोजेक्ट में ZF3 और jQuery का उपयोग करते हैं, तो आप संभवतः उन्हें उनके मूल रिपॉजिटरी से क्लोन करना चाहते हैं। ऐसे मामले में git रीसेट पर्याप्त नहीं है। हमें उस सटीक संस्करण में सबमॉड्यूल्स को अपडेट करने की आवश्यकता है जो हमारे रिपॉजिटरी में परिभाषित हैं:

git checkout master
git fetch origin master
git reset --hard origin/master
git pull

git submodule foreach git submodule update

git status

यह वैसा ही है जैसा कि आप (cd) प्रत्येक उप-मॉड्यूल की कार्यशील निर्देशिका में पुनरावृत्ति करेंगे और चलेंगे:

git submodule update

और यह बहुत अलग है

git checkout master
git pull

क्योंकि उप-मॉड्यूल शाखा के लिए नहीं, बल्कि वचनबद्धता की ओर इशारा करते हैं।

उस स्थिति में जब आप मैन्युअल रूप से 1 या अधिक सबमॉड्यूल के लिए कुछ शाखा की जांच करते हैं जो आप चला सकते हैं

git submodule foreach git pull

कृपया स्पष्टीकरण प्रदान करें, खासकर जब यह पुराने प्रश्नों का उत्तर दे रहा हो। आपका उत्तर सहायक नहीं है।
एरिक

स्वीकृत उत्तर पहले से ही प्रस्तावित है git reset --hard। यह बहुत कम मूल्य जोड़ता है।
florisla

0
git reset --hard
git clean -fd

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


-6

बदसूरत लेकिन सरल तरीका: अपने स्थानीय फ़ोल्डर को हटा दें, और रिमोट रिपॉजिटरी को फिर से क्लोन करें।


10
या बस शाखा को हटा दें और इसे फिर से जांचें।
लॉरेंट

हाँ, मुझे लगता है कि मैं क्या करने जा रहा हूँ अगर मुझे नहीं लगता कि मैं इसे कम 'बदसूरत' तरीके से कैसे करूं
YemSalat

2
बदसूरत कभी-कभी जानने के लिए उपयोगी है। मैं चाहता हूं कि लोग सिर्फ इसलिए चीजों को कम न करें क्योंकि वे पारंपरिक तरीके नहीं हैं: डाउनवोटिंग के लिए अधिक तर्कसंगत कारण होना चाहिए ... और इसे दिया जाना चाहिए। गिट एक ऐसी चीज है जो परिणाम प्राप्त करती है। यह किसी प्रकार का पवित्र पाठ नहीं है।
माइक कृंतक

3
मुझे समझ नहीं आ रहा है :-( हाँ, यह अशुभ है, आदि, लेकिन यह कुछ मामलों में सबसे अच्छा काम कर सकता है ... क्षमा करें @Hugo
silverdr

@ ह्यूगो, सहमत। कुछ रहस्यमय और बदबूदार मेरी स्थानीय विकास शाखा के लिए हुआ, और टीम लीड और इंजीनियरिंग प्रबंधक दोनों ने सुझाव दिया, और अधिक सुरुचिपूर्ण समाधानों के बीच, सिर्फ (ज़िप, कॉपी, और मेरे फीचर काम को बचाने के लिए), स्थानीय रेपो और पुनः वर्णन करें।
अमिताभ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.