एक जीआईटी कमिट निकालें जिसे धक्का नहीं दिया गया है


721

मैंने किया था, git commitलेकिन मैंने इसे अभी तक भंडार में नहीं धकेल दिया है। इसलिए जब मैं करता हूं git status, मुझे 1 प्रतिबद्ध होकर '# शाखा' मास्टर से आगे निकल जाती है।

इसलिए अगर मैं अपना शीर्ष कमिट वापस लेना चाहता हूं, तो क्या मैं कर सकता हूं:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

जब मुझे लगता है कि मुझे दिया जाता है git log:

प्रतिबद्ध eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
दिनांक: मंगल सिपाही २ ९: २१:२१:४१ २०० ९ -0700


प्रतिबद्ध db0c078d5286b837532ff5e276dcf91885df2296
दिनांक: मंगल सिपाही २२:३१:३ 2009 २०० ९ -० 22००

9
यह प्रश्न आपके स्वयं के अन्य प्रश्नों का डुप्लिकेट प्रतीत होता है: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
ब्रायन कैंपबेल



3
खतरे: reset --hardकाम के नुकसान में परिणाम हो सकता है, क्योंकि ऐसा करने से आपके स्थानीय फाइलों (आपके नए काम) को वेब से लोगों के साथ अधिलेखित करने का परिणाम होता है (मेरे साथ हुआ)। Git के बारे में प्रश्न और उत्तर स्पष्ट रूप से बताना चाहिए कि उनके कमांड क्या कर रहे हैं और निम्नलिखित पाठकों के लिए क्या जोखिम हैं।
ऑरेंजशेरेट

जवाबों:


673

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

एक आसान संस्करण होगा git reset --hard HEAD^, वर्तमान सिर से पहले पिछली प्रतिबद्ध पर रीसेट करने के लिए; इस तरह आपको कमिट आईडी के आसपास नकल करने की जरूरत नहीं है।

जब आप कोई भी काम करते हैं तो सावधान रहें git reset --hard, क्योंकि आपके पास कोई भी परिवर्तन नहीं हो सकता है। आप git statusयह सुनिश्चित करने के लिए जांच कर सकते हैं कि आपकी कार्यशील प्रतिलिपि साफ है, या आप जो भी बदलाव हैं, उसे दूर करना चाहते हैं।

इसके अलावा, HEAD के बजाय आप origin/masterसंदर्भ के रूप में उपयोग कर सकते हैं , जैसा कि टिप्पणियों में @bdonlan द्वारा सुझाया गया है:git reset --hard origin/master


374
या git reset --hard origin/master, जो कुछ भी मूल पर था उसे रीसेट करने के लिए।
बजे ३

1
एक अन्य उपयोगी पॉइंटर जिसे आप रीसेट कर सकते हैं वह है ORIG_HEAD या इसके सामान्यीकरण का उपयोग करते हुए Reflog HEAD @ {1} (HEAD की अंतिम स्थिति)।
जकुब नारबस्की

12
पाठक, git resetआपके कोड से पहले । अपने भविष्य को एक एहसान करो: के बीच का अंतर reset, reset --softऔर reset --hard(अपने पहले के लिए क्या होता है git add: चित्र उर्फ "अपने काम" :) लिंक
user18099

3
ध्यान दें कि यह वह हटा देगा जो आप चाहते हैं कि कमिट में था (इसलिए इसमें git statusकोई बदलाव नहीं दिखाई देगा और कमिट को हटा दिया जाएगा / खोए हुए परिवर्तन होंगे)।
Bjørn Børresen

12
नोट: उपयोग के दौरान सावधान रहें जब git reset --hard HEAD^आप कमिट की गई फ़ाइलों में परिवर्तन खो देंगे (आप परिवर्तन हटा दिए जाएंगे)। इस प्रश्न की दो शाखाएँ हैं: एक कमिट वापस करने के लिए, लेकिन फिर भी डिस्क में परिवर्तन करना हैgit reset --soft HEAD~1
पैपगी

