मैं स्थानीय रूप से और '' पुश पुश '' के बाद रिमोट पर 'पूर्ववत' कैसे कर सकता हूं


242

मैंने git commitएक के बाद एक प्रदर्शन किया है git push। मैं स्थानीय और दूरस्थ रिपॉजिटरी दोनों पर उस परिवर्तन को कैसे वापस ला सकता हूं?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

जवाबों:


400
git reset --hard HEAD~1
git push -f <remote> <branch>

(उदाहरण के लिए धक्का: git push -f origin bugfix/bug123)

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


24
वैकल्पिक रूप से, उपयोग करें git reset --hard <the-sha-you-want-to-return-to>
अलेक्जेंडर ग्रो

2
संदर्भ को HEAD (केस सेंसिटिव) कहा जाता है
dunni

26
इसके अलावा, सावधान रहें - AFAIK आपको ऐसा नहीं करना चाहिए यदि अन्य लोगों ने रेपो से खींच लिया है।
आमदन

1
@BipinVayalu यह उस शाखा को प्रभावित करता है जिस पर आप वर्तमान में हैं। अधिक ठीक है, सिर। HEAD को अक्सर एक शाखा से "संलग्न" किया जाता है (सीधे किसी ओर इशारा करते हुए एक शाखा के नाम की ओर इशारा करते हुए)। तो, आम तौर पर बोल, यह शाखा को प्रभावित करेगा अंक इंगित करता है। git log --decorate --onelineयह जानने के लिए उपयोग करें कि आपका HEAD कहां इंगित करता है।
अलेक्जेंडर ग्रो

4
git reset HEAD~1यदि आप नहीं चाहते हैं कि आपके परिवर्तन समाप्त हो जाएं (अस्थिर परिवर्तन)। बदलें, प्रतिबद्ध करें और फिर से धक्का देंgit push -f [origin] [branch]
सॉफ्ट्वर

161

आम तौर पर, "उलटा" वचनबद्ध करें,

git revert 364705c

फिर इसे हमेशा की तरह रिमोट पर भेजें:

git push

यह कमिट को डिलीट नहीं करेगा: यह एक अतिरिक्त कमिट बनाता है जो पहले कमिट करता है। कुछ और, वास्तव में सुरक्षित नहीं है, खासकर जब परिवर्तन पहले से ही प्रचारित हो चुके हैं।


9
यह सिकंदर ग्रो (चुने हुए उत्तर) की तुलना में एक सुरक्षित (इस प्रकार शायद बेहतर) उत्तर है।
ग्राक

6
@ क्रेक हर एक समाधान के अपने निहितार्थ और खूबियाँ हैं।
अलेक्जेंडर ग्रो

5
यह स्वीकृत उत्तर होना चाहिए, यह सबसे अच्छा अभ्यास है कि कभी भी इतिहास को अधिलेखित न करें, यहां तक ​​कि अगर एक टीम के साथ सहयोग करना। git resetकेवल तभी स्वीकार किया जाता है यदि आपने अभी भी सर्वर में परिवर्तन को आगे नहीं बढ़ाया है।
1925 में जोस अलेक्जेंडर इबारा

17
@JosueIbarra मैं सभी मामलों के लिए असहमत हूं। अधिकांश मामलों के लिए, हां, आपको इतिहास को अधिलेखित नहीं करना चाहिए। हालांकि, मेरा मानना ​​है कि ऐसे वैध मामले हैं, जहां आपको बिल्कुल करना चाहिए। उदाहरण के लिए, आप गलती से अपनी सीक्रेट फाइल को कमिट कर देते हैं। यह git रेपो में नहीं होना चाहिए। इसलिए आप यहां स्वीकृत उत्तर का उपयोग करके इसे जल्दी से हटा सकते हैं।
bfcoder

11
@bfcoder यदि आपने "गुप्त" को दूरस्थ रेपो में धकेल दिया है, तो यह अब गुप्त नहीं है। और उचित समाधान एक नया रहस्य बनाना है, न कि अपनी गलती को छिपाने की कोशिश करना।
erbsman

