hub - integrate git bash with visual studio code




गिट इतिहास में आप एक विशिष्ट संशोधन कैसे हटाते हैं? (6)

अब तक सभी उत्तरों पिछली चिंता का समाधान नहीं करते हैं:

क्या एक कुशल तरीका है जब हटाए जाने के बाद सैकड़ों संशोधन होते हैं?

कदमों का पालन करें, लेकिन संदर्भ के लिए, आइए निम्नलिखित इतिहास मान लें:

[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]

सी : हटाए जाने के लिए प्रतिबद्ध प्रतिबद्धता का पालन करें (साफ)

आर : हटाने के लिए प्रतिबद्धता

बी : हटाने के पहले प्रतिबद्धता से पहले प्रतिबद्ध (आधार)

"सैकड़ों संशोधन" बाधा के कारण, मैं निम्नलिखित पूर्व-शर्तों को मान रहा हूं:

  1. कुछ शर्मनाक प्रतिबद्धता है कि आप कभी अस्तित्व में नहीं रहना चाहते हैं
  2. ज़ीरो बाद में काम करता है जो वास्तव में उस शर्मनाक प्रतिबद्धता पर निर्भर करता है (वापसी पर शून्य संघर्ष)
  3. आपको परवाह नहीं है कि आपको सैकड़ों हस्तक्षेप करने वाले कामों के 'कमिटर' के रूप में सूचीबद्ध किया जाएगा ('लेखक' संरक्षित किया जाएगा)
  4. आपने कभी भंडार साझा नहीं किया है
    • या आप वास्तव में उन सभी लोगों पर पर्याप्त प्रभाव डालते हैं जिन्होंने कभी भी उस नए प्रतिबद्धता का उपयोग करने के लिए उन्हें मनाने के लिए उस प्रतिबद्धता के साथ इतिहास को क्लोन किया है
    • और आपको इतिहास लिखने की परवाह नहीं है

यह बाधाओं का एक बहुत ही सीमित सेट है, लेकिन एक दिलचस्प जवाब है जो वास्तव में इस कोने मामले में काम करता है।

यहां दिए गए कदम हैं:

  1. git branch base B
  2. git branch remove-me R
  3. git branch save
  4. git rebase --preserve-merges --onto base remove-me

यदि वास्तव में कोई संघर्ष नहीं है, तो इसे आगे और बाधाओं के साथ आगे बढ़ना चाहिए। यदि संघर्ष हैं, तो आप उन्हें हल कर सकते हैं और rebase --continue शर्मिंदा हो सकते हैं या शर्मिंदगी और rebase --abort साथ बस रहने का फैसला कर सकते हैं।

अब आप master पर होना चाहिए जो अब इसमें आर प्रतिबद्ध नहीं है। यदि आप मेल-मिलाप करना चाहते हैं तो save शाखा उस बिंदु पर इंगित करती है जहां आप पहले थे।

आप अपने नए इतिहास में हर किसी के स्थानांतरण की व्यवस्था कैसे करना चाहते हैं आप पर निर्भर है। आपको stash , reset --hard और cherry-pick परिचित होना cherry-pick । और आप base हटा सकते हैं, remove-me , और शाखाओं को save हैं

मान लीजिए कि आपका गिट इतिहास इस तरह दिखता है:

1 2 3 4 5

1-5 अलग संशोधन हैं। 1, 2, 4 और 5 रखते हुए आपको 3 को हटाने की आवश्यकता है। यह कैसे किया जा सकता है?

क्या एक कुशल तरीका है जब हटाए जाने के बाद सैकड़ों संशोधन होते हैं?


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

मैंने सफलतापूर्वक इस स्क्वैश तकनीक का उपयोग किया है, लेकिन पहले कभी संशोधन को हटाने की आवश्यकता नहीं है। "स्प्लिटिंग कमेट्स" के तहत गिट-रीबेस दस्तावेज़ों को आशा है कि आपको इसे समझने के लिए पर्याप्त विचार दें। (या किसी और को पता हो सकता है)।

गिट दस्तावेज से :

इसे सबसे पुरानी प्रतिबद्धता के साथ शुरू करें जिसे आप बनाए रखना चाहते हैं:

git rebase -i <after-this-commit>

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

pick deadbee The oneline of this commit
pick fa1afe1 The oneline of the next commit
...

ऑनलाइन विवरण पूरी तरह से आपकी खुशी के लिए हैं; गिट-रीबेज उन्हें नहीं देखेगा लेकिन इस उदाहरण में प्रतिबद्ध नाम ("डेडबी" और "fa1afe1" पर), इसलिए नामों को हटाएं या संपादित न करें।

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

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


जैसा कि गिट-रिबेस (1) से पहले उल्लेख किया गया है आपका मित्र है। मान लें कि काम आपकी master शाखा में हैं, आप करेंगे:

git rebase --onto master~3 master~2 master

पहले:

1---2---3---4---5  master

बाद:

1---2---4'---5' master

गिट-रिबेस से (1):

रीबेज के साथ कई प्रकार की गतिविधियों को भी हटाया जा सकता है। यदि हमारे पास निम्न स्थितियां हैं:

E---F---G---H---I---J  topicA

फिर आदेश

git rebase --onto topicA~5 topicA~3 topicA

परिणामस्वरूप एफ और जी को हटाने का परिणाम होगा:

E---H'---I'---J'  topicA

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


तो यहां वह परिदृश्य है जिसे मैंने सामना किया, और मैंने इसे कैसे हल किया।

[branch-a]

[Hundreds of commits] -> [R] -> [I]

यहां R प्रतिबद्ध है जिसे मुझे हटाने की जरूरत है, और I एक ही प्रतिबद्धता है जो R बाद आता है

मैंने एक वापसी की प्रतिबद्धता बनाई और उन्हें एक साथ squashed

git revert [commit id of R]
git rebase -i HEAD~3

इंटरैक्टिव रिबेस स्क्वैश के दौरान पिछले 2 काम करता है।


यदि आप बस इतना करना चाहते हैं कि संशोधन 3 में किए गए परिवर्तनों को हटा दें, तो आप गिट रिवर्ट का उपयोग करना चाहेंगे।

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

इसका क्या अर्थ है, यह है कि आप अवांछित प्रतिबद्धता और उन परिवर्तनों को हटाते हुए प्रतिबद्धता दोनों के बारे में जानकारी बरकरार रखते हैं।

यदि संभवतः किसी ने आपके भंडार से किसी भी समय खींच लिया है, तो यह शायद अधिक अनुकूल है, क्योंकि वापसी मूल रूप से केवल मानक प्रतिबद्धता है।


राडो और करीम के उत्तर मेरे लिए कुछ नहीं करते हैं (केवल संदेश "वर्तमान शाखा अद्यतित है।" प्रकट होता है)। संभवतः ऐसा इसलिए होता है क्योंकि '^' प्रतीक विंडोज कंसोल में काम नहीं करता है। हालांकि, this टिप्पणी के अनुसार, '~' द्वारा '^' को प्रतिस्थापित करने से समस्या हल हो जाती है।

git rebase --onto <commit-id>^ <commit-id>




git