2013-02-14 13 views
7

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

यदि मैं गिट diff मास्टर..न्यू-फीचर उदाहरण के लिए देख रहा था।

अगर मैं 'मास्टर' पर सिर्फ एक नई ताजा प्रतिबद्धता बनाना चाहता हूं जिसमें दो शाखाओं के बीच सभी बदलाव शामिल हैं, तो ऐसा करने का सबसे प्रभावी तरीका क्या है?

उत्तर

17
git checkout master 
git merge --squash new-feature 
git commit 

प्रतिबद्ध संदेश प्रतिबद्ध जा रहा है की पूरी सूची दिखा बाहर शुरू कर देंगे विलय/कुचल, लेकिन आप निश्चित रूप से संपादित की आप जो कुछ भी चाहते है कि कर सकते हैं:

यहाँ एक उदाहरण है।

+0

स्वादिष्ट रूप से सरल :) – hhh

1

आप इसके लिए इंटरैक्टिव रिबेस का उपयोग कर सकते हैं: git rebase --interactive। फिर बस स्क्वैश विकल्प का उपयोग करें। यह केवल प्रतिबद्धता से अद्यतन का उपयोग करता है लेकिन प्रतिबद्धता नहीं बनाता है।

+0

कि स्क्वैश के लिए लेने की जगह खोज की एक टन की तरह लगता है , या क्या मैं कुछ न कुछ भूल रहा हूं? – hhh

0

आप अपनी फीचर शाखा में सबकुछ कर सकते हैं, फिर सभी परिवर्तनों के लिए मास्टर को 'इन' स्वीकार कर सकते हैं। Is there a "theirs" version of "git merge -s ours"?

+0

हम्म, क्या इसका परिणाम केवल फीचर शाखा का प्रतिनिधित्व करने वाला एक ही प्रतिबद्ध है? – hhh

+0

यदि आप पहले फीचर शाखा में रीबेज करेंगे (जैसे विलियम ऊपर बताता है), हालांकि यह शायद अव्यवस्थित है। स्रोत नियंत्रण के बारे में महान चीज़ों में से एक का इतिहास यह है कि आप कहां गए हैं। मुझे लगता है कि हालांकि वरीयता का मामला है! इंटरैक्टिव रीबेस पर अधिक [यहां] (http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)। –

+0

हाँ, मैं इतिहास भी होने चाहते हैं, लेकिन अलग अलग लोगों :) – hhh

1

उपयोग Git --interactive HEAD ~ (हालांकि कई प्रतिबद्ध छुटकारा पाने के लिए चाहते हैं) rebase:

यहाँ कि कैसे करना है पर एक बड़ा जवाब के साथ एक स्टैक ओवरफ़्लो सवाल है। उदाहरण के लिए, गिट रिबेस - इंटरएक्टिव हेड ~ 5। यह आपके पिछले 5 कामों को लोड करेगा और संदेशों के साथ एक संपादक विंडो लाएगा। प्रत्येक संदेश में शुरुआत में 'पिक' होगा। अंतिम संदेश पर जाएं, 'पिक' को 'स्क्वैश' में बदलें और बाहर निकलें। प्रतिबद्ध संदेश के लिए एक नई विंडो खुल जाएगी। यह स्क्वैश प्रतिबद्धता का नया प्रतिबद्ध संदेश होगा। बाहर निकलें और यह सभी कामों को एक नए में स्क्वैश करेगा। https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one

+0

लगता है कि जैसे देखकर कि मैं एक टीम पर हूँ और नियमित रूप से टीम के अन्य सदस्यों से परिवर्तन में खींचने के लिए की आवश्यकता होगी, कुछ समस्या पैदा कर सकता है। वह, और मैं गिनती नहीं करना चाहूंगा :) – hhh

+0

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

+0

तो ~ 5 उस मास्टर से काम नहीं करेगा जो मैंने खींचा है में, जब तक मैं शाखा में केवल एक ही काम कर रहा हूं? क्या '5' का मतलब उस शाखा के लिए आखिरी पांच अद्वितीय है, या अंतिम पांच कुल में काम करता है? – hhh

2

एक और विकल्प जो आपके लिए बेहतर काम कर सकता है, git diff --patch > "patch filename" के साथ पैच फ़ाइल उत्पन्न करना होगा और फिर उन्हें git apply "patch file name" का उपयोग करके अपनी मास्टर शाखा में पैच करना होगा। (विशेष रूप से "-p साथ पैच जनरेट कर रहा है") Git-diff के लिए

मैन पेज: http://www.kernel.org/pub/software/scm/git/docs/git-diff.html

के लिए मैन पेज Git से लागू: http://www.kernel.org/pub/software/scm/git/docs/git-apply.html

+0

गिट लागू ... दिलचस्प :) जानना अच्छा है! – hhh

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