मैं 1 कमिट कैसे रोल कर सकता हूं?


127

मेरे पास 2 कमिट हैं जिन्हें मैंने पुश नहीं किया:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

मैं अपने पहले एक (सबसे पुराना) को कैसे रोल कर सकता हूं, लेकिन दूसरे को कैसे रख सकता हूं?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

यहां से:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

क्या मुझे बस करने की आवश्यकता है:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

अर्थात्?


3
यह प्रश्न ऑफ़-टॉपिक प्रतीत होता है क्योंकि यह एक प्रोग्रामिंग टूल के बारे में है। यह स्टैक ओवरफ्लो पर निर्भर करता है।
पीटर मोर्टेंसन

@PeterMortensen सहमत हैं। सुपरयूजर के लिए यह गुंजाइश है
कोलोब कैनियन

जवाबों:


95

सबसे सुरक्षित और संभवत: जाने का सबसे साफ तरीका इंटरएक्टिव तरीके से रिबास करना है।

git rebase -i HEAD^^

या,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

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

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

यदि आप यहां काम कर रहे हैं, तो दोनों एक ही फ़ाइल को प्रभावित करते हैं, तो आपको मर्ज संघर्ष दिखाई दे सकता है।

रिपॉजिटरी के साथ रीसेट git reset --hardकरना ध्यान से किया जाना चाहिए, क्योंकि यह पूर्ववत नहीं किया जा सकता है।

इतिहास का पुनर्लेखन ध्यान से किया जाना चाहिए।


मैं 'git rebase' के दौरान किसी कमिट को कैसे हटा सकता हूं? केवल 3 कमांड हैं: पिक, एडिट, स्क्वैश। कोई भी AFAIK डिलीट नहीं है।
n179911

8
पूरी तरह से सूची से लाइन हटाएं, और यह उस कमिट को
मिटा

जब मैं उस परिवर्तन को वापस लाना चाहता था जो मैं उसका कोई निशान नहीं छोड़ना चाहता था। यदि आप भी अपने रिवर्ट का कोई निशान नहीं छोड़ना चाहते हैं तो यह सबसे अच्छा तरीका है।
फिलिप व्हेलन

"सबसे सुरक्षित और शायद सबसे साफ रास्ता है अंतःक्रियात्मक रूप से रिबेट करना" यदि आप विम का उपयोग नहीं करते हैं तो शायद नहीं। मैं भाग्यशाली हो गया और उस गंदगी से अपना रास्ता निकाला। फिर भी
अपवित्र

मेरा सुझाव है कि rebaseजितना संभव हो उतना कम उपयोग करें । अगर आप दूसरों के साथ काम करते हैं तो बस बनाइए revert
बोल्डनिक

52

अगर यह http://nakkaya.com/2009/09/24/git-delete-last-commit/ से है और यह मेरे लिए काम करता है

Git डिलीट लास्ट कमिट

एक बार देर रात में जब मैं कॉफी से बाहर निकला, तो मैंने वह सामान किया जो मुझे नहीं करना चाहिए था। फिर मैं अगले 10 - 15 मिनट गुजारता हूं कि मैंने जो आखिरी कमिटमेंट बनाई थी, उसे कैसे हटाऊं। इसलिए तीसरी बार के बाद मैं इसका रिकॉर्ड बनाना चाहता था ताकि बाद में इसका उल्लेख कर सकूं।

यदि आपने कबाड़ किया है, लेकिन धक्का नहीं दिया,

git reset --hard HEAD~1

सिर से पहले प्रतिबद्ध के लिए HEAD ~ 1 एक आशुलिपि है। वैकल्पिक रूप से आप उस हैश के SHA-1 का उल्लेख कर सकते हैं जिसे आप रीसेट करना चाहते हैं। ध्यान दें कि जब-जब हेड खो जाता है तो कमिटेड ट्री में ट्रैक की गई फ़ाइलों में किसी भी बदलाव का उपयोग करते समय।

