स्थानीय git कमिट कैसे रद्द करें


744

मेरा मुद्दा यह है कि मैंने एक फ़ाइल बदल दी है जैसे: README, ने ' मेरी परीक्षण पंक्ति के लिए एक नई पंक्ति' जोड़ी और फ़ाइल को सहेजा, फिर मैंने निम्नलिखित आदेश जारी किए

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

मैंने कोड को github पर नहीं धकेला, अब मैं इस कमिट को रद्द करना चाहता हूं।

इसके लिए मैंने प्रयोग किया

   git reset --hard HEAD~1

लेकिन मैं README फ़ाइल से ' अपनी परीक्षण लाइन के लिए नई जोड़ी गई लाइन' खो गया । ऐसा न हो कि। मुझे वहां रहने के लिए सामग्री चाहिए। क्या सामग्री को बनाए रखने और मेरी स्थानीय प्रतिबद्धता रद्द करने का कोई तरीका है?


3
ऐसा लगता है कि आप निश्चित रूप से नहीं पूछ रहे हैं git revert, जो उल्टे किए गए प्रतिबद्ध के रिवर्स रूप के साथ एक नई प्रतिबद्धता बनाता है। बस रीसेट करना आपकी वर्तमान शाखा को एक अलग कमिट के लिए इंगित करता है, इस मामले में, जिस कमिट से पहले आप "भूलना" चाहते हैं।
Cascabel

1
NB: git-commitयदि आप संदेश को खाली छोड़ते हैं, तो यह उल्लेख के लायक हो सकता है , इसलिए यदि आपने वास्तव में वह वचन पूरा नहीं किया है जो मददगार हो सकता है।
GKFX

जवाबों:


1419

बस ध्वज के git resetबिना उपयोग करें --hard:

git reset HEAD~1

पुनश्च: यूनिक्स आधारित प्रणालियों पर आप उपयोग कर सकते हैं HEAD^जो कि बराबर है HEAD~1। विंडोज HEAD^काम नहीं करेगा क्योंकि ^एक लाइन निरंतरता का संकेत देता है। तो आपका कमांड प्रॉम्प्ट आपसे बस पूछेगा More?


13
वैसे, इसे --mixed मैनुअल में कहा जाता है
जोश ली

10
Git के नए संस्करण यहां तक ​​कि @^शॉर्टहैंड के रूप में भी अनुमति देते हैं HEAD^
20

मुझे नहीं पता कि इसने क्या किया, लेकिन बहुत सारी फाइलें मेरी परिवर्तन सूची में दिखाई दीं, जिन फाइलों को मैंने नहीं छुआ
FRR

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

1
क्या यह संभव है कि एक ओर सभी कमिट रीसेट कर दें।
वेबवुमन

185

ध्वज के --softबजाय का उपयोग करें --hard:

git reset --soft HEAD^

18
आप 2 झंडे के बीच का अंतर समझा सकते हैं?
जॉन गिआटा

1
यदि आप पैकेज मैनेजर कंसोल को खोलते हैं और इसे "git reset --soft HEAD ^" चलाते हैं, तो यह वही करता है जो आप चाहते हैं (और आपको क्या चाहिए)।
डेविड कॉर्नेलसन

54
@ जॉनगोट्टा - git reset --soft HEAD^पिछले स्थानीय (अप्रकाशित) को हटा देगा लेकिन आपके द्वारा किए गए बदलावों को बनाए रखेगा
fider

@ फाइटर उद्धारकर्ता! सुनिश्चित नहीं है कि यदि स्वीकृत उत्तर अभी भी काम करता है, लेकिन यह सटीक उत्तर होना चाहिए जो ओपी को आवश्यक है।
बाबू

git reset --soft HEAD~खिड़कियों पर
Jack0fshad0ws

34

यदि आप कमिट के मध्य में हैं (यानी पहले से ही आपके संपादक में), तो आप पहले से ऊपर की सभी पंक्तियों को हटाकर इसे रद्द कर सकते हैं #। वह कमिटमेंट को निरस्त कर देगा।

इसलिए आप सभी लाइनों को हटा सकते हैं, ताकि प्रतिबद्ध संदेश खाली हो, फिर फ़ाइल को सहेजें:

इसे ऐसा दिखना चाहिए।

फिर आपको एक संदेश मिलेगा जो कहता है Aborting commit due to empty commit message.

संपादित करें :

आप सभी पंक्तियों को भी हटा सकते हैं और परिणाम बिल्कुल समान होगा।

Vim (यदि वह आपका डिफ़ॉल्ट संपादक है) में सभी पंक्तियों को हटाने के लिए, एक बार जब आप संपादक में ggहोते हैं, तो पहली पंक्ति पर जाने के लिए टाइप करें, फिर dGसभी पंक्तियों को हटाने के लिए। अंत में, फ़ाइल को लिखें और छोड़ दें और wqआपकी प्रतिबद्धता समाप्त कर दी जाएगी।


3
यह वही है जो मैं देख रहा था! इस उत्तर को और अधिक
बढ़ाने की

FYI करें, यह भी काम करता है अगर आप एक निरस्त करने के लिए कोशिश कर रहे हैंrebase -i mybranchname
inostia

18

पहली बात यह है कि आपको यह निर्धारित करना चाहिए कि क्या आप प्रतिबद्ध संदेश को हटाने से पहले स्थानीय परिवर्तन रखना चाहते हैं।

git logवर्तमान प्रतिबद्ध संदेशों को दिखाने के लिए उपयोग करें , फिर उस कमिट commit_id से पहले खोजें जिसे आप हटाना चाहते हैं, न कि उस कमिट को जिसे आप हटाना चाहते हैं।

यदि आप स्थानीय रूप से बदली गई फ़ाइलों को रखना चाहते हैं, और बस प्रतिबद्ध संदेश हटाएं:

git reset --soft commit_id

यदि आप सभी स्थानीय रूप से परिवर्तित फ़ाइलों और प्रतिबद्ध संदेश को हटाना चाहते हैं:

git reset --hard commit_id

यह नरम और कठोर का अंतर है


1
मुझे लगता है कि यह विपरीत है।
रफ

9

आप Git को बता सकते हैं कि अपने सूचकांक के साथ क्या करना है (फ़ाइलों का सेट जो अगली कमिट बन जाएगा) और वर्किंग डायरेक्टरी जब किसी एक पैरामीटर का उपयोग करके git रीसेट कर रही हो:

--soft: केवल कमिट्स को रीसेट किया जाएगा, जबकि इंडेक्स और वर्किंग डायरेक्टरी में कोई बदलाव नहीं किया गया है।

--mixed: यह HEAD से मिलान करने के लिए इंडेक्स को रीसेट करेगा, जबकि वर्किंग डायरेक्टरी को टच नहीं किया जाएगा। सभी परिवर्तन कार्यशील निर्देशिका में रहेंगे और संशोधित रूप में दिखाई देंगे।

--hard: यह HEAD से मेल करने के लिए सब कुछ (कमिट, इंडेक्स, वर्किंग डायरेक्टरी) को रीसेट करता है।

आपके मामले में, मैं git reset --softआपके संशोधित बदलावों को सूचकांक और कार्यशील निर्देशिका में रखने के लिए उपयोग करूंगा । अधिक विस्तृत विवरण के लिए इसे देखना सुनिश्चित करें ।


1

नीचे दिए गए आदेश का उपयोग करें:

$ git reset HEAD~1

इसके बाद आप उन फाइलों को भी देख सकते हैं जो नीचे की प्रतिक्रिया की तरह वापस आती हैं।

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.