दूरस्थ शाखा से कुछ कमियों को स्थायी रूप से कैसे हटाया जाए


489

मुझे पता है कि यह इतिहास का पुनर्लेखन है जो बुरा यदा है।

लेकिन रिमोट ब्रांच से कुछ कमिट्स को स्थायी रूप से कैसे हटाया जाए?


96
हाँ, यह वास्तव में बुरा यादा बुरा है, लेकिन किसी कारण से मुझे इसे पसंदीदा बनाने की आवश्यकता है।
जेम्स मोरिस

44
मुझे पता है कि यह बेवकूफी है, लेकिन कभी-कभी ऐसा होता है - जैसे लॉगइन का परीक्षण करना और अपने कोड में सादे टेक्स्ट पासवर्ड का उपयोग करना, जो वास्तविक लॉगिन क्रेडेंशियल हैं। और ओह ...
frhd

6
असली लॉगिन क्रेडेंशियल .. हाँ मुझे कुछ व्हूप्स की याद दिलाता है
हेलो यूनिवर्स


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

जवाबों:


368

आप git reset --hardअपनी स्थानीय शाखा को काम करने वाले पेड़ और सूचकांक से परिवर्तन को हटाने के लिए, और आप git push --forceअपनी संशोधित स्थानीय शाखा को रिमोट से। ( यहां अन्य समाधान , जिसमें दूरस्थ शाखा को हटाना शामिल है, और इसे फिर से धकेलना)

यह एसओ उत्तर इस तरह के आदेश के खतरे को दिखाता है, खासकर अगर लोग अपने स्वयं के स्थानीय प्रतिनिधि के लिए दूरस्थ इतिहास पर निर्भर करते हैं।
आपको मैन पेज के UPSTREAM REBASE सेक्शन से लोगों को बाहर निकालने के लिए तैयार रहने की आवश्यकता हैgit rebase


Git 2.23 (अगस्त 2019, नौ साल बाद) के साथ, आप नई कमांड का उपयोग करेंगे git switch
वह है: ( हटाने के लिए कमिट की संख्या द्वारा)git switch -C mybranch origin/mybranch~n
n

यह एक इच्छा की तरह सूचकांक और काम कर रहे पेड़ को बहाल git reset --hardकरेगा।


अजीब। मुझे लगता है कि मैंने पहले ही कोशिश की। साथ में कुछ रिबासिंग - एक आकर्षण की तरह काम करता है। धन्यवाद।
अर्निस लैप्सा

7
@ अर्निस: परफेक्ट;) push --forceदूर
वॉनसी

