मैंने अभी गलत शाखा के लिए पूरी तरह से अच्छा प्रतिबद्ध किया है। मैं अपनी मास्टर शाखा में अंतिम रूप से कैसे कर सकता हूं और फिर उन्हीं परिवर्तनों को ले कर उन्हें अपनी अपग्रेड शाखा में प्राप्त कर सकता हूं?
मैंने अभी गलत शाखा के लिए पूरी तरह से अच्छा प्रतिबद्ध किया है। मैं अपनी मास्टर शाखा में अंतिम रूप से कैसे कर सकता हूं और फिर उन्हीं परिवर्तनों को ले कर उन्हें अपनी अपग्रेड शाखा में प्राप्त कर सकता हूं?
जवाबों:
यदि आपने अभी तक अपने परिवर्तनों को आगे नहीं बढ़ाया है, तो आप एक सॉफ्ट रीसेट भी कर सकते हैं:
git reset --soft HEAD^
यह कमिट करेगा, लेकिन प्रतिबद्ध बदलावों को वापस अपने सूचकांक में डाल देगा। यह मानते हुए कि शाखाएं एक-दूसरे के संबंध में अपेक्षाकृत अद्यतित हैं, git आपको दूसरी शाखा में एक चेकआउट करने देगा, जिसके द्वारा आप बस प्रतिबद्ध कर सकते हैं:
git checkout branch
git commit
नुकसान यह है कि आपको अपने प्रतिबद्ध संदेश को फिर से दर्ज करने की आवश्यकता है।
git reset --soft HEAD\^
विषय पर 4 साल की देरी, लेकिन यह किसी के लिए उपयोगी हो सकता है।
यदि आप मास्टर करने से पहले एक नई शाखा बनाना भूल गए हैं और सभी को प्रतिबद्ध किया है, तो चाहे आप कितने भी काम करें, निम्नलिखित कार्य आसान हैं:
git stash # skip if all changes are committed
git branch my_feature
git reset --hard origin/master
git checkout my_feature
git stash pop # skip if all changes were committed
अब आपके पास आपकी मास्टर शाखा बराबर है origin/master
और सभी नए आवागमन चालू हैं my_feature
। ध्यान दें कि my_feature
एक स्थानीय शाखा है, रिमोट नहीं।
master
, फिर रीसेट कर सकते हैंmaster
कर सकते हैं origin/master
।
origin/master
पहले से ही आप जिस पर रीसेट करना चाहते हैं , वह पहले से ही है! हालांकि टिप का श्रेय इस पृष्ठ को है: github.com/blog/…
एक कमबैक करने के लिए (सुनिश्चित करें कि आप अगले चरण के लिए कमिट का हैश नोट करते हैं):
git reset --hard HEAD^
एक अलग शाखा में उस कमिट को खींचने के लिए:
git checkout other-branch
git cherry-pick COMMIT-HASH
यह भी ध्यान दें कि आपके द्वारा किए जा सकने वाले किसी भी अनियोजित और संशोधित परिवर्तनोंgit reset --hard
को मार देगा , इसलिए यदि आपके पास वे हैं जो आप पसंद कर सकते हैं:
git reset HEAD^
git checkout .
git rev-parse BRANCH_NAME
शा को पाने के लिए।
git reflog show <branch>
!
git stash
रीसेट करने से पहले और git stash pop
बाद में उन्हें पुनर्स्थापित करने के लिए उपयोग कर सकता है, इसलिए --hard
भाग से डरने की कोई आवश्यकता नहीं है
यदि आपने पहले से ही अपने बदलावों को आगे बढ़ाया है, तो आपको HEAD को रीसेट करने के बाद अपने अगले पुश को लागू करने की आवश्यकता होगी।
git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force
चेतावनी: एक हार्ड रीसेट आपके काम करने की नकल में किसी भी तरह के संशोधन को पूर्ववत कर देगा, जबकि एक बल धक्का स्थानीय शाखा की वर्तमान स्थिति के साथ दूरस्थ शाखा की स्थिति को पूरी तरह से अधिलेखित कर देगा।
बस मामले में, विंडोज पर (विंडोज कमांड लाइन का उपयोग करते हुए, बैश नहीं) यह वास्तव ^^^^
में एक के बजाय चार है , इसलिए यह है
git reset --hard HEAD^^^^
git reset --hard COMMIT_HASH
git push --force
मैंने हाल ही में वही किया, जहां मैंने गलती से मास्टर में बदलाव किया, जब मुझे दूसरी शाखा के लिए प्रतिबद्ध होना चाहिए था। लेकिन मैंने कुछ भी धक्का नहीं दिया।
यदि आप सिर्फ गलत शाखा के लिए प्रतिबद्ध हैं, और तब से कुछ भी नहीं बदला है, और रेपो को धक्का नहीं दिया है, तो आप निम्नलिखित कार्य कर सकते हैं:
// rewind master to point to the commit just before your most recent commit.
// this takes all changes in your most recent commit, and turns them into unstaged changes.
git reset HEAD~1
// temporarily save your unstaged changes as a commit that's not attached to any branch using git stash
// all temporary commits created with git stash are put into a stack of temporary commits.
git stash
// create other-branch (if the other branch doesn't already exist)
git branch other-branch
// checkout the other branch you should have committed to.
git checkout other-branch
// take the temporary commit you created, and apply all of those changes to the new branch.
//This also deletes the temporary commit from the stack of temp commits.
git stash pop
// add the changes you want with git add...
// re-commit your changes onto other-branch
git commit -m "some message..."
नोट: उपरोक्त उदाहरण में, मैं 1 रीसेट कर रहा था git रीसेट HEAD ~ 1 के साथ। लेकिन अगर आप n कमिट्स को रिवाइंड करना चाहते हैं, तो आप HEAD ~ n को रीसेट कर सकते हैं।
इसके अलावा, यदि आपने गलत शाखा के लिए प्रतिबद्ध किया है, और यह भी समाप्त कर दिया है कि गलत शाखा के लिए प्रतिबद्ध होने से पहले आपको कुछ और कोड लिखना है, तो आप अपने इन-प्रोग्रेस कार्य को बचाने के लिए गिट स्टैश का उपयोग कर सकते हैं:
// save the not-ready-to-commit work you're in the middle of
git stash
// rewind n commits
git reset HEAD~n
// stash the committed changes as a single temp commit onto the stack.
git stash
// create other-branch (if it doesn't already exist)
git branch other-branch
// checkout the other branch you should have committed to.
git checkout other-branch
// apply all the committed changes to the new branch
git stash pop
// add the changes you want with git add...
// re-commit your changes onto the new branch as a single commit.
git commit -m "some message..."
// pop the changes you were in the middle of and continue coding
git stash pop
नोट: मैंने इस वेबसाइट को एक संदर्भ के रूप में इस्तेमाल किया https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/
git checkout -b new_branch
वहाँ से बस एक अधिकार कर लिया, कमेंट्स बरकरार थे, बस धकेले गए, और एक पीआर बनाया, didn ' t फिर से कमिट करना है
इसलिए यदि आपका परिदृश्य यह है कि आप प्रतिबद्ध हैं, master
लेकिन करने के लिए प्रतिबद्ध है another-branch
(जो पहले से मौजूद हो सकता है या नहीं भी हो सकता है) लेकिन आपने अभी तक धक्का नहीं दिया है, तो इसे ठीक करना बहुत आसान है।
// if your branch doesn't exist, then add the -b argument
git checkout -b another-branch
git branch --force master origin/master
अब आपके सभी काम master
चालू होंगे another-branch
।
प्यार से शोक: http://haacked.com/archive/2015/06/29/git-migrate/
another-branch
पहले से मौजूद है। इस मामले में, मैंने उन कमिट्स को nuked किया जिन्हें मैंने मास्टर करने के लिए बनाया था और उन्हें नहीं डाला another-branch
।
पर विस्तार करने के लिए इस सवाल का जवाब, मामले में आप से स्थानांतरित करने, जैसे कई करता है develop
करने के लिए new_branch
:
git checkout develop # You're probably there already
git reflog # Find LAST_GOOD, FIRST_NEW, LAST_NEW hashes
git checkout new_branch
git cherry-pick FIRST_NEW^..LAST_NEW # ^.. includes FIRST_NEW
git reflog # Confirm that your commits are safely home in their new branch!
git checkout develop
git reset --hard LAST_GOOD # develop is now back where it started
यदि आपके लिए, यह सिर्फ 1 कमिट है, तो बहुत सारे अन्य आसान रीसेटिंग समाधान उपलब्ध हैं। मेरे लिए, मेरे पास master
इसके बजाय गलती से किए गए 10 कमिट थे, चलो इसे कॉल करें branch_xyz
, और मैं प्रतिबद्ध इतिहास को खोना नहीं चाहता था।
आप क्या कर सकते हैं, और जो मुझे बचाया था वह इस जवाब को एक संदर्भ के रूप में उपयोग कर रहा था , एक 4 कदम प्रक्रिया का उपयोग करके, जो है -
master
branch_xyz
master
यहाँ विवरण में उपरोक्त चरण हैं -
एक नई शाखा बनाएँ master
(जहाँ मैंने गलती से बहुत सारे बदलाव किए थे)
git checkout -b temp_branch_xyz
नोट: -b
ध्वज का उपयोग एक नई शाखा बनाने के लिए किया जाता है।
यदि हमें यह अधिकार मिला है तो सत्यापित करने के लिए, git branch
हम यह सुनिश्चित करने के लिए एक त्वरित करेंगे कि हम temp_branch_xyz
शाखा पर हैं और git log
यह जांचने के लिए कि हमें कमिट्स सही मिले।
अस्थायी शाखा को मूल रूप से कमिट्स के लिए अभिप्रेत शाखा में मिलाएं branch_xyz
।
सबसे पहले, मूल शाखा पर स्विच करें branch_xyz
( यानी git fetch
अगर आपको ऐसा करने की आवश्यकता हो सकती है )
git checkout branch_xyz
नोट:-b
अब ध्वज का उपयोग नहीं कर रहे हैं , चलिए उस अस्थायी शाखा को उस शाखा में मिलाते हैं जिसे हमने वर्तमान में चेकआउट किया हैbranch_xyz
git merge temp_branch_xyz
हो सकता है कि आपको यहाँ कुछ संघर्षों का ध्यान रखना पड़े। सफलतापूर्वक विलय के बाद आप (मैं) धक्का दे सकते हैं या अगले चरणों में जा सकते हैं।
इस उत्तर को संदर्भ के रूप में master
उपयोग करने पर आकस्मिक रूप से, पहले स्विच पर जाएँmaster
git checkout master
फिर इसे रिमोट से मिलान करने के लिए सभी तरीके से पूर्ववत करें (या यदि आप चाहें तो विशेष रूप से प्रतिबद्ध करें)
git reset --hard origin/master
फिर से, मैं git log
पहले और बाद में यह सुनिश्चित करने के लिए करूँगा कि इच्छित परिवर्तन प्रभावी हुए।
सबूत मिटाते हुए, जो अस्थायी शाखा को हटा रहा है। इसके लिए, पहले आपको उस शाखा की जाँच करने की आवश्यकता है जिसे अस्थायी में मिला दिया गया था, अर्थात branch_xyz
(यदि आप master
नीचे रहते हैं और नीचे दिए गए कमांड को निष्पादित करते हैं, तो आपको मिल सकता है error: The branch 'temp_branch_xyz' is not fully merged
), तो चलिए
git checkout branch_xyz
और फिर इस दुर्घटना के सबूत को हटा दें
git branch -d temp_branch_xyz
तुम वहाँ जाओ।
यदि वह शाखा जिसे आप अपने परिवर्तनों को पहले से ही लागू करना चाहते थे ( उदाहरण के लिए शाखा विकास ) , तो नीचे दिए गए फोटान द्वारा दिए गए निर्देशों का पालन करें :
git checkout develop
git rebase develop my_feature # applies changes to correct branch
git checkout develop # 'cuz rebasing will leave you on my_feature
git merge develop my_feature # will be a fast-forward
git branch -d my_feature
और जाहिर है अगर आप चाहते थे तो आप my_feature के बजाय tempbranch या किसी अन्य शाखा के नाम का उपयोग कर सकते थे।
साथ ही, यदि लागू हो, तो अपने लक्ष्य शाखा में विलीन होने के बाद स्टैश पॉप (लागू) में देरी करें।
मेरे लिए, यह मेरे द्वारा धकेल दी गई प्रतिबद्धता को वापस लेने के द्वारा हल किया गया था, फिर उस शाखा को दूसरी शाखा में ले जाना।
git checkout branch_that_had_the_commit_originally
git revert COMMIT-HASH
git checkout branch_that_was_supposed_to_have_the_commit
git cherry pick COMMIT-HASH
आप git log
सही हैश का पता लगाने के लिए उपयोग कर सकते हैं , और आप जब चाहें इन परिवर्तनों को आगे बढ़ा सकते हैं!