2010-02-08 16 views
16

मैं git rebase का उपयोग करना चाहता हूं ताकि मास्टर शाखा में एक सुविधा को स्पष्ट रूप से मर्ज कर सकें (कम से कम या कम से कम परिवर्तन लॉग के शीर्ष पर)। ध्यान दें कि मैं केवल पर काम कर रहा हूं।गिट रिबेस को पुश/पुल कैसे करें

Git workflow and rebase vs merge questions पढ़ने के बाद, मैंने पाया git rebase बहुत अच्छा और मीका जैसे मैं रिबेस परिवर्तन बस क्योंकि मैं विभिन्न स्थानों से उन पर काम कर रहा हूँ git push करना चाहते हैं होगा (पूर्व: मेरी नोटबुक, मेरे घर, एक और पीसी कहीं ...)

तो यहाँ दो समाधान (द्वि-दिशात्मक बदसूरत मर्ज करने के लिए) इस प्रकार हैं:

  1. git push -f का प्रयोग बढ़ाने के लिए, और फिर अन्य मशीन पर खींच, लेकिन कैसे सफाई से नवीनतम संस्करण प्राप्त करने अन्य मशीनों पर?
  2. सुविधा शाखा, Git धक्का/खींच, और एक बार परिपक्व, (एक में या एक से अधिक सफाई से करता है) एक एकल रिबेस कर

(2) नीचे जैसा होगा करने के लिए मास्टर परिवर्तन मर्ज करने के लिए विलय का उपयोग करना:

git co -b feature-a 
... change files 
git push origin feature-a 
... moving to another PC 
git pull origin feature-a 
... change files 
git merge master 
... change files (not the "special rebase") 
git rebase master 
git co master 
git merge feature-a 
git branch -d feature-a 
git push origin :feature-a 

आपको लगता है कि कौन सा समाधान काम करेगा? मैंने उनमें से किसी भी कोशिश नहीं की है (ज्यादातर मेरे लॉग को और अधिक गन्दा बनाने के डर से)।

उत्तर

11

याद रखें कि git rebase प्रतिकृतियां बदलती हैं और नई प्रतिबद्धताएं बनाती हैं। रीबेजिंग और फोर्सिंग द्वारा पूरे स्थान पर धक्का देकर, आप टूल के अनाज के खिलाफ जा रहे हैं। ध्यान दें कि कैसे git rebase दस्तावेज की "Recovering from an upstream rebase" धारा (अतिरिक्त बल के साथ) शुरू होता है:

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

भले ही आप एकमात्र डेवलपर हैं, फिर भी आप अन्य क्लोन में काम करते समय अन्य (एक रेपो के परिप्रेक्ष्य से) होंगे। जैसा कि आपने देखा है, यह वर्कफ़्लो एक परेशानी है।

अपने परिवर्तन शाखाओं में पकाएं। जब कोई शाखा प्राइमटाइम के लिए तैयार होती है, तो रीबेस, इसे मास्टर में विलय करें, और इसकी विषय शाखा हटाएं। यदि आप शाखाओं के जीवनकाल को छोटा रखते हैं और उनके दायरे संकीर्ण होते हैं तो आपका जीवन सबसे आसान होगा।

+0

मेरे सुझावों में विकल्प (2) जैसा लगता है। – Wernight

+1

"अपने बदलाव शाखाओं में पकाएं।" मुझे यह टिप्पणी समझ में नहीं आ रही है। वह पहले से ही नए बदलावों के लिए विषय शाखाओं का उपयोग कर रहा है।प्रश्न का दिल यह लगता है कि रिमोट शाखाओं को कैसे गठबंधन करना और आपके आस-पास के हर किसी को परेशान किए बिना रिबेज करना है। –

13

मैं हमेशा यह सुनिश्चित करता हूं कि मैं छोड़कर किसी भी मशीन से सब कुछ करता हूं और धक्का देता हूं (-f)।

जब मैं कुछ अन्य मशीन पर पहुंचने:

git fetch -v 
git checkout mybranch # Already checked out with old HEAD 
git reset --hard origin/mybranch 

यह अच्छी तरह से काम करता है क्योंकि मैं अन्य "मुझे" पता विभिन्न कंप्यूटरों पर लगातार करता है और धक्का इससे पहले कि मैं छोड़ (और इसलिए वहाँ पर कोई unpushed परिवर्तन कर रहे हैं मशीन मैं पहुंचता हूं)

+0

वर्तमान में मैं अपने परिवर्तनों का एक पैच बनाता हूं और पैच को अगली मशीन पर भेजता हूं जिस पर मैं काम कर रहा हूं। मेरा व्यक्तिगत नियम केवल उस कोड को प्रतिबद्ध करना है जो साफ़ रूप से संकलित करता है और सभी परीक्षणों को भी पास करता है। हालांकि यह काफी दर्द है और मैंने आपके दृष्टिकोण के बारे में अक्सर सोचा है। दूसरी तरफ, क्या यह मशीनों पर इतिहास/रीफ्लॉग नहीं है? –

+0

यदि आप किसी और के साथ काम कर रहे हैं तो यह वास्तव में एक बुरा अभ्यास है। 'पुश-एफ' अन्य कहानी को हटा देता है और उन्हें फिर से काम करने के लिए मजबूर करता है। – rvazquezglez

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