मुझे पता है कि यह इतिहास का पुनर्लेखन है जो बुरा यदा है।
लेकिन रिमोट ब्रांच से कुछ कमिट्स को स्थायी रूप से कैसे हटाया जाए?
मुझे पता है कि यह इतिहास का पुनर्लेखन है जो बुरा यदा है।
लेकिन रिमोट ब्रांच से कुछ कमिट्स को स्थायी रूप से कैसे हटाया जाए?
जवाबों:
आप 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
करेगा।
push --force
दूर
git gc
हमेशा दूर की तरफ अक्सर पर्याप्त नहीं चलाया जाता है। उदाहरण के लिए GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
last_working_commit_id
गैर-काम करने वाले वचन का पालन करते समय , बस इसका उपयोग करने पर ध्यान दें
git reset --hard <last_working_commit_id>
इसलिए हमें वह नहीं चाहिए commit_id
जो हम नहीं चाहते हैं।
फिर निश्चित रूप से, हमें दूरस्थ शाखा में धकेलना चाहिए:
git push --force
git reset --hard
करने वाला है।
इस ट्यूटोरियल में तीन विकल्प दिखाए गए हैं । लिंक टूटने की स्थिति में मैं यहाँ मुख्य कदम छोड़ दूँगा।
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
यदि आप अंतिम 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
कहते हैं:
इंडेक्स को रीसेट करता है, लेकिन काम करने वाले पेड़ को नहीं (यानी, बदली गई फाइलें संरक्षित हैं, लेकिन प्रतिबद्ध के लिए चिह्नित नहीं हैं) और रिपोर्ट करता है कि क्या अपडेट नहीं किया गया है।
यह बहुत कम हो सकता है लेकिन मुझे जो अच्छा लग रहा है वह 'परमाणु' विकल्प का अच्छा प्रदर्शन है। मूल रूप से कमांड का उपयोग करके filter-branch
आप फ़ाइलों को हटा सकते हैं या बड़ी संख्या में फ़ाइलों को अपने पूरे गिट इतिहास में बदल सकते हैं।
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
कभी-कभी इस मुद्दे को ठीक करने का सबसे आसान तरीका उस जगह से एक नई शाखा बनाना है जहां आपको पता है कि कोड अच्छा है। फिर आप गलत शाखा इतिहास को अकेले छोड़ सकते हैं, अगर आपको बाद में इसके बारे में अन्य कमेंट्री करने की आवश्यकता हो। यह भी सुनिश्चित करता है कि आपने कोई प्रतिबद्ध इतिहास नहीं खोया।
अपनी स्थानीय गलत शाखा से:
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
अपने आप को शाबाशी दो.