मैं प्रयोग किया जाता बीएफजी रेपो-क्लीनर कुछ संवेदनशील डेटा, कि मुझे इस पर मूल फ़ाइल के साथ एक "अज्ञात" शाखा के साथ छोड़ दिया से छुटकारा पाने के लिए, पिछले करने के लिए reseting के बाद प्रतिबद्ध चाहता था और मूल करने के लिए जोर दे रहा मुश्किल, सब ठीक चला गया (:
Rodrirokr

ध्यान दें कि कमिट का URL अभी भी (कम से कम कुछ समय के लिए) जीवित है, इसलिए यदि किसी के पास कमिट का URL है (आपने इसे भगवान को दिया है तो क्यों जानते हैं), वे कोड का उपयोग करने में सक्षम होंगे।
मोश फ़ू

1
@MoshFeu सच: git gcहमेशा दूर की तरफ अक्सर पर्याप्त नहीं चलाया जाता है। उदाहरण के लिए GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
VonC

248

last_working_commit_idगैर-काम करने वाले वचन का पालन करते समय , बस इसका उपयोग करने पर ध्यान दें

git reset --hard <last_working_commit_id>

इसलिए हमें वह नहीं चाहिए commit_idजो हम नहीं चाहते हैं।

फिर निश्चित रूप से, हमें दूरस्थ शाखा में धकेलना चाहिए:

git push --force

10
बिल्कुल सही, सुरुचिपूर्ण, सरल उत्तर। मैं बस आखिरी स्टैब कमिट पर लौट आया, जिसकी मुझे रिमोट और स्थानीय रूप से आवश्यकता थी
lauWM

2
इससे मुझे अपने स्थानीय परिवर्तन भी खो देने पड़े। मुझे उम्मीद नहीं थी कि लेकिन रेपो काम करने के लिए अपने व्यक्तिगत पासवर्ड को कमिट करने से बेहतर है।
एयरवेवेज़

3
आप अपने स्थानीय परिवर्तन को git stash के साथ बचा सकते हैं .... कुछ चीजें बना सकते हैं .... और git stash pop (आपके स्थानीय परिवर्तन वापस आ गए हैं)
MonTea

इससे मुझे "रिमोट: एरर: नॉन-फास्ट-फॉरवर्ड रिफ्स / हेड्स / मास्टर (आपको पहले खींचना चाहिए)" के रूप में
त्रुटि मिलती है

@Airwavezx जो git reset --hardकरने वाला है।
ल्यूक

146

महत्वपूर्ण: सुनिश्चित करें कि आपने "git push -f" पर कौन सी शाखाएँ निर्दिष्ट की हैं या आप अनजाने में अन्य शाखाओं को संशोधित कर सकते हैं! [*]

इस ट्यूटोरियल में तीन विकल्प दिखाए गए हैं । लिंक टूटने की स्थिति में मैं यहाँ मुख्य कदम छोड़ दूँगा।

  1. पूरा कमिटमेंट वापस करो
  2. अंतिम प्रतिबद्ध हटाएं
  3. सूची से कमिट हटाएं

1 पूर्ण कमिट वापस करें

git revert dd61ab23

2 आखिरी कमिट डिलीट करें

git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>

या, यदि शाखा स्थानीय रूप से उपलब्ध है

git reset HEAD^ --hard
git push <<remote>> -f

जहां + dd61 ... आपका प्रतिबद्ध हैश और git x ^ के माता-पिता के रूप में x ^, और + के रूप में एक मजबूर गैर-फास्टवर्ड धक्का है।

3 सूची से कमिट हटाएं

git rebase -i dd61ab23^

यह खुलेगा और संपादक सभी कमिट्स की सूची दिखाएगा। जिसे आप हटाना चाहते हैं, उसे हटा दें। रेपो को समाप्त करें और रेपो को बल प्रदान करें।

git rebase --continue
git push <remote_repo> <remote_branch> -f

5
सुनिश्चित करें कि आप "git push <दूरदराज_repo> <Remote_branch> -f" पर कौन सी शाखाएँ निर्दिष्ट करते हैं या आप अनजाने में अन्य शाखाओं को संशोधित कर सकते हैं!
निगेल शेरिडन-स्मिथ

केवल चरण 1 और 2 ने ही काम किया और मूल प्रश्न का उत्तर दिया। (चरण 3 को न चलाएं)
साद बेनबोज़िद

ये विभिन्न परिदृश्यों के लिए विकल्प हैं, न कि कदम उठाने के लिए। मेरे मामले में, इंटरएक्टिव रिबेस (विकल्प 3) ने वही किया जो मैं देख रहा था।
स्टीव ब्लैकवेल

मुझे हालांकि चरण 3 करना था। आपको यह @Saad क्यों नहीं चलाना चाहिए? सौभाग्य से मेरा << रिमोट >> बस डिफ़ॉल्ट 'मूल' था और <रिमोट_ब्रंच> डिफ़ॉल्ट 'मास्टर'
बार्ट

30

यदि आप अंतिम 3कमिट उदाहरण के लिए हटाना चाहते हैं , तो अपने स्थानीय शाखा पर फ़ाइल सिस्टम (वर्किंग ट्री) और कमिट हिस्ट्री (इंडेक्स) से बदलाव को हटाने के लिए निम्न कमांड चलाएँ:

git reset --hard HEAD~3

फिर दूरस्थ शाखा को अपने इतिहास को फिर से लिखने के लिए मजबूर करने के लिए निम्नलिखित आदेश (अपनी स्थानीय मशीन पर) चलाएं:

git push --force

बधाई हो! सब कुछ कर दिया!

कुछ नोट:

आप रनिंग करके मनचाही कमिट आई डी प्राप्त कर सकते हैं

git log

तो फिर तुम जगह ले सकता है HEAD~Nके साथ <desired-commit-id>इस तरह:

git reset --hard <desired-commit-id>

यदि आप फ़ाइल सिस्टम पर परिवर्तन रखना चाहते हैं और केवल इंडेक्स (कमिट हिस्ट्री) को संशोधित करते हैं, तो --softध्वज का उपयोग करें git reset --soft HEAD~3। फिर आपके पास अपने नवीनतम परिवर्तनों की जांच करने और उनके सभी हिस्सों को रखने या छोड़ने का मौका है। बाद के मामले में रननिग के बाद git statusसे फाइलों को बदल दिया गया है <desired-commit-id>। यदि आप --hardविकल्प का उपयोग करते हैं , तो git statusआपको बताएंगे कि आपकी स्थानीय शाखा रिमोट के समान ही है। यदि आप उपयोग नहीं करते हैं --hardऔर न ही --soft, डिफ़ॉल्ट मोड का उपयोग किया जाता है --mixed। इस मोड में, git help resetकहते हैं:

इंडेक्स को रीसेट करता है, लेकिन काम करने वाले पेड़ को नहीं (यानी, बदली गई फाइलें संरक्षित हैं, लेकिन प्रतिबद्ध के लिए चिह्नित नहीं हैं) और रिपोर्ट करता है कि क्या अपडेट नहीं किया गया है।


10

यह बहुत कम हो सकता है लेकिन मुझे जो अच्छा लग रहा है वह 'परमाणु' विकल्प का अच्छा प्रदर्शन है। मूल रूप से कमांड का उपयोग करके filter-branchआप फ़ाइलों को हटा सकते हैं या बड़ी संख्या में फ़ाइलों को अपने पूरे गिट इतिहास में बदल सकते हैं।

यह यहाँ सबसे अच्छा समझाया गया है


9
बहुत देर नहीं हुई। इसी तरह की समस्याओं के साथ भटकने वालों के लिए उपयोगी हो सकता है :)
अर्निस लैप्सा

