एक निश्चित प्रतिबद्ध के लिए रिमोट रीसेट करना


709

मैं प्रतिबद्ध होने के बाद किए गए सभी परिवर्तनों को त्यागना चाहता हूं <commit-hash> । तो मैंने किया:

git reset --hard <commit-hash>

अब मैं अपने रिमोट के साथ भी यही करना चाहता हूं। मैं यह कैसे कर सकता हूँ? मैंने बाद में कुछ कमिट (और पुश) किए हैं <commit-hash>और मैं उन सभी को छोड़ना चाहता हूं। क्या बस कुछ हो गया है बहुत तरह से गलत है और मैं की तुलना में यह पहले से ही है यह बदतर बनाने के लिए नहीं करना चाहती। ; (

मैं मूल रूप से मेरी रिवाइंड करने के लिए चाहते origin/masterकरने के लिए<commit-hash>


3
क्या आप सुनिश्चित हैं कि आपका origin/masterअन्य उपयोगकर्ताओं द्वारा खींचा और धक्का नहीं दिया गया है? एक सार्वजनिक (यानी गैर-स्थानीय) रिपॉजिटरी का इतिहास बदलना आप हर समय बचना चाहते हैं।
विंधिया

जवाबों:


1251

यह मानते हुए कि आपकी शाखा को masterयहां और दूरस्थ रूप से बुलाया जाता है , और यह कि आपका रिमोट originआपको कहा जाता है:

 git reset --hard <commit-hash>
 git push -f origin master

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

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

चूंकि आपके प्रश्न से यह स्पष्ट है कि आपने git reset --hardअपनी masterशाखा को रीसेट करने के लिए पहले ही उपयोग कर लिया है , तो आपको git reset --hard ORIG_HEADअपनी शाखा को वापस उसी स्थान पर ले जाने के लिए उपयोग करने की आवश्यकता हो सकती है जहां वह पहले था। (हमेशा की तरह git reset --hard, सुनिश्चित करें कि git statusवह साफ है, कि आप सही शाखा पर हैं और आपको git reflogखोए हुए कमिट को पुनर्प्राप्त करने के लिए एक उपकरण के रूप में पता है।) आपको ORIG_HEADसही बिंदु के साथ उस बिंदु को भी जांचना चाहिए git show ORIG_HEAD

समस्या निवारण:

यदि आपको एक संदेश मिलता है "" ! [रिमोट अस्वीकृत] a60f7d85 -> मास्टर (पूर्व प्राप्त हुक अस्वीकृत) "

फिर आपको विशिष्ट शाखा के लिए शाखा इतिहास पुनर्लेखन की अनुमति देनी होगी। उदाहरण के लिए BitBucket में यह कहा गया था "शाखा इतिहास को फिर से लिखने की अनुमति नहीं है"। एक चेकबॉक्स है जिसका नाम Allow rewriting branch historyआपको चेक करना है।


21
खतरे का खतरा: यह रीसेट मानता है कि संबंधित ( ट्रैकिंग ) शाखा को वर्तमान में चेक आउट किया गया है और कोई भी अनपेक्षित परिवर्तन नहीं हैं जिन्हें आप रखना चाहते थे। के git update-refबजाय का उपयोग करेंreset --hard ; यह आपको एक कार्यशील पेड़ / चेक आउट शाखा के बिना ऐसा करने की अनुमति देगा
सेह

3
समझा। इसे अन्य लोगों द्वारा धकेला और बदला गया है। इसलिए मुझे उपयोग करना चाहिए revert लेकिन मैं कहता हूं कि मैं पिछले 4 कमिट्स को वापस करना चाहता हूं इसलिए मुझे git revert comit1; git push; git revert comit2; git push; ...या बस करना चाहिए git revert commit4; git push?
nacho4d

1
@ nacho4d: आपको प्रत्येक रिवर्ट के बाद पुश करने की आवश्यकता नहीं है - इस उत्तर में जकुब नारबस्की से क्या करना है, इसका अच्छा विवरण है । आपको प्रत्येक कमिट को पीछे की ओर ले जाने की आवश्यकता है - बस करने git revert commit4से एक नई प्रतिबद्धता बनती है जो केवल उन परिवर्तनों को मिटा देती है जो इसमें शुरू किए गए थे commit4। उत्तर के रूप में मैं बिंदुओं से जुड़ा हुआ हूं, हालांकि, आप इन्हें एक ही कमिट में रोल कर सकते हैं।
मार्क लोंगेयर

1
@ मर्क मैं पहले ही दौड़ चुका हूं, git reset --hardलेकिन मैंने अपने लोकल को डिलीट कर दिया है और फिर से ओरिजिनल से खींच लिया है, इसलिए मैं git revert ...अपना शक अब कर पा रहा हूं: क्या मुझे हर कमिटमेंट और पुश (एक-एक करके) वापस करना है या सिर्फ पहले कमिट के बाद रिवर्ट करना है केवल सही है?
nacho4d

1
@sehe: इसका उपयोग करना मुश्किल है क्योंकि आपको पूर्ण रेफरी नाम का उपयोग करने की आवश्यकता है, और इसलिए लोगों के लिए अपनी .gitनिर्देशिका को रीफ़्स के साथ लिटाना आसान है जो कि उन्हें बनाने का मतलब नहीं था। मैं यह कहना गलत था कि सुरक्षा जांच नहीं हैं, हालांकि। आप गेट मैन पेज में "प्लंबिंग" और "पोर्सिलेन" कमांड में वर्गीकरण पा सकते हैं ।
मार्क लोंगेयर

123

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

यदि आप रिमोट मैच को कमिट करना चाहते हैं जो आपके स्थानीय रेपो में कहीं भी हो:

  1. क्या नहीं किसी भी रीसेट करते हैं।
  2. git logआप जिस रिमोट पर होना चाहते हैं, उसे खोजने के लिए उपयोग करें । git log -pपरिवर्तनों को देखने के लिए, या git log --graph --all --oneline --decorateएक कॉम्पैक्ट पेड़ को देखने के लिए।
  3. यदि यह टिप है, तो कमिट के हैश या उसके टैग या उसकी शाखा के नाम की प्रतिलिपि बनाएँ।
  4. जैसे कोई कमांड चलाएँ:

    git push --force <remote> <commit-ish>:<the remote branch>
    

    जैसे

    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
    

    या

    git push --force staging v2.4.0b2:releases
    

मैं git goचरण 2 में इतिहास देखने के लिए सुविधाजनक उपनाम ( ) का उपयोग करता हूं , जिसे इस तरह जोड़ा जा सकता है:

    git config --global alias.go 'log --graph --all --decorate --oneline'`

3
ग्राफ एक बहुत अच्छा टिप था, मैंने केवल अंतिम n कमिट्स प्राप्त करने के लिए -5 को जोड़ा, यह एक बहुत बड़ा पेड़ था। रीसेट से बचने के लिए बस वही है जो मैं देख रहा था। महान
अलेक्जेंडरड

@AlexanderD आप अपने शेल के बजाय अन्य उपनाम को Git में जोड़ सकते हैं, इसलिए यह हर जगह काम करता है। Git उन उपनामों को समझता है और पूर्ण कमांड से टैब-पूर्ण करता है ताकि आप तर्क जोड़ सकें। git config --global alias.graph 'log --graph --all --decorate --oneline'कम गन्दा है और आप इसे अभी भी सीमित कर सकते हैं, जैसे:git graph -5
Walf

यह पूर्ण है। मैंने हमेशा अपने स्थानीय को गड़बड़ किया है। यह वही था जो मुझे अपने जीवन जीने के लिए अकस्मात धकेलने के बाद चाहिए था :( धन्यवाद!
जेक

1
विंडोज पर, qगिट लॉग से बाहर निकलने के लिए दर्ज करें। 2 मिनट मैं वापस कभी नहीं मिलेगा।
dst3p

1
@ dst3p हर प्लेटफॉर्म पर है, दोस्त। पेजर प्रोग्राम आमतौर पर होता है lessऔर qइसे बाहर निकलने का सामान्य तरीका है। Git Bash एक * nix टर्मिनल की तरह है।
वालफ


13

GitLab पर, आपको ऐसा करने से पहले अपनी शाखा को असुरक्षित रूप से सेट करना पड़ सकता है । आप इसे [रेपो]> सेटिंग्स> रिपॉजिटरी> संरक्षित शाखाओं में कर सकते हैं। फिर मार्क के उत्तर से विधि काम करती है।

git reset --hard <commit-hash>
git push -f origin master

10

यदि आप फ़ाइल का पिछला संस्करण चाहते हैं, तो मैं git चेकआउट का उपयोग करने की सलाह दूंगा।

git checkout <commit-hash>

ऐसा करने से आपको समय पर वापस भेज दिया जाएगा, यह आपकी परियोजना की वर्तमान स्थिति को प्रभावित नहीं करता है, आप मेनलाइन गेटआउट आउटलाइन पर आ सकते हैं

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

git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git push

इसका लाभ यह है कि यह इतिहास को नष्ट नहीं करता है, और न ही किसी विशेष कोड परिवर्तन को वापस करता है (git revert)

यहां और देखें https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout


यह एक उत्कृष्ट उत्तर है: यह काम करता है, अवधि और बहुत सुरक्षित है; यदि आप इसे गड़बड़ करते हैं तो वापस जाना आसान है।
बॉब

8

पिछले उत्तरों के लिए मेरे दो सेंट: यदि

git push --force <remote> <the-hash>:<the remote branch>

अभी भी काम नहीं करता है, आप <your-remote-repo>.git/configफ़ाइल के प्राप्त अनुभाग को संपादित करना चाह सकते हैं :

[receive]
  #denyNonFastforwards = true
  denyNonFastforwards = false

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

2

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

git checkout 000000

(जहां 000000 वह आईडी है जहां आप जाना चाहते हैं) अपनी समस्याग्रस्त शाखा में और फिर बस एक नई शाखा बनाएं:

git रिमोट ऐड [name_of_your_remote]

फिर आप एक नया पीआर बना सकते हैं और सभी ठीक काम करेंगे!


1

एक काम करो, कमिटमेंट एसएचए नं। जैसे 87c9808 और फिर,

  1. अपने आप को स्थानांतरित करें, जो कि निर्दिष्ट वचन के लिए आपका सिर है (git रीसेट करने से - भार 89cef43 // यहां अपनी संख्या का उल्लेख करें)
  2. इसके बाद एक रैंडम फाइल में कुछ बदलाव करें, ताकि git आपसे स्थानीय स्तर पर कमिटमेंट करने को कहे और फिर इस प्रकार, आपको अब क्या करने की जरूरत है। परिवर्तन लागू करने के बाद कमिट-ए-एम "ट्रायल कमिट"
  3. अब निम्नलिखित पुश पुश (यदि यह स्थानीय रूप से प्रतिबद्ध किया गया है) गिट पुश ऑरिजिनल मास्टर द्वारा
  4. अब जो तुमसे पूछेगा, वह है

त्रुटि: ' https://github.com/YOURREPOSITORY/AndroidExperiments.git ' संकेत के कुछ संदर्भों को आगे बढ़ाने में विफल : अपडेट अस्वीकार कर दिए गए क्योंकि आपकी वर्तमान शाखा का टिप संकेत के पीछे है: इसका दूरस्थ समकक्ष। फिर से पुश करने से पहले दूरस्थ परिवर्तनों (जैसे संकेत: 'गिट पुल ...') को एकीकृत करें।

  1. इस प्रकार अब आप क्या कर सकते हैं

git push --force origin master

  1. और इस प्रकार, मुझे आशा है कि यह काम करेगा :)

1

Sourcetree: एक निश्चित प्रतिबद्ध के लिए रिमोट रीसेट करना

  1. यदि आपने अपने रिमोट (मूल / फ़ीचर / 1337_MyAwesomeFeature) की तरह एक खराब कमिट को धक्का दिया है

रिमोट पर जाएं

  1. रीमोट्स> मूल> फ़ीचर> 1337_MyAwesomeFeature पर जाएं
  2. राइट क्लिक करें और "डिलीट ओरिजिन / फ़ीचर / 1337_म्यवेरिफायरचर" चुनें (या बैकअप या स्किप स्टेप 4. चाहते हैं तो इसका नाम बदलें)
  3. "फोर्स डिलीट" और "ओके" पर क्लिक करें।

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

  1. अपनी पुरानी कमेटी का चयन करें और "वर्तमान कमेटी को इस कमेट के लिए रीसेट करें" चुनें
  2. चुनें कि आपको कौन सा मोड चाहिए (हार्ड यदि आप अपने अंतिम परिवर्तन नहीं चाहते हैं) और "ओके"।

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

  1. इसे एक नए मूल / सुविधा / 1337_MyAwesomeFeature के लिए प्रतिबद्ध करें यहां छवि विवरण दर्ज करें

  2. आपकी स्थानीय सुविधा शाखा और आपकी दूरस्थ सुविधा शाखा अब आपकी (आपकी पसंद की) प्रतिबद्ध हैं यहां छवि विवरण दर्ज करें

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