625

यदि आपने रिमोट में अपने बदलाव नहीं किए हैं

git reset HEAD~1

जांचें कि क्या वर्किंग कॉपी साफ है git status

ईएलएसई ने आपने अपने परिवर्तनों को रिमोट में धकेल दिया है

git revert HEAD

यह कमांड पिछले एक कमिटमेंट / बदलाव को वापस करेगा / हटाएगा और फिर आप पुश कर सकते हैं


34
इसका उत्तर "नवीनतम गिट कमिट को हटा दें जिसे धक्का नहीं दिया गया है" (निकटतम उत्तर
आईएमएचओ

25
इसके अलावा, यह अंतिम बदलाव में किए गए स्थानीय बदलावों को बनाए रखता है, जबकि गिट रीसेट --हार्ड नहीं करता है
स्टैनिमिर स्टोयोनोव

1
मेरे लिए, यह अंतिम धक्का दिया गया प्रतिबद्ध और अप्रकाशित प्रतिबद्ध है
कोडीन

git ने मेरे लिए HEAD को वापस कर दिया और उन सभी फाइलों को हटा दिया जिन्हें मैंने पुश करने के लिए तैयार किया था। सावधान रहे!
जेसन ब्रूस

158
git reset --hard origin/master

मूल पर जो कुछ भी था उसे रीसेट करने के लिए।

इसे @bdonlan ने टिप्पणियों में पोस्ट किया था । मैंने यह उत्तर उन लोगों के लिए जोड़ा है जो टिप्पणियां नहीं पढ़ते हैं।


4
यह प्रश्न लगभग 5 साल पहले पूछा गया था, और यह पहले से ही टिप्पणियों में से एक है।
अनुबिन नोब

1
क्या होगा यदि वर्तमान स्थानीय शाखा अलग है master- क्या मुझे इसका उपयोग करना चाहिए origin/mybranch?
पावेल वलसोव

9
मैं आमतौर पर टिप्पणियों को नहीं पढ़ता जब मैं एक उत्तर के लिए जल्दी में होता हूं ... उत्तर के रूप में डालने के लिए धन्यवाद (एक सरल काम करता है)
लियोनार्डो अल्वेस मचाडो

चेतावनी: अवगत git reset HEAD~रहें कि यह आपके सभी मौजूदा कोड परिवर्तन को हटा देगा, इसके अलावा अन्य केवल कोड में कमिट को सेट करता है
मेयर स्पिट्जर

69

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

1. नवीनतम कमिट को वापस करने के लिए और प्रतिबद्ध फाइल में बदलाव को छोड़ दें :

git reset --hard HEAD~1

2. नवीनतम कमिट को वापस करने के लिए लेकिन स्थानीय परिवर्तन (डिस्क पर) करें:

git reset --soft HEAD~1

यह (बाद में कमांड) आपको उस स्थिति में ले जाएगा जो आपने किया था git add

यदि आप उसके बाद फ़ाइलों को अस्थिर करना चाहते हैं, तो करें

git reset

अब आप जोड़ने और फिर से कमिट करने से पहले अधिक परिवर्तन कर सकते हैं।


47

बस कंसोल में टाइप करें:

$ git reset HEAD~

यह कमांड दूरस्थ एचईएडी के आगे सभी स्थानीय कमानों को छोड़ देता है


7
क्या आप बता सकते हैं कि मौजूदा उत्तरों में आपका उत्तर क्या कहता है?
nvoigt

यह साफ करता है वर्तमान धकेलने से पहले प्रतिबद्ध - अन्य उत्तर की तरह - - द्वारा किए गए बदलावों को वापस लाने में स्थानीय रूप से बिना जो एक गंभीर बाल वापसी पल हो सकता है
अनुदान

41

मुझे विश्वास है कि उन लोगों में से एक आपकी आवश्यकता के अनुरूप होगा

1 - पूर्ववत करें और सभी फाइलों को रखें: git reset --soft HEAD~;

2 - सभी फाइलों को कमिट और अनस्टेज करें: git reset HEAD~;

3 - पूर्ववत करें और सभी परिवर्तनों को पूरी तरह से हटा दें: git reset --hard HEAD~;

यहाँ थे मैं जवाब मिला


इस उत्तर को स्वीकार करना होगा: डी
आरोन जॉन साबू

30

पुश करने से पहले आखिरी कमिटमेंट निकालें

git reset --soft HEAD~1

1यदि आप दो अंतिम उपयोग को हटाना चाहते हैं 2, और इसके बाद *


3
हाय करीना, का उल्लेख --softसंभव उत्तर के अतिरिक्त है, लेकिन क्या आप भी इसका उल्लेख कर सकते हैं? अपने समाधान की व्याख्या करना हमेशा मददगार होता है। साथ ही अंग्रेजी से चिपके रहने की कोशिश करें। धन्यवाद
VLASTIMIL Ovčáčík

1
--soft- यह सुनिश्चित करता है कि आप उस फ़ाइल में परिवर्तन नहीं खोते हैं जिसकी प्रतिबद्ध आप पूर्ववत करने की कोशिश कर रहे हैं
papigee

19

मैंने उसी स्थिति का अनुभव किया है जो मैंने नीचे किया था क्योंकि यह बहुत आसान था। पास करके commit-Idआप उस विशेष कमिट तक पहुँच सकते हैं जहाँ आप जाना चाहते हैं:

git reset --hard {commit-id}

जैसा कि आप अपनी पिछली प्रतिबद्धताओं को हटाना चाहते हैं, इसलिए आपको commit-Idअपना पॉइंटर स्थानांतरित करने की आवश्यकता है , जहां आपको पास करने की आवश्यकता है:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

बस अपने आप को जैसे newbies के लिए एक चेतावनी - उन फ़ाइलों का बैकअप लें जहां आप परिवर्तनों को KEEP करना चाहते हैं, क्योंकि वे पहले वाले संस्करण में वापस आ जाएंगे। मेरा परिदृश्य यह था कि मैंने गलती से अपने रेपो डायरेक्टरी में एक डेटाबेस डंप डाल दिया था और फिर प्रतिबद्ध - मैं स्पष्ट रूप से रेपो के लिए उन फ़ाइलों को कमिट नहीं करना चाहता था लेकिन डीआईडी ​​उन बदलावों को रखना चाहता है जो मैंने अन्य फाइलों में किए थे। इसलिए मुझे बैकअप रीसेट करने से पहले आवश्यक परिवर्तन से कॉपी करना और पेस्ट करना था।
user1063287

10

मैं यह करता हूं:

पहले अपनी शाखा की जाँच करें (मेरी केस masterशाखा के लिए):

git checkout master

फिर दूरस्थ HEAD ^ पर रीसेट करें ( यह आपके सभी स्थानीय बदलावों को हटा देगा ), स्वच्छ और खींचने के लिए मजबूर करें:

git reset HEAD^ --hard && git clean -df && git pull

1
यह बहुत परमाणु विकल्प है। मैं सुझाव देता हूं कि सीमित प्रतिबद्धता के लिए नरम रीसेट करें।
c0der512 21

3

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


शानदार जवाब - यह इसे आसानी से sourcetree में क्लिक करने की अनुमति देता है :)
कामिल Kiełczewski

1

मुझे बस एक ही समस्या थी और वह कर रहा था:

git rebase -i HEAD~N

(एन कमिट्स की संख्या है जो git आपको दिखाएगी)

यह आपके टेक्स्ट एडिटर को संकेत देता है और फिर आप इससे जुड़ी लाइन को हटाकर अपनी इच्छित प्रतिबद्धता को हटा सकते हैं।

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