यदि आप अपने द्वारा किए गए कार्य को समाप्त नहीं करना चाहते हैं, तो आप --softविकल्प का उपयोग कर सकते हैं जो कमिट को हटा देगा, लेकिन यह आपकी सभी परिवर्तित फ़ाइलों को "परिवर्तन किए जाने के लिए प्रतिबद्ध" छोड़ देगा, क्योंकि गिट की स्थिति इसे डाल देगी।

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

git revert HEAD

यह एक नई प्रतिबद्ध बनाएगा जो आकस्मिक प्रतिबद्ध द्वारा पेश की गई हर चीज को उलट देगा।


2
--Soft विकल्प के साथ, यह आपके लिए एक फ़ाइल का नाम बदलने और गलती से "गिट कमिट-ए" का उपयोग करने के बजाय सही है, पहले "गिट ऐड" का उपयोग करने के बजाय।
हारून हारून

8

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


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

6

मैंने अभी यह किया है:

git rebase -i HEAD^^

मैंने इसे खराब कर दिया इसलिए मैंने ऐसा किया

git rebase --abort

फिर कर लिया। फिर मुझे इस तरह धक्का देना पड़ा:

git push origin master -f

और इसने उन कमिट्स को नष्ट कर दिया, जो मैंने वापस किए थे। बढ़िया काम किया।


4

नहीं, कमिट git reset --hard baf8d5eको हटा देगा 3368e1cऔर HEAD baf8d5eबाद में होगा।

यदि आप 3368e1cकमिट रखना चाहते हैं और कमिट को हटाना bad8d5eसबसे आसान उपाय है तो एक " git rebase -i HEAD~2" (यानी अंतिम दो कमिट का इंटरएक्टिव रीबेस) करें। यह कमांड आपके कमिट मैसेज एडिटर को लॉन्च करेगी और आपको पिछले दो कमिट में से प्रत्येक के लिए एक लाइन दिखाई देगी। वहां आप सिर्फ bad8d5eकमिट लाइन हटाएं और सेव करें। git फिर आपके इतिहास को फिर से लिखेगा और दूसरा वचन समाप्त हो जाएगा।

वहाँ अन्य उपयोगी आदेशों आप की तरह प्रतिबद्ध संदेश संपादक में उपयोग कर सकते हैं squash, editआदि इंटरएक्टिव रिबेस बहुत शक्तिशाली है!

ऐसा न करें अगर कोई पहले से ही इन कमिट्स को देखता है (अपनी रिपॉजिटरी से पुश या पुल)!



1
git reset --hard {ref}

किसी कमिट को पूर्ववत करने का एकमात्र तरीका है यदि रेपो में केवल एक अन्य कमिट है (जैसे प्रारंभिक कमिट और 1 और)। बाकी तरीके (रिवर्ट, रिबेस) काम करने से इनकार करते हैं, कम से कम जीआईटी 1.7.5.1 के रूप में।

यदि आप git resetएक git gcतत्कालीन git के साथ अनुसरण करते हैं तो वास्तव में पुराने प्रतिबद्ध डेटा को रेपो से पूरी तरह से हटा देगा।


1
git checkout <treeish> -- /path/to/dir

यह दी गई "ट्रीश" से / पाथ / डायर के लिए डायरेक्टरी वापस लाएगा


0

मुझे रिपॉजिटरी फ़ोल्डर के अंदर HEAD फ़ाइलों से अंतिम कमिट के हैश कोड को मैन्युअल रूप से संपादित करके यह काम करना पड़ा:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

इससे पहले, मैं कभी भी स्थानीय स्तर पर किए गए UNMERGE संचालन को आगे बढ़ाने के लिए धक्का नहीं दे पाया था। यह केंद्रीय रिपोजिटरी को "कुछ रिफ को आगे बढ़ाने में विफल" कहता रहा।

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