2015-12-04 4 views
7

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

मैं अपने सभी कामों (उदाहरण के लिए पीआर के उदाहरण से) को उसी शाखा में कैसे स्क्वैश कर सकता हूं?

मैं कल्पना यह की तरह कुछ होगा:

git checkout master     # For master 
git pull        # Get all branches up-to-date 
git checkout feature1     # Checkout the branch 
git checkout -b feature1_squash  # Make a copy of the branch 
git branch -D feature1     # Delete original branch 
git checkout master     # (?) Branch off latest master for safety 
git checkout -b feature1    # Make new (empty) original branch 
git merge --squash feature1_squash  # Merge with squash into it 
git push -f feature1     # Push, force will be required 

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

मैं इंटरैक्टिव रिबेस का उपयोग नहीं करना चाहता क्योंकि यह ट्रेन करने वाले नए लोगों के लिए सही पाने के लिए थोड़ा मुश्किल है। मैं भी काम की संख्या जानना नहीं चाहता, मैं बस इस शाखा में मौजूद सभी को करना चाहता हूं।

+1

मुझे समझ में नहीं आता कि आप क्या चाहते हैं। क्या आपके पास प्रत्येक पर विभिन्न प्रतिबद्धताओं के साथ कई शाखाएं हैं और आप उन्हें एक शाखा में एक प्रतिबद्धता में रखना चाहते हैं, जिससे विकास इतिहास खो रहा है? – houtanb

+1

मेरे पास कई शाखाओं के साथ 1 शाखा ('सुविधा 1') है और मैं चाहता हूं कि 1 प्रतिबद्ध हो। –

उत्तर

1

मुझे लगता है कि आप जो सुझाव दे रहे हैं वह अपरंपरागत है, और rebase -i का उपयोग स्क्वैश के उपयोग से नए लोगों के लिए अधिक कठिन है।

git rebase -i HEAD~N के बारे में क्या मुश्किल है (N के साथ स्क्वैशिंग के लिए वापस जाने के लिए काम करने की संख्या होने के नाते)? आप बस सूची पढ़ते हैं, और जिसकी आपको आवश्यकता होती है, उतनी ही कम कर देती है। "Rewriting History" मार्गदर्शिका में अधिक जानकारी है, और मुझे लगता है कि यह एक नए उपयोगकर्ता के लिए बिल्कुल उपयुक्त है।

आप अपने प्रशिक्षुओं के अभ्यास के लिए हमेशा डेमो शाखा बना सकते हैं। बस डेमो प्रयोजनों के लिए शाखा में 5-6 कार्य करें, और प्रशिक्षु स्क्वैश इंटरैक्टिव रीबेस के साथ काम करता है, फिर यह साबित करने के लिए एक पीआर बनाएं कि वे इसे लाइव शाखा में संभाल सकें।

+0

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

+1

मुझे अभी भी विश्वास है कि जटिलता को छुपाएं (और उपकरण के सामान्य उपयोग मामलों को भी बाधित करना, और एक ही व्यवहार के कारण बाहरी उपकरणों का उपयोग करना) आपके प्रशिक्षुओं के लिए एक नुकसान है। मुझे विश्वास है कि, सक्षम प्रोग्रामर के रूप में, एक बार वे कुछ बार rebase, यह दूसरी प्रकृति बन जाएगा। आप विभिन्न सुविधाओं तक पहुंच नियंत्रित करने के लिए गिटोसिस (https://git-scm.com/book/en/v1/Git-on-the-Server-Gitosis) जैसे टूल का भी उपयोग कर सकते हैं, हालांकि इसकी अपनी परत भी जटिलता। किसी भी घटना में, शुभकामनाएं, मुझे आशा है कि वे अच्छी तरह से सीख सकेंगे! – Todd

+0

गिटोसिस भूल जाओ, यह अब और बनाए रखा नहीं है। गिटोलाइट इसे बदल देता है और इसे बनाए रखा जाता है। –

0

स्क्वैश काम करने के लिए एक इंटरैक्टिव रिबेस का विकल्प (विशेष रूप से शाखा पर लगातार काम करता है) git reset --soft है।
देखें "Squash my last X commits together using Git"

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse [email protected]{1})" 

यह "Practical uses of git reset --soft" में से एक है कि मैंने पहले उल्लेख।

4

वॉनसी का उत्तर लगभग वहां है। लेकिन यह जानकर कि आप 3 काम करना चाहते हैं, मुश्किल है।

बजाय

आप merge-base

git reset --soft $(git merge-base YOUR_BRANCH WHERE_YOU_BRANCHED_FROM) 
git commit 

का उपयोग करना चाहिए और अपने संदेश को संपादित (या Git का उपयोग बजाय -m प्रतिबद्ध) कि शाखा पर

यदि आपका, आप सिर का उपयोग करें और यह सोचते हैं आप गुरु से branched कर सकते हैं अपने आदेशों

git reset --soft $(git merge-base HEAD origin/master) 
git commit 

(स्थानीय गुरु पुराना हो चुका संभावित होने के कारण का उपयोग कर मूल/मास्टर) होगा आप नहीं कर सकते याद है जहाँ आप branched से, जिस स्थान पर आप पीआर को वापस विलय कर रहे हैं, वह संभवतः

+0

प्लस वन को कमेटी की संख्या जानने की आवश्यकता नहीं है –

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