अपने स्वामी को एक पुरानी प्रतिबद्धता में बदलना चाहते हैं, मैं यह कैसे कर सकता हूं?


91

मैं एक पिछली कमिट पर रोलबैक करना चाहता हूं, और फिर उस कोड को प्रकाशित करता हूं, फिर नवीनतम कमेट पर वापस जाता हूं।

तो इसलिए मेरे गुरु एक पुराने कमिट वर्जन की ओर इशारा कर रहे हैं, इसलिए मैं उस वर्जन को पल्सिश कर सकता हूं, फिर मैं उस लेटेस्ट कमिट पर जाना चाहता हूं, जो मैं शुरू में एक था।

मैं यह कैसे कर सकता हूँ?

जवाबों:


99

यदि आप ऐसा करना चाहते हैं और पिछले कमिट में मास्टर को वापस लाएँ:

git checkout master~1            # Checkout previous commit on master
git checkout -b new_master       # Create branch for new master
git branch -D master             # Delete old master
git branch -mv new_master master # Make new_master master

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

git reset --hard master~1        # Reset current branch to one commit ago on master

1
इसलिए एक साल बाद मैं इसे देख रहा हूं और यह सोच रहा हूं कि यह एक भयानक तरीका है। ओह, कम से कम यह समझने में कुछ आसान है।
टायलर ब्रॉक

1
हाँ, यही कारण है कि मैंने उत्थान किया, समझना आसान है, हो सकता है कि आपको बेहतर तरीके से लिंक प्रस्तुत करना चाहिए था?
एंड्रयू एटकिन्सन

1
मुझे SourceTree का उपयोग करके ऐसा ही करना था। प्रक्रिया समान है। 1) वर्तमान मास्टर राज्य के लिए नई शाखा बनाएं, ताकि आप कुछ भी न खोएं। 2) मास्टर को हटाएं 3) वांछित प्रतिबद्ध का चयन करते हुए नई मास्टर ब्रांच बनाएं
डैनिलो गोम्स

क्या होता है इसके बाद हम मास्टर से "हटा" दिया जाता है?
आर्थर कैमसिनी गुसमो

1
रिमोट रेपो होने पर इससे बचना चाहिए। यदि आप करते हैं तो यह कुछ त्रुटियों का कारण बनता है, क्योंकि पहले मास्टर का पता आपके द्वारा हाल ही में बनाए गए नए मास्टर से भिन्न होता है।
मशीगारघाट

59

आपका प्रश्न अस्पष्ट है। मुझे लगता है कि आप जो मांग रहे हैं वह यह है:

git push -f origin $old_commit_id:master

यह क्या करेगा? यह धक्का होगा $old_commit_idकरने के लिए प्रतिबद्ध originके नए प्रमुख के रूप में originकी masterशाखा।

यदि ऐसा है जो आप चाहते थे, तो आपको अपनी स्थानीय masterशाखा को छूने की आवश्यकता नहीं है ।


यह master (non-fast-forward)मेरे लिए विफलता का कारण बना । @jtdubs समाधान काम किया।
बॉबी नॉर्टन

3
बस -fइसे बल देने के लिए पास करें - यद्यपि दूरस्थ रेपो को निषिद्ध करने के लिए कॉन्फ़िगर किया जा सकता है। मैंने जवाब अपडेट कर दिया है।
अरस्तू पगलतज़िस

मेरे लिए काम नहीं करता है, स्वीकार किए जाते हैं जवाब हालांकि
MobileMon

आपने ठीक नहीं कहा कि आप क्या चाहते थे या यह काम क्यों नहीं किया, इसलिए मैं आपको यह नहीं बता सकता कि यह क्यों नहीं हुआ और इसे कैसे बनाया जा सकता था (यदि यह हो सकता है)।
अरस्तू पगलतज़िस

आप इस दृष्टिकोण के साथ पिछले इतिहास को खोते हुए दिखाई देते हैं, मेरे लिए ठीक था। बस इसे बाहर बुला रहा है।
शॉन

43

उपयोग git reset --hard <old commit number>

यह HEAD को इस पुराने कमिट पर रीसेट कर देगा।

इसके अतिरिक्त, आपको git push -f originदूरस्थ रेपो को भी बदलने की आवश्यकता है।


34

यदि आप बलपूर्वक धकेलने से बचना चाहते हैं, तो अपने रेपो को पुरानी कमेटी में वापस कैसे लाएँ और सभी हस्तक्षेप कार्य को संरक्षित करें:

git checkout 307a5cd        # check out the commit that you want to reset to 
git checkout -b fixy        # create a branch named fixy to do the work
git merge -s ours master    # merge master's history without changing any files
git checkout master         # switch back to master
git merge fixy              # and merge in the fixed branch
git push                    # done, no need to force push!

किया हुआ! 307a5cd को अपने रेपो में जो भी कमिटमेंट चाहिए, उसे बदलें।

(मुझे पता है कि पहली दो पंक्तियों को जोड़ा जा सकता है, लेकिन मुझे लगता है कि यह कम स्पष्ट करता है कि क्या चल रहा है)

यहाँ यह रेखांकन है:

c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
        \              /
         '------------'

आप प्रभावी रूप से c3 और c4 को निकालते हैं और अपनी परियोजना को c2 पर सेट करते हैं। हालाँकि, c3 और c4 अभी भी आपकी परियोजना के इतिहास में उपलब्ध हैं यदि आप कभी भी उन्हें फिर से देखना चाहते हैं।


1
यह एक अड़चन के बिना काम किया! यदि आप इसे दूर तक ले आए हैं और इसे पढ़ रहे हैं - तो यह एक गहरी प्रतिबद्धता के लिए मास्टर को वापस लाने का सबसे साफ तरीका है।
ddisqq

मुझे यह समझाने के लिए शब्द नहीं मिल रहे हैं कि मैं आपको इसके लिए कितना प्यार करता हूं, मैं कुछ ठीक करने के लिए शब्दों से परे महान हूं जो मुझे अब 6h के लिए खराब कर दिया था और इससे मुझे बहुत सिरदर्द हुआ। धन्यवाद महोदय!!!!!!!
कोस्तास साकिलादिस

इससे मेरी जान बच गई! धन्यवाद
ब्रैड

9

ऐसा करने के लिए एक प्रतिबद्ध ग्राफ मानते हुए:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                              (master)

आप पहले चेकआउट करना चाहते हैं masterऔर एक शाखा बनाना चाहते हैं जो masterवर्तमान में है:

git checkout master
git branch pointer master

अब इस तरह दिखना चाहिए:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                       (HEAD, master, pointer)

अब जब आप पहले से ही हैं master, तो हम masterशाखा को एक प्रतिबद्ध करने के लिए कहेंगे:

git reset master~1

अब, masterएक स्थान को वापस ले जाना चाहिए, लेकिन pointerशाखा अभी भी सबसे हाल की प्रतिबद्ध है:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|           (HEAD, master)    (pointer)

इस बिंदु पर, आप masterकिसी दूरस्थ, या जहां कभी भी धक्का दे सकते हैं , फिर तेजी से आगे pointerशाखा में वापस मर्ज करते हैं । आप pointerउस बिंदु पर शाखा को मार सकते हैं :

git push origin master
git merge --ff-only pointer
git branch -D pointer

अंतिम :

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|         [ origin/master ]    (HEAD, master)

1
यदि मूल / मास्टर C पर है, तो आपकी वर्तमान शाखा की नोक केgit push origin master साथ विफल हो जाएगा , जो उसके दूरस्थ समकक्ष के पीछे है । आपको -f ध्वज भी पास करना चाहिए।
sassospicco

8

आप बस कर सकते हैं git checkout <commit-id>, आपको जो कुछ भी करने की आवश्यकता है, उसे फिर git checkout masterसे नए कोड में लाने के लिए।

यदि आपको वास्तव में इसे जारी करने के लिए पुराने कोड को संशोधित करने की आवश्यकता है, तो आपको संभवतः:

git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release

इसके अलावा, मैं पर्याप्त प्रवाह की सिफारिश नहीं कर सकता । यह इस सब को काफी आसान बनाता है।


1

पिछले संस्करण में जाने के लिए:

git checkout <version hash>

यहां अपना काम करो और इसे पूरा करो

git commit --amend

गुरु के पास वापस जाने के लिए :

git checkout master


1
यह काम नहीं करेगा। git reset --hardअपनी मास्टर ब्रांच को पुराने कमिट में वापस भेज दिया, इसलिए git checkout masterकुछ नहीं करेंगे।
jtdubs

सच है, सुधार के लिए धन्यवाद। +1 करने के लिए, आप मेरा उत्तर भी निकाल देंगे, लेकिन मुझे लगता है कि यह commit --amendकदम काफी उपयोगी है
पाब्लो फर्नांडीज

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