एक कांटा साफ करें और इसे ऊपर की तरफ से फिर से शुरू करें


395

मैंने एक रिपॉजिटरी को कांटा है, फिर मैंने कुछ बदलाव किए और ऐसा लग रहा है कि मैंने सब कुछ गड़बड़ कर दिया है।

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


4
एक सरल प्रश्न के बहुत जटिल उत्तर। बस सब कुछ हटा दें और रिपॉजिटरी को फिर से क्लोन करें।
याजा

1
@ याजा, नहीं, इससे आपको कुछ परिदृश्यों में और भी परेशानी हो सकती है।
शिम्मी वेइटहैंडलर

@ शमी, यदि आप फिर से शुरू करना चाहते हैं तो जैसे ओपी ने पूछा।
यजा

जवाबों:


795

सबसे सरल उपाय होगा ( upstreamमूल रेपो का उल्लेख करते हुए दूरस्थ नाम के रूप में ' ' का उपयोग करना ):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(यह करने के लिए इसी तरह के GitHub पेज, अनुभाग "मुझे क्या करना चाहिए अगर मैं एक बुरी स्थिति में हूँ?" )

ध्यान रखें कि आप masterशाखा में किए गए परिवर्तनों को खो सकते हैं (दोनों स्थानीय रूप से reset --hard, और दूरस्थ पक्ष पर, क्योंकि push --force)।

एक विकल्प यह होगा कि, यदि आप अपने कमिट्स को संरक्षित करना चाहते हैं, तो masterउन कमेंट्स को फिर से चालू करने के लिए upstream/master
रीसेट भाग को a से बदलें git rebase upstream/master। फिर आपको जोर लगाने की आवश्यकता होगी।
यह भी देखें कि " अगर मैं खराब स्थिति में हूं तो मुझे क्या करना चाहिए? "


एक और पूर्ण समाधान, अपने वर्तमान काम का समर्थन (बस मामले में) " क्लीनअप गिट मास्टर शाखा में विस्तृत है और कुछ प्रतिबद्ध को नई शाखा में स्थानांतरित करें "।

मूल "GitHub रिपॉजिटरी से फोर्किट GitHub रिपॉजिटरी में नए अपडेट को देखें" जो कि " upstream" चित्रण के लिए है।

नदी के ऊपर


नोट: हाल ही में GitHub repos के खिलाफ शाखा की रक्षा करते हैंmasterpush --force
इसलिए आपको masterपहले अन-प्रोटेक्ट करना होगा (नीचे दी गई तस्वीर देखें), और फिर जोर लगाने के बाद इसे फिर से सुरक्षित करें

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


ध्यान दें: विशेष रूप से GitHub पर, अब (फरवरी 2019) पुल अप के लिए forked repos को हटाने के लिए एक शॉर्टकट है जो अपस्ट्रीम में विलय कर दिया गया है।


4
नमस्ते, यह बहुत अच्छा काम किया! btw सही रीसेट सिंटैक्स हैgit reset --hard upstream/master
tampe125

1
@ tampe125 उत्कृष्ट। मैंने git resetजवाब में वाक्य रचना तय की है ।
वॉनसी

घातक: 'अपस्ट्रीम' में एक
जीन्स

@Benubird जो रिमोट रेपो का मूल रेपो (जिसे आपने कांटा था) का नाम है: stackoverflow.com/a/3903835/6309git remote में ग्राफ और " " कमांड देखें ।
VonC

सही है, लेकिन यह आपके प्रश्न से स्पष्ट नहीं है कि इसे कैसे सेट किया जाए, क्योंकि डिफ़ॉल्ट रूप से 'अपस्ट्रीम' कमांड लाइन में परिभाषित नहीं है क्योंकि मैंने गिटब के माध्यम से कांटा था।
बेनुबर्ड

31

लव वॉनसी का जवाब। यहां शुरुआती लोगों के लिए इसका एक आसान संस्करण है।

एक git रिमोट कहा जाता है originजिसके बारे में मुझे यकीन है कि आप सभी इससे अवगत हैं। असल में, आप जितने चाहें जितने रेपो रेमो में जोड़ सकते हैं। इसलिए, हम जो कर सकते हैं वह एक नया रिमोट है जो मूल रेपो है जो कांटा नहीं है। मुझे इसे कॉल करना पसंद हैoriginal

चलो रिमोट के रूप में हमारे कांटे में मूल रेपो जोड़ते हैं।

git remote add original https://git-repo/original/original.git

अब यह सुनिश्चित करने के लिए कि हम नवीनतम कोडित हैं, मूल रेपो लाते हैं

git fetch original

जैसा कि, VonC ने सुझाव दिया, सुनिश्चित करें कि हम मास्टर पर हैं।

git checkout master

मूल रेपो पर नवीनतम कोड के साथ हमारे कांटे को गति देने के लिए, हमें मूल रिमोट के अनुसार अपनी मास्टर शाखा को रीसेट करना होगा।

git reset --hard original/master

और आप कर रहे हैं :)


2
मैं fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.अंतिम चरण पर पहुंच रहा हूं । कोई सलाह?
टॉमनरवे

ऐसा प्रतीत होता है कि यह सिर्फ आपको मूल दूरस्थ शाखा पर स्टॉक छोड़ देता है। मुझे लगता है कि यह आपके कांटे को वापस सही रिमोट पर रीसेट करने के लिए एक कदम याद आ रहा है?
रे सुलेजर

1
originalसे बेहतर है upstream(जो Github डॉक्स का उपयोग करता है), जैसा origin/masterकि स्थानीय का "अपस्ट्रीम" है master। अस्पष्टता को कम करता है। मुझे आश्चर्य है कि अगर यही कारण है कि आप इसका उपयोग करते हैं?
विघ्न