9

Pctroll के उत्तर से सरलीकरण, इसी तरह इस ब्लॉग पोस्ट पर आधारित ।

# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote

2
मेरे लिए काम करता है, धन्यवाद। और मैं दूरस्थ शाखा के इतिहास से स्थायी रूप से एक प्रतिबद्ध (जैसे। pwd) हटाना चाहता हूं, यह कैसे करते हैं?
मुस्कान

1
मेरे लिए भी काम करता है, लेकिन मेरे पास स्माइल्स की तुलना में एक ही सवाल है, मैं किसी को भी इतिहास में अपनी प्रतिबद्धता / श्रद्धा नहीं देखना चाहता .. मैं इसे कैसे निकालूं?
रॉबर्टो रोड्रिग्ज

4

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

अपनी स्थानीय गलत शाखा से:

git log

कमिट हैश की प्रतिलिपि बनाएँ जिसे आप चाहते थे कि शाखा लॉग गेट से बाहर हो और बाहर निकले

git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch

अब आपके पास एक नई शाखा है जिस तरह से आप चाहते हैं।

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

git checkout the_errant_branch
git log

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

git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied

अपने आप को शाबाशी दो.


बहुत आसान है और अगर आपके पास एक मृत-पैर वाली शाखा है तो कौन परवाह करता है? एक नई शाखा बनाओ और उसके साथ रहो!
एंड्रयू फॉक्स

यह वास्तव में उत्कृष्ट उत्तर है। मुझे खुशी है कि मैंने चेरी-पिकिंग कमिट्स, या रिमोट ब्रांच में हेरफेर करने के बजाय ऐसा किया।
मैग्निलेक्स

0
 git reset --soft commit_id
 git stash save "message"
 git reset --hard commit_id
 git stash apply stash stash@{0}
 git push --force
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.