2013-02-12 17 views
11

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

मैंने सोचा था कि मुझे लगता है कि समस्या का समाधान मिल गया था:

  1. मैं एक अलग "देव" शाखा बना सकते हैं और सभी मध्यवर्ती प्रतिबद्ध हैं।

  2. कोड एक बार अच्छी स्थिति में है, तो मास्टर के लिए विलय करें। तो मास्टर में "इंटरमीडिएट" नहीं होता है लेकिन केवल "सामान्य" होता है।

  3. सभी मध्यवर्ती प्रतिबद्धताओं के साथ "देव" शाखा हटाएं।

लेकिन यह काम नहीं करता है। जब मैं विलय करता हूं, न केवल विलय प्रतिबद्धता मास्टर में शामिल होती है, बल्कि सभी "मध्यवर्ती" भी "देव" शाखा से होती है। इसलिए "देव" शाखा को हटाने से कुछ भी नहीं मिलता है, इसकी "मध्यवर्ती" वहां रहती है।

तो प्रश्न यह है: क्या यह संभव है कि मास्टर में केवल अपनी खुद की प्रतिबद्धता + विलय प्रतिबद्धता शामिल हो और दूसरी शाखा से काम शामिल न हो? यदि यह असंभव है, तो क्या आप मुझे सलाह दे सकते हैं कि मेरे लक्ष्य को कैसे प्राप्त किया जाए - इंटरमीडिएट परिणामों को अस्थायी रूप से सहेजने की क्षमता रखने के बाद भी उन्हें बाद में हटा दें?

उत्तर

16

जब आप गुरु में अपने "देव" शाखा विलय, कोशिश

git checkout master 
git merge --squash dev 
git commit -m "Add new feature." 

--squash विकल्प एक बड़ा परिवर्तन में अपने मध्यवर्ती सभी परिवर्तनों को छुटकारा पाने होगा।

यदि आपको अधिक सीमित नियंत्रण की आवश्यकता है तो आप git rebase --interactive का उपयोग भी कर सकते हैं (उदा।, reordering commits और एकाधिक छोटे स्क्वैश कर रहे हैं)। This answergit merge --squash और git rebase --interactive के बीच अंतर बताता है।

+0

स्क्वैश एक अच्छा विचार है कि वह इन डेवलपर्स को अन्य डेवलपर्स के साथ साझा कर रहा है? 'गीट रिबेस -आई' का उल्लेख करने के लिए – jszakmeister

+1

+1। तब लोग * वास्तव में * स्थानीय देव शाखा के बारे में नहीं जानते। –

+1

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

-1

आप विलय के दौरान काम नहीं हटा सकते हैं। आप इंटरमीडिएट कमेट्स को स्क्वैश कर सकते हैं लेकिन यह एक बुरा विचार है जो संभवतः आपके लिए प्रकाशित नहीं होगा जैसा कि आप उन्हें प्रकाशित करते हैं। आप उन्हें मर्ज करने के बिना मास्टर शाखा में भी स्क्वैश कर सकते हैं (git merge --squashgit commit के बाद) मास्टर शाखा को देव शाखा में विलय करें।

+0

कृपया अपने डाउनवोट को समझाएं। – wRAR

2

क्या आप चाहते हैं एक "स्क्वैश" मर्ज है:

git checkout master 
git merge --squash dev 
git commit -m 'current stable work from dev branch' 

क्या करता है एक नियमित रूप से मर्ज के रूप में अपने काम कर पेड़ में एक ही राज्य बनाने है, लेकिन निर्माण नहीं करता किसी मर्ज सभी मध्यवर्ती प्रतिबद्ध के साथ प्रतिबद्ध पूर्वजों के रूप में। इंटरमीडिएट काम master शाखा के इतिहास का हिस्सा नहीं होगा। git merge मैनपेज से इस विकल्प के लिए प्रलेखन कहते हैं:

के रूप में अगर एक असली मर्ज (मर्ज जानकारी को छोड़ कर) हुआ काम कर रहे पेड़ और सूचकांक राज्य निर्माण, लेकिन वास्तव में एक प्रतिबद्ध या स्थानांतरित नहीं बनाते हैं HEAD, न ही अगले गिट मर्ज प्रतिबद्ध बनाने के लिए कमांड कमांड के कारण $GIT_DIR/MERGE_HEAD रिकॉर्ड करें। यह आपको वर्तमान शाखा के शीर्ष पर एकल प्रतिबद्धता बनाने की अनुमति देता है जिसका प्रभाव जैसा कि एक और शाखा (या ऑक्टोपस के मामले में अधिक) विलय कर रहा है।

0

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