1
यही कारण है कि मैं इसका इस्तेमाल करता हूं!
अहमद आवा

2
मैंने इन निर्देशों का पालन किया और अब गिट की स्थिति कहती है: शाखा मास्टर पर आपकी शाखा और 'मूल / मास्टर' ने विचलन किया है, और क्रमशः 52 और 5 अलग-अलग तरीके हैं। (दूरस्थ शाखा को आप में मिलाने के लिए "गिट पुल" का उपयोग करें) - लेकिन मैं अपने 5 कमिट्स को छोड़ना चाहता हूं। अगला कदम क्या है?
user3562927

6

@VonC महान जवाब के बाद। आपकी GitHub कंपनी नीति मास्टर पर 'बल धक्का' की अनुमति नहीं दे सकती है।

remote: error: GH003: Sorry, force-pushing to master is not allowed.

यदि आपको इस तरह एक त्रुटि संदेश मिलता है, तो कृपया निम्न चरणों का प्रयास करें।

अपने कांटे को प्रभावी ढंग से रीसेट करने के लिए आपको इन चरणों का पालन करना होगा:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

"सेटिंग्स -> शाखाओं -> डिफ़ॉल्ट शाखा" में अपना कांटा गीथहब पर खोलें, नई डिफ़ॉल्ट शाखा के रूप में 'new_master' चुनें। अब आप 'मास्टर' शाखा पर जोर डाल सकते हैं:

git checkout master
git push --force origin

फिर आपको 'मास्टर' को GitHub सेटिंग्स में डिफ़ॉल्ट शाखा के रूप में सेट करना होगा। 'Tmp_master' को हटाने के लिए:

git push origin --delete tmp_master
git branch -D tmp_master

आपके परिवर्तन को नुकसान पहुंचाने के बारे में चेतावनी देने वाले अन्य उत्तर अभी भी लागू होते हैं, कैरीफुल हो।


4

Sourcetree GUI के माध्यम से इसे 100% कैसे करें

(Git कमांड लाइन इंटरफ़ेस के माध्यम से हर कोई चीजों को करना पसंद नहीं करता है)

एक बार यह स्थापित हो जाने के बाद, आपको केवल तब से 7-13 कदम करने की आवश्यकता है।

प्राप्त करें> चेकआउट मास्टर शाखा> अपने मास्टर पर रीसेट करें> सर्वर में परिवर्तन पुश करें

कदम

  1. स्क्रीन के शीर्ष पर मेनू टूलबार में: "रिपॉजिटरी"> "रिपॉजिटरी सेटिंग्स"

शीर्ष मेनू बार में "रिपॉजिटरी" पर प्रकाश डाला गया

  1. "जोड़ें"

"संवाद के निचले भाग में" बटन जोड़ें

  1. GitHub पर वापस जाएं और क्लोन URL को कॉपी करें।

Gitub वेबसाइट पर "क्लोन या डाउनलोड" बटन के बाद git url आता है

  1. Url को "URL / Path" फ़ील्ड में पेस्ट करें फिर इसे एक ऐसा नाम दें जो समझ में आए। मैंने इसे "मास्टर" कहा। "डिफ़ॉल्ट रिमोट" चेकबॉक्स की जांच न करें । आप इस भंडार को सीधे धक्का नहीं दे पाएंगे।

"दूरस्थ नाम" और "URL / पथ" फ़ील्ड "दूरस्थ विवरण" संवाद में प्रकाश डाला

  1. "ओके" दबाएं और आपको यह देखना चाहिए कि यह अब आपकी रिपॉजिटरी की सूची में दिखाई देगा।

"मास्टर" रिपॉजिटरी ने "रिपॉजिटरी सेटिंग्स" डायलॉग में रिपॉजिटरी की सूची में जोड़ा

  1. फिर से "ओके" दबाएं और आपको यह देखना चाहिए कि यह आपकी "रिमूव" की सूची में है।

"मास्टर" रिपॉजिटरी ने साइड बार में रिमोट की सूची में हाइलाइट किया

  1. "Fetch" बटन पर क्लिक करें (स्रोत ट्री हेडर क्षेत्र के ऊपरी बाएं)

हेडर क्षेत्र में "Fetch" बटन

  1. सुनिश्चित करें कि "सभी रीमेक से प्राप्त करें" चेकबॉक्स चेक किया गया है और "ओके" दबाएं

"सभी रीमेक से प्राप्त करें" चेकबॉक्स को "फ़ेच" संवाद में हाइलाइट किया गया है

  1. यदि यह पहले से ही चेक आउट नहीं है, तो इसे जांचने के लिए अपनी "मास्टर" शाखा पर डबल क्लिक करें।

  2. उस कमिटमेंट को खोजें जिसे आप रीसेट करना चाहते हैं, यदि आप रेपो "मास्टर" कहते हैं, तो आप संभवतः उस पर "मास्टर / मास्टर" टैग के साथ कमिट ढूंढना चाहेंगे।

उस पर "मास्टर / मास्टर" टैग के साथ एक प्रतिबद्ध का उदाहरण

  1. कमिट> "इस कमिट के लिए करंट ब्रांच को रीसेट करें" पर राइट क्लिक करें।

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

"मोड का उपयोग करना" संवाद "रीसेट टू कमेट" संवाद पर प्रकाश डाला गया।  यह "सभी कार्य प्रतिलिपि परिवर्तनों को त्यागने" के लिए सेट है

  1. रेपो की अपनी प्रतिलिपि में परिवर्तन अपलोड करने के लिए "पुश" बटन (स्रोत ट्री हेडर क्षेत्र के ऊपरी बाएं) पर क्लिक करें।

हेडर क्षेत्र में "पुश" बटन

आप का काम समाप्त!

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