git - क्या मैं एक गिट प्रतिबद्धता हटा सकता हूं लेकिन परिवर्तनों को रख सकता हूं




undo git-reset (5)

इसे संभालने के दो तरीके हैं। जो आसान है आपकी स्थिति पर निर्भर करता है

रीसेट

यदि आप जिस प्रतिबद्धता से छुटकारा पाना चाहते हैं वह आखिरी प्रतिबद्धता थी, और आपने कोई अतिरिक्त काम नहीं किया है तो आप आसानी से git-reset उपयोग कर सकते हैं

git reset HEAD^

अपने वर्तमान सिर से ठीक पहले अपनी शाखा को प्रतिबद्धता में ले जाता है। हालांकि, यह वास्तव में आपके काम करने वाले पेड़ में फ़ाइलों को नहीं बदलता है। नतीजतन, उस प्रतिबद्धता में किए गए परिवर्तन संशोधित के रूप में दिखाई देते हैं - यह 'असामान्य' कमांड की तरह है। असल में, मेरे पास ऐसा करने के लिए उपनाम है।

git config --global alias.uncommit 'reset HEAD^'

फिर आप एक प्रतिबद्धता का बैक अप लेने के लिए भविष्य में git uncommit उपयोग कर सकते हैं।

कुचलने

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

git rebase -i <ref>

मैं उपरोक्त कहता हूं क्योंकि मैं इसे स्पष्ट करना चाहता हूं कि यह किसी भी संख्या में वापस आ सकता है। git log चलाएं और उस प्रतिबद्धता को ढूंढें जिसे आप छुटकारा पाने के लिए चाहते हैं, इसके SHA1 की प्रतिलिपि बनाएँ और इसके स्थान पर इसका उपयोग करें। गिट आपको इंटरैक्टिव रीबेस मोड में ले जाएगा। यह आपके वर्तमान राज्य और जो भी आपने किया है, के बीच सभी काम दिखाएगा। तो अगर 10 मिनट पहले है, तो यह आपको सभी 10 काम दिखाएगा।

प्रत्येक प्रतिबद्धता के सामने, इसमें शब्द pick । उस प्रतिबद्धता को ढूंढें जिसे आप छुटकारा पाने के लिए चाहते हैं और इसे pick या squash से बदल दें। fixup का उपयोग करना केवल संदेश देता है जो संदेश देता है और सूची में अपने तत्काल पूर्ववर्ती में परिवर्तन विलय करता है। squash कीवर्ड एक ही चीज़ करता है, लेकिन आपको नए संयुक्त प्रतिबद्धता के प्रतिबद्ध संदेश को संपादित करने की अनुमति देता है।

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

चेतावनी:

रीबेजिंग इतिहास को संशोधित करता है - ऐसा कुछ भी करने के लिए करें जो आपने पहले ही अन्य डेवलपर्स के साथ साझा किया है।

stashing

भविष्य में, इस समस्या से बचने के लिए अस्थायी रूप से असामान्य काम को स्टोर करने के लिए git stash का उपयोग करने पर विचार करें।

git stash save 'some message'

यह आपके मौजूदा परिवर्तनों को आपकी स्टैश सूची में तरफ से स्टोर करेगा। ऊपर स्टैश कमांड का सबसे स्पष्ट संस्करण है, जो कि आप जो छेड़छाड़ कर रहे हैं उसका वर्णन करने के लिए एक टिप्पणी के लिए अनुमति देता है। आप बस git stash भी चला सकते हैं और कुछ भी नहीं, लेकिन कोई संदेश संग्रहीत नहीं किया जाएगा।

आप अपनी स्टैश सूची ब्राउज़ कर सकते हैं ...

git stash list

यह आपको अपने सभी स्टैश दिखाएगा, किस शाखाओं पर वे किया गया था, और संदेश और प्रत्येक पंक्ति की शुरुआत में, और उस छिद्र के लिए पहचानकर्ता जो इस [email protected]{#} तरह दिखता है [email protected]{#} जहां # [email protected]{#} की सरणी में इसकी स्थिति है ।

एक स्टैश को पुनर्स्थापित करने के लिए (जिसे किसी भी शाखा पर किया जा सकता है, भले ही स्टैश मूल रूप से बनाया गया था) आप बस चलाते हैं ...

git stash apply [email protected]{#}

फिर, वहां # स्टैश की सरणी में स्थिति है। यदि आप जिस स्टैश को पुनर्स्थापित करना चाहते हैं वह 0 स्थिति में है - यानी, अगर यह सबसे हालिया छिद्र था। फिर आप केवल स्टैश स्थिति निर्दिष्ट किए बिना कमांड चला सकते हैं, गिट का मानना ​​है कि आपका मतलब अंतिम है: git stash apply

इसलिए, उदाहरण के लिए, यदि मैं खुद को गलत शाखा पर काम कर रहा हूं - मैं आदेशों का निम्नलिखित अनुक्रम चला सकता हूं।

git stash
git checkout <correct_branch>
git stash apply

आपके मामले में आप शाखाओं के चारों ओर थोड़ा और स्थानांतरित हो गए, लेकिन वही विचार अभी भी लागू होता है।

उम्मीद है की यह मदद करेगा।

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

अब जब मैं डेमो के साथ काम करता हूं और अपनी विकास शाखा पर काम करने के लिए वापस आ जाता हूं, तो मैं अपने द्वारा किए गए परिवर्तनों को संरक्षित करते हुए "अस्थायी प्रतिबद्धता" को हटाना चाहता हूं। क्या यह संभव है?


ऐसा करने का एक और तरीका।

अस्थायी प्रतिबद्धता के शीर्ष पर प्रतिबद्धता जोड़ें और फिर करें:

git rebase -i

दो प्रतिबद्धताओं को एक में मर्ज करने के लिए (कमांड स्पष्ट निर्देशों के साथ टेक्स्ट फ़ाइल खोल देगा, इसे संपादित करें)।


मुझे लगता है कि आप इसकी तलाश में हैं

गिट रीसेट - सॉफ्ट हेड ~ 1

यह आपको पिछले प्रतिबद्धता पर ले जाएगा और आपके द्वारा किए गए परिवर्तनों को बनाए रखेगा।


मेरे मामले में, मैं पहले से ही रेपो को धक्का दिया। आउच!

अपनी स्थानीय फाइलों में बदलाव करके आप एक विशिष्ट प्रतिबद्धता वापस कर सकते हैं:

git revert -n <sha>

इस तरह मैं उन परिवर्तनों को रखने में सक्षम था जो मुझे चाहिए और एक प्रतिबद्धता को कम कर दिया गया था जिसे पहले से ही धक्का दिया गया था।


हां, आप परिवर्तनों को हटाए बिना अपनी प्रतिबद्धता को हटा सकते हैं: गिट रीसेट @ ~





git-reset