2012-01-18 13 views
39

से हटाने मैंने किया था एक प्रतिबद्ध औरGit पिछले वापस लौटने के लिए प्रतिबद्ध है और इतिहास

git revert HEAD^ 

सिर्फ Git लॉग

➜ git:(master) git log 
commit 45a0b1371e4705c4f875141232d7a97351f0ed8b 
Author: Daniel Palacio <[email protected]> 
Date: Tue Jan 17 16:32:15 2012 -0800 

    Production explanation 

साथ वापस लाया गया लेकिन अगर मैं Git लॉग कर यह अभी भी दिखाई -सभी। मैं इतिहास से निकालने के लिए के रूप में यह संवेदनशील जानकारी

git log --all 
commit 5d44355080500ee6518f157c084f519da47b9391 
Author: Daniel Palacio 
Date: Tue Jan 17 16:40:48 2012 -0800 

    This commit has to be reset 

commit 45a0b1371e4705c4f875141232d7a97351f0ed8b 
Author: Daniel Palacio 
Date: Tue Jan 17 16:32:15 2012 -0800 

    Production explanation 

मैं प्रतिबद्ध इतिहास भी से 5d44355080500ee6518f157c084f519da47b9391 कैसे निकालूँ है की ज़रूरत है?

+0

संभव [गिट अंडो अंतिम प्रतिबद्धता] का डुप्लिकेट (http://stackoverflow.com/questions/927358/git-undo-last-commit) –

+0

@ एड्रियन कॉर्निश: यह एक अच्छी शुरुआत है, लेकिन यह "संवेदनशील जानकारी" में मदद नहीं करता है बिट। –

+0

@ केविनबल्लार्ड - एक गिट रीसेट - हार्ड होगा? मान लीजिए कि इसे कहीं भी धक्का नहीं दिया गया है - अगर इसे धक्का दिया गया है तो सभी दांव –

उत्तर

46

सबसे पहले, git revert यहां गलत आदेश है। यह एक नई प्रतिबद्धता बनाता है जो एक पुराने को बदल देता है। यही वह नहीं है जिसे आप पूछ रहे हैं। दूसरा, ऐसा लगता है कि आप HEAD^ के बजाय HEAD वापस करना चाहते हैं।

आप इस कहीं भी धक्का दे दिया नहीं है, तो आप उपयोग कर सकते हैं git reset --hard HEAD^ नवीनतम फेंक करने के लिए प्रतिबद्ध है (यह भी किसी भी अप्रतिबद्ध बदलती है, जिससे सुनिश्चित करें कि आप किसी भी आप सहेजना चाहते हैं की जरूरत नहीं है हो सकता है फेंक देता है)। मान लें कि में आपकी प्रति और कोई और नहीं है, तो आप संवेदनशील जानकारी के साथ ठीक हैं। आप काम करना जारी रख सकते हैं और बाद में git push आपकी खराब प्रतिबद्धता को धक्का नहीं देगा।

यदि यह सुरक्षित धारणा नहीं है (हालांकि यदि मुझे नहीं सुनना क्यों पसंद है), तो आपको अपने रीफ्लॉग को समाप्त करने और कचरा संग्रह को मजबूर करने की आवश्यकता है जो अभी सभी उत्कृष्ट वस्तुओं को एकत्र करता है। आप

git reflog expire --expire=now --expire-unreachable=now --all 
git gc --prune=now 

के साथ ऐसा कर सकते हैं हालांकि यह केवल तभी किया जाना चाहिए यदि आपको वास्तव में इसे करने की ज़रूरत है।


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

+2

बेशक, अगर * आपके पास रिमोट पर फाइल सिस्टम पहुंच है, तो आप इसे उसी तरह से साफ कर सकते हैं जैसा आपने स्थानीय किया था। – Cascabel

+0

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

+0

और आप नहीं जानते कि यह कैसे करना है, केवल इतिहास के मध्य में प्रतिबद्ध इतिहास हटाएं? –

4

आप धक्का दिया नहीं किया है अभी तक प्रतिबद्ध, तो आप सिर्फ कर सकते हैं:

Git रीसेट --hard HEAD ~ 2

(HEAD ~ 2 दूर करने के लिए अपने मूल प्रतिबद्ध है और अपने लिए प्रतिबद्ध "वापस")।

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

+0

जो इतिहास भाग में मदद नहीं करता है। इतिहास में अभी भी प्रतिबद्धता। – daniel

+1

वास्तव में, उस प्रतिबद्धता से इस बिंदु से आपकी वर्तमान शाखा का हिस्सा नहीं होगा, और अंततः गिट जीसी द्वारा हटा दिया जाएगा। यदि आप वास्तव में अभी प्रतिबद्धता को हटाना चाहते हैं, तो आप अब गिट जीसी का उपयोग कर सकते हैं ताकि उसे फिर से चालू किया जा सके, या फिर भंडार को क्लोन कर सकें; जब एक भंडार क्लोनिंग, केवल कुछ शाखाओं द्वारा पहुंच योग्य होता है क्लोन हैं। –

27

आप परवाह नहीं है, तो के बारे में प्रतिबद्ध, बस कार्य करें:

git reset --hard HEAD~ 

दूर उड़ा करने के लिए प्रतिबद्ध।

आप परिवर्तनों काम कर निर्देशिका में होना चाहते हैं, करते हैं:

git reset HEAD~ 

आप git revert साथ क्या किया है के आधार पर आप ऊपर बताए गए आदेशों को बदलने के लिए हो सकता है।रिवर्ट एक नई प्रतिबद्धता बनाता है जो उस प्रतिबद्धता को वापस लाता है जिसे आप वापस करना चाहते हैं। तो दो काम होंगे। उन्हें दोनों को हटाने के लिए आपको HEAD~2 करना पड़ सकता है।

ध्यान दें कि, आमतौर पर, बदले में, बदलावों को वापस करने का सुरक्षित तरीका सुरक्षित है। लेकिन यहां, चूंकि आप संवेदनशील डेटा को हटाना चाहते हैं, रीसेट सबसे अच्छा तरीका है।

5

एक अच्छा समाधान here है। पिछले (ऊपर) को हटाने के लिए प्रतिबद्ध आप कर सकते हैं

git push [remote] +[bad_commit]^:[branch] 

जहां [bad_commit] है प्रतिबद्ध है कि [शाखा] वर्तमान में इसे इंगित, या अगर [शाखा] स्थानीय रूप से चेक आउट किया गया है, तो आप भी

कर सकते हैं
git reset HEAD^ --hard 
git push [remote] -f 
-1

रिमोट रेपो में परिवर्तनों को हटाने और इतिहास हटाने के लिए, यह मेरे लिए काम करता है। 1. वापस जाने के लिए एक प्रतिबद्ध, Git अपनी स्थानीय शाखा में --hard HEAD^रीसेट कोशिश करते हैं और 2. दूरस्थ शाखा कोशिश Git धक्का मूल करने के लिए बाध्य करने के लिए धक्का + branch_name

अधिक जानकारी के लिए उल्लेख इस https://ncona.com/2011/07/how-to-delete-a-commit-in-git-local-and-remote

+0

यदि आपने नोटिस नहीं किया है, तो आपने अभी भी वही बात कहा है जो पुराने, पहले से ही बेहतर उत्तर है। कृपया [उत्तर] पढ़ें। – Ajean

संबंधित मुद्दे