@ मर्क लोंगेयर ने अपने जवाब में इसे यहां दिया , लेकिन मैं कुछ अतिरिक्त जानकारी जोड़ना चाहूंगा।
संबंधित, और एक बड़े पुल अनुरोध (पीआर) को तोड़ने के तरीके के सवाल का जवाब देना, खासकर जब आपके कमिट्स को स्क्वीज़ करना आपके फीचर_ब्रांच में मास्टर के एक या अधिक मर्ज के कारण अव्यावहारिक है।
मेरी स्थिति:
मैंने feature_branch30 कमिट के साथ एक बड़ा बनाया और इसे मर्ज करने के लिए GitHub पर एक पुल अनुरोध (PR) खोला master। शाखा masterने मेरे नीचे एक टन बदल दिया, और 200 प्राप्त किए जो मेरे feature_branchपास नहीं थे। संकल्प संघर्ष करने के लिए मैंने किया था git checkout feature_branchऔर git merge masterविलय करने के लिए masterमेरे में की परिवर्तन feature_branch। मैंने mergeइसके बजाय चुनाrebase नवीनतम गुरु की ताकि मुझे संभावित 30 बार (एक बार मेरे प्रत्येक आवागमन के लिए) के बजाय केवल एक ही बार संघर्षों को हल करना पड़े। मैं अपने 30 कमिट्स को पहले 1 में स्क्वैश करना नहीं चाहता था और फिर लेटेस्ट पर रिबेट करता हूंmasterक्योंकि वह पीआर में GitHub समीक्षा टिप्पणी इतिहास मिटा सकते हैं। इसलिए, मैंने मास्टर को अपनी सुविधा शाखा में विलय कर दिया और 1 बार संघर्षों का समाधान किया। सब कुछ ठीक था। मेरे पीआर, हालांकि, मेरे सहयोगियों की समीक्षा के लिए बहुत बड़ा था। मुझे इसे विभाजित करने की आवश्यकता थी। मैं अपने 30 हिट और OH NO स्क्वैश करने गया था! वे कहां हैं? वे सब के साथ जुड़े हुए हैं master200 हाल ही में शुरू होता है क्योंकि मैं masterअपने में विलय कर दिया feature_branch! मैं क्या करूं?
git cherryयदि आप git cherry-pickव्यक्तिगत रूप से प्रयास करना चाहते हैं, तो इसका उपयोग करें :
git cherry बचाव के लिए (तरह)!
उन सभी कमिटों को देखने के लिए जो में feature_branchनहीं हैं, लेकिन masterमैं कर सकता हूँ:
git checkout feature_branch
git cherry master
या, मैं किसी भी शाखा से यह सुनिश्चित करने के साथ कि मैं इस तरह feature_branchसे कर रहा हूँ, के बारे में पहले से जाँच कर सकता हूँ git cherry [upstream_branch] [feature_branch]। फिर, यह जाँच करता है देखने के लिए जो प्रतिबद्ध में हैं feature_branchलेकिन नहीं कर रहे हैं upstream_branch( masterइस मामले में):
git cherry master feature_branch
जोड़ने -vसे कमिट मैसेज सब्जेक्ट लाइन भी दिखती है:
git cherry -v master
"शब्द गणना" "-संख्या" ( wc -l) के लिए पाइपिंग गिना जाता है कि कितने कमिट हैं:
git cherry master | wc -l
आप इस गिनती की तुलना अपने गिथहब पीआर में दिखाए गए कमेंट नंबर के खिलाफ कर सकते हैं ताकि git cherryवास्तव में काम करने के बारे में बेहतर महसूस किया जा सके । आप एक-एक करके git hashes की तुलना कर सकते हैं और देख सकते हैं कि वे git cherryऔर GitHub के बीच मेल खाते हैं । ध्यान दें कि git cherryआपके द्वारा मर्ज masterकिए गए किसी भी मर्ज की गणना नहीं की जाएगी feature_branch, लेकिन GitHub WILL। इसलिए यदि आप गिनती में एक छोटी सी विसंगति देखते हैं, तो शब्द "मर्ज" के लिए GitHub PR कमिट पृष्ठ खोजें और आप शायद देखेंगे कि वह अपराधी है जो अंदर नहीं दिखा रहा है git cherry। Ex: "Merge branch 'master in feature_branch" नामक एक कमिट GitHub PR में दिखाई देगा, लेकिन जब आप रन नहीं करेंगे git cherry master feature_branch। यह ठीक और अपेक्षित है।
तो, अब मेरे पास यह पता लगाने का एक माध्यम है कि मैं इस सुविधा को विभाजित करने के लिए एक नई सुविधा शाखा पर चेरी-पिक करना चाहता हूं: मैं git cherry master feature_branchस्थानीय रूप से उपयोग कर सकता हूं , या गिटहब पीआर में कमिट को देख सकता हूं ।
स्क्वैश कैसे मदद कर सकता है - अगर केवल हम स्क्वैश कर सकते हैं:
हालांकि, मेरे बड़े अंतर को विभाजित करने के लिए एक विकल्प, मेरे सभी 30 हिट्स को एक में स्क्वैश करना है, एक नई सुविधा शाखा पर, पैच कमिट को रीसेट करें, फिर git guiटुकड़े टुकड़े फ़ाइल को फ़ाइल में जोड़ने का उपयोग करें, चंक द्वारा चंक, या पंक्ति दर पंक्ति। एक बार जब मुझे एक उप-सुविधा मिल जाती है, तो मैं वह कर सकता हूं जो मैंने जोड़ा है फिर एक नई शाखा देखें, कुछ और जोड़ें, प्रतिबद्ध करें, एक नई शाखा देखें आदि, जब तक कि मेरी बड़ी सुविधा कई उप-विशेषताओं में टूट न जाए। । समस्या यह है कि मेरी 30 प्रतिबद्ध वजह से अन्य लोगों से अन्य 200 प्रतिबद्ध के साथ मिश्रित कर रहे हैं मेरी है git merge masterमेरी में feature_branch, है, तो रिबेसिंग इसलिए अव्यावहारिक है के रूप में मैं फिर से आदेश करना 230 प्रतिबद्ध में छान-बीन करने के लिए है और मेरी 30 प्रतिबद्ध छुटकारा पाने चाहते हैं।
स्क्वैशिंग के लिए पैच फ़ाइल का उपयोग बहुत आसान प्रतिस्थापन के रूप में कैसे करें:
एक काम के आसपास एक पैच फ़ाइल प्राप्त करने के लिए है, जो मेरे सभी 30 हिट के "स्क्वैश-समतुल्य" है, इसे एक नए कांटे master(एक नई उप-सुविधा-शाखा) पर पैच करें , और वहां से काम करें:
git checkout feature_branch
# ensure I have the latest changes from master merged into feature_branch
git merge master
# Obtain a patch file, which is the equivalent of a squash of my 30 commits into 1 commit:
git diff master..feature_branch > ~/mypatch.patch
git checkout master
# Create a new, sub-feature branch
git checkout -b feature_branch2
# Patch the 30 commit patch file onto it:
git apply ~/mypatch.patch
अब मेरे पास मेरे 30-प्रतिबद्ध पैच हैं जो सभी स्थानीय रूप से लागू होते हैं, लेकिन अस्थिर और अन-कम।
अब git guiफाइलों, चंक्स और / या लाइनों को जोड़ने और अपने बड़े पीआर को तोड़ने या "अलग" करने के लिए उपयोग करें:
ध्यान दें कि यदि आपके पास नहीं है git gui, तो आप इसे आसानी से उबंटू में स्थापित कर सकते हैं sudo apt install git-gui।
अब मैं git guiफ़ाइलें, चंक्स और / या लाइनें जोड़ना शुरू कर सकता हूं (git GUI प्रोग्राम में राइट-क्लिक करके), और उप-शाखाओं में 30 प्रतिबद्ध सुविधा शाखा को ऊपर बताए अनुसार तोड़ना, बार-बार जोड़ना, कमिट करना, फिर फोर्क करना एक नई सुविधा शाखा और इस चक्र को तब तक दोहराना जब तक कि सभी बदलावों को एक उप-सुविधा-शाखा में नहीं जोड़ा गया हो और मेरी 30-प्रतिबद्ध सुविधा सफलतापूर्वक 3 या 4 उप-सुविधाओं में टूट गई हो। मैं अब इन उप-विशेषताओं में से प्रत्येक के लिए एक अलग पीआर खोल सकता हूं, और मेरी टीम के लिए उनकी समीक्षा करना आसान होगा।
संदर्भ:
- पैच बनाएँ या गिट रिपॉजिटरी से फ़ाइल को अलग करें और इसे किसी अन्य भिन्न गिट रिपॉजिटरी में लागू करें