2011-06-01 4 views
108

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

remote: 
    master 

local: 
    master 
    feature 

मैं सफलतापूर्वक दूरस्थ करने के लिए वापस मेरी सुविधा शाखा धक्का कर सकते हैं और अंत मैं क्या उम्मीद:

remote: 
    master 
    feature 

local: 
    master 
    feature 

मैं तो फिर से सेटअप शाखा दूरस्थ ट्रैक करने के लिए:

remote: 
    master 
    feature 

local: 
    master 
    feature -> origin/feature 

और सब ठीक है। मैं यहां से क्या करना चाहता हूं, रिमोट पर मास्टर शाखा में फीचर शाखा को रीबेज करना है, लेकिन मैं इसे अपनी स्थानीय मशीन से करना चाहता हूं। मैं ऐसा करने में सक्षम होना चाहता हूं:

git checkout master 
git pull 
git checkout feature 
git rebase master 
git push origin feature 

रिमोट मास्टर के साथ दूरस्थ सुविधा शाखा को अद्यतित रखने के लिए। हालांकि, इस विधि का कारण बनता है Git शिकायत करने के लिए:

To <remote> 
! [rejected]  feature -> feature (non-fast-forward) 
error: failed to push some refs to '<remote>' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

git pull काम कर देता है, लेकिन कारण बनता है किसी मर्ज के लिए प्रतिबद्ध है कि मैं से बचने के लिए चाहते हैं। मुझे चिंतित है कि संदेश feature -> origin/feature के बजाय बताता है लेकिन यह केवल एक प्रेजेंटेशन चीज हो सकता है।

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

+0

मुझे एक ही समस्या थी। मैं एक शाखा रिबेस मॉडल शुरू करना चाहता था ([इस तरह] (http://bit.ly/23T1I7f))। तब मैंने देखा कि मैंने गलती की है: ** यदि आप रीबेज करना चाहते हैं (मास्टर पर रीबेस करने से पहले आपको रिमोट फीचर में अपने बदलावों को धक्का नहीं देना चाहिए) ** तो आप अपनी सुविधा में कुछ कोड प्रतिबद्ध करते हैं। और अब आप इसे अपने रिमोट फीचर पर धक्का देना चाहते हैं। Bevor आप यह करते हैं: - आपको लाने की ज़रूरत है और आपको अपने मास्टर को खींचना चाहिए। - यदि मास्टर में आपके कुछ बदलाव नहीं हैं तो आपको मास्टर पर दोबारा बदलाव करना चाहिए। अब आप सुविधा को दबा सकते हैं और कोई समस्या नहीं होगी। – Markus

उत्तर

141

यह इस बात पर आता है कि इस सुविधा का उपयोग एक व्यक्ति द्वारा किया जाता है या यदि अन्य इसका काम कर रहे हैं।

आप अगर यह सिर्फ तुम हो रिबेस के बाद धक्का मजबूर कर सकते हैं:

git push origin feature -f 

हालांकि, अगर दूसरों उस पर काम कर रहे हैं, आप मर्ज करना चाहिए और गुरु के बंद rebase नहीं।

git merge master 
git push origin feature 

यह सुनिश्चित करेगा कि आपके साथ सहयोग करने वाले लोगों के साथ आपका एक आम इतिहास है।

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

यह branch per feature नामक विषय पर मेरा आलेख है।

उम्मीद है कि इससे मदद मिलती है।

+23

+1 अगर अन्य लोग इस पर काम कर रहे हैं, तो आपको मर्ज करना चाहिए और मास्टर ऑफ रीबेज नहीं करना चाहिए, बेहतर निजी शाखा पर केवल बेहतर इस्तेमाल किया जाना चाहिए। –

+4

गिट पुश मूल सुविधा के लिए alternativ- अगर आप अपनी रिमोट फीचर और पुश फीचर को फिर से हटा सकते हैं तो – Markus

+1

आपकी शाखा में मास्टर विलय करने से विलय प्रतिबद्ध हो जाएगा और आपके परिवर्तनों को धक्का देने के बाद मास्टर से किसी भी अन्य खुली सुविधा शाखा के साथ संघर्ष का कारण बन जाएगा। – Stevus

1

git push पर --force विकल्प का उपयोग करके आप चेक को अक्षम कर सकते हैं (यदि आप वास्तव में सुनिश्चित हैं कि आप क्या कर रहे हैं)।

+11

समस्या यह है कि, मुझे यकीन नहीं है कि मैं वास्तव में जानता हूं कि मैं क्या कर रहा हूं :) – kfb

+0

@r_: कृपया मेरा उत्तर पढ़ें। यह आपकी समझ में आपकी मदद कर सकता है कि आप क्या कर रहे हैं :) – ralphtheninja

4

क्योंकि आप नए master के शीर्ष पर feature रिबेस, अपने स्थानीय featureorigin/feature की एक तेजी से आगे अब और नहीं है। इसलिए, मुझे लगता है कि git push origin +feature कर फास्ट-फॉरवर्ड चेक को ओवरराइड करने के लिए इस मामले में यह बिल्कुल ठीक है। आप भी अपनी config

git config remote.origin.push +refs/heads/feature:refs/heads/feature 

अन्य लोगों origin/feature के शीर्ष पर काम करते हैं में निर्दिष्ट कर सकते हैं, वे इस मजबूर अद्यतन कार्य से प्रभावित हो जाएगा। आप नए master में feature में पुन: प्रयास करने के बजाय विलय करके इससे बच सकते हैं। परिणाम वास्तव में एक तेजी से आगे होगा।

23

अच्छा है कि आपने इस विषय को लाया है।

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

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

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

+0

खराब भाषा के लिए डाउनवॉटेड: http://meta.stackexchange.com/questions/22232/are-expletives-cursing-swear-words-or-vulgar-भाषा-allowed-on-se-sites – Powers