मैं एक विशिष्ट प्रतिबद्धता के लिए एक गीथॉब रिपॉजिटरी कैसे रोलबैक कर सकता हूं?


431

मेरे github में अभी 100 कमिट हैं। मुझे 80 को प्रतिबद्ध करने के लिए भंडार को रोलबैक करने की आवश्यकता है, और बाद के सभी को हटा दें।

क्यों? यह रेपो विविध उपयोगकर्ताओं से विलय के लिए माना जाता है। अत्यधिक संपादन के कारण, मेरीज का एक समूह मेरे सामने से चला गया। यह मेरी दूरस्थ शाखाओं की गलतफहमी के कारण था, जहां 3 डेवलपर्स को एक दूसरे के रूप में लेबल किया गया था। मुझे उस बिंदु पर रीसेट करने की आवश्यकता है, और फिर आगे की ओर खींचें।

मैं इस उदाहरण में पुनर्लेखन करना चाहता था: मैं GitHub पर एक प्रतिबद्ध कैसे निकाल सकता हूं?

हालांकि, गिट मुझे बहुत संघर्ष प्रबंधन करना चाहते हैं। क्या कोई सरल तरीका है?

जवाबों:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

नोट: जैसा कि नीचे टिप्पणियों में लिखा गया है, इसका उपयोग करना सहयोगी माहौल में खतरनाक है: आप इतिहास को फिर से लिख रहे हैं


43
लोग, करते हैं git push -f origin branch। मेरे पास बस एक बुरा समय था, क्योंकि मुझे वह याद था।
सुमित एम असोक

21
इस से सावधान! आप स्थानीय रूप से अपने सभी कमिट्स खो देंगे, और यदि आप धक्का देते हैं तो कोई रास्ता नहीं होगा
थॉमस

8
यह सच नहीं है, आप पुराने रिफिट्स का उपयोग कर प्राप्त कर सकते हैं git reflog
Jan Schaefer

27
आपको git push origin HEAD --forceइसके बजाय करने की आवश्यकता हो सकती है git push -f origin branchक्योंकि मुझे एक error: src refspec branch does not match any.त्रुटि दे रही थी
sprocket12

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

21

सबसे हालिया प्रतिबद्ध को पूर्ववत करने के लिए मैं यह करता हूं:

प्रथम:

git log

पूर्ववत करने के लिए बहुत नवीनतम SHA आईडी प्राप्त करें।

git revert SHA

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

यह सिर्फ आपके द्वारा किए गए किसी चीज के तत्काल पुनर्भरण के लिए अच्छा है, जो मुझे लगता है कि मेरे लिए अधिक बार होता है।

जैसा कि माइक से पता चला है, आप यह भी कर सकते हैं:

git revert HEAD

8
git revert HEADहैश देखने के लिए बिना आखिरी प्रतिबद्ध वापस कर देंगे।
माइक बैरनज़क

यह एक समाधान है यदि आप कमिट्स को बिल्कुल भी डिलीट नहीं करना चाहते हैं। हालाँकि, इस मामले में, सभी कूड़े के आवागमन अभी भी होंगे, और एक क्लोन को रीसेट करने या उन्हें चेकआउट करने की अनुमति देगा। यदि आप इसे रोकना चाहते हैं, तो आपको बल-पुश करना होगा।
cst1992

19

दूसरा रास्ता:

उस शाखा को चेकआउट करें जिसे आप वापस करना चाहते हैं, फिर अपनी स्थानीय कार्य प्रतिलिपि को उस प्रतिबद्ध पर वापस सेट करें जिसे आप दूरस्थ सर्वर पर नवीनतम होना चाहते हैं (इसके बाद सब कुछ बाय-बाय हो जाएगा)। ऐसा करने के लिए, SourceTree में, मैंने "इस प्रतिबद्ध के लिए BRANCHNAME को रीसेट करें" पर राइट-क्लिक किया।

फिर अपनी रिपॉजिटरी की स्थानीय निर्देशिका पर जाएँ और इस कमांड को चलाएँ:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

यह आपके स्थानीय भंडार में वर्तमान एक के बाद सभी कमियों को मिटा देगा लेकिन केवल उस एक शाखा के लिए।


1
FYI करें "REPOSITORY_NAME" कुछ इस तरह होगा https: /me@github.com/me/repo_name.git
tim

3
यदि आप उस आदेश को तोड़ेंगे और उसे समझाएंगे तो यह अधिक उपयोगी होगा।
cst1992

3

अधिकांश सुझाव यह मान रहे हैं कि आपको किसी तरह पिछले 20 कमिट्स को नष्ट करने की आवश्यकता है, यही कारण है कि इसका मतलब "इतिहास को फिर से लिखना" है, लेकिन आप ऐसा नहीं करते हैं।

बस # commit० की ओर से एक नई शाखा बनाएं और उस शाखा पर आगे काम करें। अन्य 20 आवागमन पुरानी अनाथ शाखा पर रहेंगे।

यदि आप चाहते हैं कि आपकी नई शाखा का समान नाम हो, तो याद रखें कि शाखा मूल रूप से केवल लेबल हैं। बस अपनी पुरानी शाखा का नाम बदलकर किसी और चीज़ पर रख दें, फिर अपनी इच्छित नाम के साथ प्रतिबद्ध # 80 पर नई शाखा बनाएँ।


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

2

मास्टर से शाखा अपडेट करते समय, मैं देखता हूं कि मैं कभी-कभी ओवर-क्लिक करता हूं, और शाखा को मास्टर में विलय करने का कारण बनता है, भी। इसे पूर्ववत करने का एक तरीका मिला।

यदि आपका अंतिम वचन एक मर्ज था, तो थोड़ा और प्यार चाहिए:

git revert -m 1 HEAD


1

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

  1. डिफ़ॉल्ट शाखा नहीं
  2. पोल खोलने का कोई अनुरोध नहीं।
  3. शाखा संरक्षित नहीं है।

अब इसे पिछली प्रतिबद्ध बिंदु पर इंगित करने के लिए अपने स्थानीय भंडार में पुनः बनाएं। और इसे दूरस्थ रेपो में वापस जोड़ें।

git checkout -b master 734c2b9b   # replace with your commit point

फिर स्थानीय शाखा को रिमोट पर धकेलें

git push -u origin master

डिफ़ॉल्ट शाखा और शाखा सुरक्षा आदि को वापस जोड़ें।

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