प्रारंभिक गिट कमिट को वापस कैसे करें?


357

मैं पहली बार एक गिट रिपॉजिटरी के लिए प्रतिबद्ध हूं; मैं फिर इस पर पछतावा करता हूं और इसे वापस लेना चाहता हूं। मैं कोशिश करूँगा

# git reset --hard HEAD~1

मुझे यह संदेश मिला:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.

यह कमेटी रिपॉजिटरी का पहला कमिटमेंट है। किसी भी विचार कैसे git के प्रारंभिक प्रतिबद्ध पूर्ववत करने के लिए?

जवाबों:


565

आपको बस उस शाखा को हटाना होगा जिस पर आप हैं। आप इसका उपयोग नहीं कर सकते git branch -Dक्योंकि ऐसा करने के खिलाफ सुरक्षा जांच है। आप ऐसा करने के update-refलिए उपयोग कर सकते हैं ।

git update-ref -d HEAD

करो नहीं का उपयोग rm -rf .gitकरें या इस के रूप में इस तरह कुछ भी पूरी तरह से अन्य सभी शाखाओं के साथ ही शाखा, जिन्हें आप रीसेट कोशिश कर रहे हैं सहित अपने पूरे भंडार मिटा देगा।


1
एक रिबेस में ऐसा करने की कोशिश की - पहले कमिट को विभाजित करना चाहता था - फिर किया git status, और मेरे आश्चर्य को, गिट ने कहा fatal: Not a git repository (or any parent up to mount point ...)!
मैट फेनविक

1
यह मेरे लिए काम नहीं किया। कुछ ऐसी फाइलें बनाएं जिन्हें नजरअंदाज किया जाना चाहिए लेकिन नहीं .gitignoregit add ., git commit -m "initial commit", git update-ref -D HEAD, एक बनाने .gitignore, सूचना है कि Git अभी भी फाइलों यह पहले कि ध्यान नहीं दिया जाना चाहिए जोड़ा देख रहा है। दूसरे शब्दों में git update-ref -d HEADमुझे प्रारंभिक प्रतिबद्ध से पहले राज्य में वापस नहीं ले गया।
gman

1
लेकिन यह मूल प्रश्न का बिंदु है। प्रारंभिक प्रतिबद्ध से ठीक पहले राज्य में वापस जाना।
8

2
git reset --hard HEAD~1अन्य सभी कमिट के लिए जोड़ी गई फ़ाइलों को हटा देगा। स्पष्ट रूप से सवाल यह है कि उसी स्थिति में कैसे जाएं क्योंकि यह कमांड अन्य सभी मामलों में काम करता है। सबूत के लिए इस जिस्ट को
gman

11
यदि कोई व्यक्ति gman की टिप्पणियों से भ्रमित हो जाता है: वास्तव में प्रारंभिक प्रतिबद्ध को वापस git update-ref -d HEAD करता है , लेकिन सूचकांक में जोड़े गए सभी पहले से शुरू किए गए परिवर्तनों को रखता है। यदि आप भी उन परिवर्तनों को दूर करना चाहते हैं, तो बस निम्नलिखित पर अमल करें git reset --hard। अपूर्ण होने पर भी, यह उत्तर वास्तव में सबसे अच्छा है, इसलिए उपयोग करने से बचें rm -fr .git(जब तक कि आपको पता नहीं है कि आप क्या कर रहे हैं)।
रासना

62

आप HEAD को हटा सकते हैं और अपनी रिपॉजिटरी को एक नए राज्य में पुनर्स्थापित कर सकते हैं, जहाँ आप एक नई प्रारंभिक कमेटी बना सकते हैं:

git update-ref -d HEAD

एक नई कमिट बनाने के बाद, यदि आपने पहले ही रिमोट को पुश कर दिया है, तो आपको पिछली प्रारंभिक कमेटी को अधिलेखित करने के लिए रिमोट पर मजबूर करने की आवश्यकता होगी:

git push --force origin

1
वर्थ नोटिंग ... यह सही कमांड है, लेकिन यह HEAD को डिलीट नहीं करता है ... यह रेफरी को हटाता है (.it \ refs \ सिर के नीचे स्थित) जिसे .git \ HEAD फाइल ने चेक किया है। इस कमांड को चलाने के बाद भी आप रेफरी / हेड्स / <name> फाइल को इंगित करने वाली HEAD फाइल पा सकते हैं, जिसे आपने डिलीट कर दिया है लेकिन यदि आप उस रास्ते का अनुसरण करते हैं तो आप देखेंगे कि हेड्स ref अब मौजूद नहीं है।
डैनक

15

यह प्रश्न इस ब्लॉग पोस्ट से जुड़ा था और Git के नए संस्करणों के लिए एक वैकल्पिक समाधान प्रस्तावित किया गया था:

git branch -m master old_master
git checkout --orphan master
git branch -D old_master

यह समाधान मानता है कि:

  1. आपकी masterशाखा पर आपका केवल एक ही वचन है
  2. कोई शाखा नहीं है, old_masterइसलिए मैं उस नाम का उपयोग करने के लिए स्वतंत्र हूं

यह मौजूदा शाखा का नाम बदलकर old_masterएक नया, अनाथ, शाखा बना देगा master (जैसे कि यह नए भंडार के लिए बनाया गया है) जिसके बाद आप स्वतंत्र रूप से हटा सकते हैं old_master... या नहीं। आप पर निर्भर करता है।

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


11

प्रश्न में निर्धारित शर्तों के तहत:

  • कमेटी रिपॉजिटरी में पहला कमिट है।
  • जिसका अर्थ है कि वहाँ बहुत कम आदेश निष्पादित किए गए हैं:
    • git init,
    • संभवतः कुछ git addऑपरेशन,
    • और git commit,
    • और बस यही!

