2009-10-06 9 views
8

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

असल में, अभी मेरे पास है:

  D---E---F---G master 

और मैं चाहता हूँ:

   E---G topic 
      /
      D master 

अपने स्थानीय में और (वहाँ केवल एक ही है, कहा जाता है मूल) दूरदराज के भंडार में दोनों होना चाहिए कि ।

इसे पाने का सबसे आसान तरीका कौन सा है?

इसके अलावा, ऐसे अन्य लोग भी हैं जिन्होंने रेपो को क्लोन किया है और जिन्होंने मास्टर शाखा की जांच की है। अगर मैं रिमोट रेपो में ऐसा परिवर्तन करूंगा, तो क्या उनके लिए एक ही राज्य में पहुंचने के लिए 'गिट पुल' काम होगा?

उत्तर

7

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

आप भविष्य में कुछ बिंदु पर योजना बना रहे हैं तो क्या आप शायद भी master और topic के बीच एक नया आम आधार बनाने की है, ताकि जब आप बाद में topic मर्ज करते हैं, आप डॉन 'क्या करना चाहते हैं master में topic विलय करने के लिए master में वापस आने वाले कामों को खो दें। ऐसा करने का सबसे आसान तरीका 'पूर्ववत' प्रतिबद्धता के शीर्ष पर 'रेडो' प्रतिबद्धता है जो master को अपने मूल स्थिति में रीसेट करता है और उस पर शीर्ष topic शाखा का आधार बनाता है।

# checkout master branch (currently at G) 
git checkout master 

# Reset the index to how we want master to look like 
git reset D 

# Move the branch pointer back to where it should be, leaving the index 
# looking like D 
git reset --soft [email protected]{1} 

# Make a commit (D') for the head of the master branch 
git commit -m "Temporarily revert E, F and G" 

# Create the new topic branch based on master. 
# We're going to make it on top of master and the 'undo' 
# commit to ensure that subsequent merges of master->topic 
# or topic->master don't merge in the undo. 
git checkout -b topic 

# Revert the undo commit, making a redo commit (G'). 
git revert HEAD 

एक विकल्प आपके द्वारा किए गए सकता है करता है ई ', एफ' और जी 'अलग से प्रत्येक भाग redoing लेकिन जैसा कि ई, एफ और जी अपने प्रकाशित इतिहास में पहले से ही कर रहे हैं यह शायद अधिक समझ में आता है अगर आप सिर्फ संदर्भ' पूर्ववत करें और कहें कि प्रतिबद्धता पूर्ववत की जा रही है। यह git revert है, वैसे भी।

अनिवार्य रूप से जो आप जानते हैं वह यह है। करता

D -- E -- F -- G -- D'  <-- master 
        \ 
         \ 
         G' <-- topic 

महत्वपूर्ण बातें हैं कि आप इतिहास फिर से लिखा नहीं किया है और विषय मास्टर पर आधारित है तो मर्ज के गलती से किसी भी 'पूर्ववत करें' लागू नहीं होगा। अब आप master और topic दोनों को अपने रिमोट रिपोजिटरी में सुरक्षित रूप से पुश कर सकते हैं।

+0

धन्यवाद, यह वही है जो मैंने अभी किया था (जो मैंने जेफोमी को कुछ टिप्पणियों में भी सुझाया था)। इस पूर्ववत प्रतिबद्धता के कारण इतिहास अब थोड़ा बदसूरत है लेकिन मैं इसके बारे में कुछ भी नहीं कर सकता। – Albert

+0

2 सप्ताह गिट उपयोगकर्ता यहाँ। पहली बार जी टू जी 'की शाखा बनाना आसान नहीं होगा, और फिर' गिट रिवर्ट 'जी से डी, जिसके परिणामस्वरूप डी'? इस तरह आपको कुछ भी पूर्ववत/दोबारा नहीं करना है, जो मुझे बहुत सुरक्षित लगता है। (मैं पहले से ही 'गिट रीसेट' के साथ गड़बड़ होने के कारण अप्राप्य रूप से खो गया संपादन कर चुका हूं।) – bart

+0

@ बार्ट, 'गिट रीफ्लॉग' पर एक नज़र डालें। जिस सामग्री को कम किया गया है और बाद में खराब हो गया है, कम से कम कुछ दिनों के लिए, हमेशा रिफ्लॉग के माध्यम से पुनर्प्राप्त करने योग्य होना चाहिए। हालांकि आप कभी भी उन परिवर्तनों को खो सकते हैं जिन्हें आप कभी भी प्रतिबद्ध नहीं कर पाए। – dubiousjim