41

सबसे पहले, आराम करें।

"कुछ भी हमारे नियंत्रण में नहीं है। हमारा नियंत्रण केवल भ्रम है।", "गलती करने के लिए मानव है"

मुझे लगता है कि आपने अनजाने में अपना कोड धक्का दे दिया है remote-master। यह ठीक होने जा रहा है।

1. सबसे पहले, SHA-1उस प्रतिमान का मूल्य प्राप्त करें जिसे आप वापस करने की कोशिश कर रहे हैं, जैसे कि मास्टर शाखा के लिए प्रतिबद्ध। इसे चलाओ:

git log

आप 'f650a9e398ad9ca606b25513bd4af9fe ...' के हर तरह के कमेंट के साथ तार देखेंगे। उस नंबर को उस कमेट से कॉपी करें जिसे आप वापस करना चाहते हैं

2. अब, नीचे दिए गए कमांड में टाइप करें:

git reset --hard your_that_copied_string_but_without_quote_mark

आपको "HEAD is at" जैसे संदेश को देखना चाहिए। आप स्पष्ट हैं। बस यह किया है कि स्थानीय स्तर पर परिवर्तन को प्रतिबिंबित करें।

3। अब, नीचे कमांड में टाइप करें:

git push -f

आपको देखना चाहिए

"चेतावनी: push.default परेशान है; इसका निहित मूल्य ..... में बदल गया है ... कुल 0 (डेल्टा 0), पुन: उपयोग किया गया 0 (डेल्टा 0) ... ... your_branch_name -> मास्टर (मजबूर अद्यतन) । "

अब, आप सभी स्पष्ट हैं। फिर से "गिट लॉग" के साथ मास्टर की जांच करें, आपका फिक्स्ड_डेस्टिनेशन_काम सूची के शीर्ष पर होना चाहिए।

आपका स्वागत है (अग्रिम में;))

अपडेट करें:

अब, इन सभी को शुरू करने से पहले आपने जो बदलाव किए थे, वे अब चले गए हैं। यदि आप उन कठिन परिश्रमों को फिर से लाना चाहते हैं, तो यह संभव है। Git reflog , और git चेरी-पिक का धन्यवाद कमांड ।

उसके लिए, मैं इस ब्लॉग या इस पोस्ट का अनुसरण करने का सुझाव दूंगा


"git push -f" करते समय रिमोट और ब्रांच को भी निर्दिष्ट करना अच्छा उपाय है, लेकिन "git push -f" वैसे भी ज्यादातर समय काम करेगा
Robson

8

git reset HEAD~1यदि आप नहीं चाहते हैं कि आपके परिवर्तन समाप्त हो जाएं (अस्थिर परिवर्तन)। बदलें, प्रतिबद्ध करें और फिर से धक्का देंgit push -f [origin] [branch]


3

आप एक इंटरैक्टिव रिबेस कर सकते हैं:

git rebase -i <commit>

यह आपके डिफ़ॉल्ट संपादक को लाएगा। बस उस कमिट को हटा दें जिसमें आप उस कमिट को हटाना चाहते हैं।

बेशक, आपको इस परिवर्तन को लागू करने के लिए दूरस्थ रिपॉजिटरी तक पहुंच की आवश्यकता होगी।

यह प्रश्न देखें: Git: चयनित कमिट्स को रिपॉजिटरी से हटा दें


3

प्रयोग करके देखें

git reset --hard <commit id> 

कृपया ध्यान दें: यहाँ पर आप जिस कमिटमेंट में जाना चाहते हैं, उस आईडी का आईडी होगा, लेकिन उस आईडी को नहीं जिसे आप रीसेट करना चाहते हैं। यह एकमात्र बिंदु था जहां मैं भी फंस गया।

फिर धक्का

git push -f <remote> <branch>

2

वैकल्पिक रूप से:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

अंतिम प्रतिबद्ध के माता-पिता के लिए मूल दूरस्थ भंडार की मास्टर शाखा को बाध्य करें

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