यदि उन पूर्व शर्तो को पूरा किया जाता है, तो प्रारंभिक प्रतिबद्ध को पूर्ववत करने का सबसे सरल तरीका होगा:

rm -fr .git

निर्देशिका से जहाँ आपने किया था git init। फिर आप git initGit रिपॉजिटरी को फिर से बनाने के लिए फिर से कर सकते हैं , और जो कुछ भी बदलाव समझदार हैं उसके साथ जोड़ को फिर से जोड़ते हैं जो आपको पहली बार नहीं बनाने के लिए पछतावा था, और प्रारंभिक प्रतिबद्ध को फिर से करें।

खतरा! यह Git रिपॉजिटरी डायरेक्टरी को हटा देता है।

यह Git रिपॉजिटरी डायरेक्टरी को स्थायी रूप से और अपरिवर्तनीय रूप से हटा देता है, जब तक कि आपको कहीं बैकअप न मिला हो। पूर्व शर्त के तहत, आपके पास रिपॉजिटरी में रखने के लिए कुछ भी नहीं है, इसलिए आप कुछ भी नहीं खो रहे हैं। आपके द्वारा जोड़ी गई सभी फाइलें अभी भी कार्यशील निर्देशिकाओं में उपलब्ध हैं, यह मानते हुए कि आपने उन्हें अभी तक संशोधित नहीं किया है और उन्हें हटाया नहीं है, आदि। हालांकि, ऐसा करना केवल तभी सुरक्षित है जब आपके पास अपने भंडार में और कुछ नहीं हो। प्रश्न में वर्णित परिस्थितियों में 'पहली बार रिपॉजिटरी प्रतिबद्ध करें - फिर इसे पछताओ', यह सुरक्षित है। बहुत बार, हालांकि, यह सुरक्षित नहीं है।

अवांछित क्लोन भंडार को हटाने के लिए ऐसा करना भी सुरक्षित है; यह उस रिपॉजिटरी को कोई नुकसान नहीं पहुंचाता है जिससे इसे क्लोन किया गया था। यह आपकी प्रतिलिपि में आपके द्वारा किए गए कुछ भी फेंक देता है, लेकिन मूल भंडार को अन्यथा प्रभावित नहीं करता है।

सावधान रहें, लेकिन यह सुरक्षित और प्रभावी है, जब पूर्व शर्त पूरी की जाती है।

यदि आपने अपनी रिपॉजिटरी के साथ अन्य चीजें की हैं जो आप संरक्षित करना चाहते हैं, तो यह उपयुक्त तकनीक नहीं है - आपका रिपॉजिटरी अब उपयुक्त होने के लिए पूर्व शर्त से नहीं मिलता है।


9
यह बुरी सलाह है। क्या होगा यदि रेपो में कोई अन्य सामान है जिसे आप खोना नहीं चाहते हैं?
मैट फेनविक

5
तब यह प्रारंभिक प्रतिबद्धता नहीं होगी। केवल एक प्रारंभिक प्रतिबद्ध है।
जोनाथन लेफलर

9
"तब यह प्रारंभिक प्रतिबद्धता नहीं होगी" - वास्तव में, हाँ यह होगा। आप कई शाखाओं के बहुत सामान्य मामले की उपेक्षा कर रहे हैं। देखें चार्ल्स का जवाब।
मैट फेनविक

2
मददगार, हालांकि एक चेतावनी के साथ आना चाहिए।
साइमन बेंग्सटन

5
यह वास्तव में काम करता है। स्वीकृत उत्तर नहीं है। टिप्पणी देखें
gman


3

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

सुनिश्चित करें कि आप वर्तमान में सही शाखा पर हैं।

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

यह समस्या को हल करने में सक्षम था।

जरूरी

यह एक आंतरिक रिपॉजिटरी पर था, जो सार्वजनिक रूप से सुलभ नहीं था, अगर आपकी रिपॉजिटरी सार्वजनिक रूप से सुलभ थी, तो कृपया यह मान लें कि आपको जो कुछ भी वापस करने की आवश्यकता है वह पहले से ही किसी और द्वारा खींच लिया गया है।


1

मुझे आश्चर्य है कि क्यों "संशोधन" का सुझाव नहीं दिया गया है और @damkrat द्वारा पार किया गया है, क्योंकि संशोधन मुझे सही तरीके से गलत तरीके से प्रतिबद्ध करने की सबसे कुशलता से हल करने के लिए सही तरीका के रूप में प्रकट होता है क्योंकि कोई प्रारंभिक उद्देश्य नहीं है प्रतिबद्ध। कुछ के रूप में आप केवल "सार्वजनिक" शाखा को संशोधित करना चाहिए जैसे कि कोई भी आपके रेपो को क्लोन नहीं करता है ...

git add <your different stuff>
git commit --amend --author="author name <author.name@email.com>"-m "new message"

- यदि किसी को वचनबद्धता को ठीक करने की आवश्यकता है तो
रिचर्ड

0

git रीसेट - हार्ड बदलाव करें, फिर करें

git add -A
git commit --amend --no-edit 

या

git add -A
git commit --amend -m "commit_message"

और फिर

git push origin master --force

--force फिर से लिखेगा जिसे आपने पहले चरण में रीसेट कर दिया है।

ऐसा मत करो, क्योंकि आप वीसीएस सिस्टम के पूरे विचार के खिलाफ जाने वाले हैं और विशेष रूप से गिट। एकमात्र अच्छी विधि नई बनाने और अनावश्यक शाखा को हटाने की है। git help branchजानकारी के लिए देखें ।


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