4

यदि आप चाहें तो आप अपने इतिहास को फिर से लिख सकते हैं, लेकिन अगर किसी और के पास इतिहास की प्रतियां हैं तो यह एक बुरा विचार है। इस मामले में, आप शायद इंटरैक्टिव रिबेस का उपयोग करेंगे: git rebase -i master topic। यह आपको मास्टर से विषय पर काम करने की एक सूची देगा, जिसमें उनके साथ खेलना है। आपको उस प्रतिबद्धता वाली रेखा को हटाने की आवश्यकता होगी जिसमें आप निकालना चाहते हैं।

उसने कहा, मुझे ज़ोर देना चाहिए कि अगर किसी और के पास यह इतिहास है तो ऐसा करने के लिए यह गैर जिम्मेदार है। आपको इसे अपने केंद्रीय रेपो पर मजबूर करना होगा, और हर किसी को अपने भंडारों को मैच में ठीक करना होगा, परिस्थितियों के आधार पर अपेक्षाकृत सरल या जटिल हो सकता है।

git-rebase man page में "अपस्ट्रीम रीबेस से पुनर्प्राप्त" नामक एक अच्छा अनुभाग है, यदि आप वास्तव में निर्णय लेते हैं, तो इससे निपटने के तरीके पर चर्चा करें।

संपादित करें:

सरल इतिहास के लिए, एक आम परिदृश्य होगा, केंद्रीय रेपो (push -f), अन्य डेवलपर्स के लिए एक गैर fastforward धक्का मजबूर कर के बाद:

    वापस अपने पुराने गुरु अप
  • : git branch -m master master_old
  • अपडेट प्राप्त और मूल से मास्टर को पुन: git remote update origin; git branch master origin/master
  • नया मास्टर पर सभी विषय शाखाओं रिबेस: git rebase --onto master master_old topic

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

+0

ठीक है, उन जानकारी के लिए बहुत बहुत धन्यवाद। तो यह वास्तव में एक समाधान नहीं है क्योंकि मैं इस तरह के बल-धक्का नहीं करना चाहता हूं। इसी तरह के परिणाम प्राप्त करने का सबसे साफ समाधान क्या होगा? जो मुझे लगता है वह अब मास्टर में ई, एफ, जी को वापस करना है, फिर उस राज्य से एक नई शाखा बनाएं और चेरी-ई और जी चुनें। क्या वह स्वाभाविक रूप से करेगा? – Albert

+0

इस तरह के मुद्दों के बिना इतिहास से प्रतिबद्धता को हटाने के लिए * कोई रास्ता नहीं है *। कोई फर्क नहीं पड़ता कि आप क्या करते हैं, आप अपने मास्टर रेफरी को उस प्रतिबद्धता को इंगित करने जा रहे हैं, जिसके इतिहास में मास्टर की पिछली स्थिति नहीं है। – Cascabel

+0

यह इस प्रश्न के आपके नए संस्करण के उत्तर में मुख्य रूप से संबोधित किया गया है, लेकिन आपकी टिप्पणी का उत्तर देने के लिए: इससे कोई फर्क नहीं पड़ता कि आप उस राज्य में कैसे जाते हैं जिसमें आपने मास्टर के इतिहास को फिर से लिखा है। आप अभी भी इसे फिर से लिख लेंगे। यदि आप इन सभी चीजों को * स्थानीय रूप से * करते हैं, तो यह ठीक है। इसे क्लीनअप कहा जाता है। यदि आप उन्हें प्रकाशित काम करने के लिए करते हैं, तो आप चीजों को गड़बड़ कर रहे हैं, एक सार्वजनिक रेपो बनाना कोई भी भरोसा नहीं कर सकता है, आदि – Cascabel

-3

मैं git stash लगता है बस इसे दूर भी छिपा सकते है और फिर से इसे देख कभी नहीं बहुत उपयोगी

है।

+2

आप पहले से ही किए गए परिवर्तनों को रोक नहीं सकते हैं। –

+0

अपने परिवर्तनों को खोए बिना प्रतिबद्धता को पॉप करने के लिए 'गीट रीसेट HEAD ^' का उपयोग करें। – twig

संबंधित मुद्दे