2011-09-17 22 views
14

मैं बस अपना develop शाखा में एकगिट मर्ज स्क्वैश को पूर्ववत कैसे करें?

git merge --squash feature-branch 

किया है।

समस्या यह है कि उपरोक्त आदेश ने नई प्रतिबद्धता के बिना सिर को अद्यतन किया। मेरा इरादा develop के सिर पर लागू करने के लिए एक एकल प्रतिबद्धता बनाना था।

तो संक्षेप में, विलय से पहले और बाद में develop शाखा के लिए लॉग बिल्कुल वही है।

वहाँ वापस develop क्या यह git merge पहले था पर वापस लौटने के लिए एक रास्ता है?

धन्यवाद।

समाधान

दान डी से टिप्पणी और मैं नीचे स्वीकार किए जाते हैं जवाब के आधार पर मेरी समस्या को हल करने में सक्षम था। यदि आप एक ही नाव में हैं तो मैंने नीचे क्या किया है:

1 - मैं git reflog चला गया और यह मेरे develop शाखा के साथ किए गए सभी कामों और चेकआउट सूचीबद्ध करता है।

2 - सुझाए गए git reset [email protected]{1} करने के बजाय, मुझे वह नंबर मिला जब मैंने इसे विकसित करने के लिए आखिरी प्रतिबद्धता की थी। मेरे मामले में यह [email protected]{188} था। तो मैंने git reset [email protected]{188} टाइप किया।

3 - मैंने git log चलाया और इसमें एक साफ़ लॉग दिखाया गया था जो मैंने गलत विलय करने से पहले ही किया था।

4 - मैंने अपने फीचर डेवलपमेंट के दौरान बनाई गई सभी नई फाइलों को चरणबद्ध करने के लिए git add -A . चलाया।

5 - मैं git commit -m "install feature-x"

6 दौड़ा - एक परिणाम के रूप में अब मैं सही फाइलों के साथ शाखा develop है और लॉग साफ है - दिखा केवल एक ही सभी परिवर्तनों को मैं feature-x के विकास के दौरान किया था के लिए प्रतिबद्ध हैं।

मुझे अभी भी यह पता लगाना होगा कि मेरा मूल git merge --squash feature-branch इरादा के रूप में क्यों काम नहीं करता था।

समाधान 2

मार्क Longair का जवाब मेरी समस्या के लिए एक निश्चित समाधान है। मैंने अभी इसका परीक्षण किया है और यह काम करता है। प्रक्रिया अब मैं उपयोग कर रहा हूँ एक feature-branch के भीतर सभी आंतरिक प्रतिबद्ध छुटकारा पाने के लिए और शामिल सिर्फ एक develop शाखा के लिए प्रतिबद्ध नीचे देखें:

git checkout develop 
git merge --squash feature-branch 
git commit -m "install of feature-branch" 

ऊपर अनुक्रम एक आकर्षण की तरह काम करता है।

+2

'गीट रीफ्लॉग' का उपयोग करें। –

उत्तर

17

यदि आप git merge --squash <other-branch> चलाते हैं तो काम करने वाले पेड़ और इंडेक्स को विलय के परिणाम के साथ अद्यतन किया जाता है, लेकिन यह प्रतिबद्धता नहीं बनाता है।तुम सब करने की ज़रूरत को चलाने के लिए है:

git commit 

हालांकि, अगर आप करने से पहले अपना मन बदल और सिर्फ मर्ज निरस्त करना चाहते, तो आप बस चला सकते हैं:

git reset --merge 

आप की जरूरत नहीं है रिफ्लॉग का उपयोग करने के लिए।

आधुनिक Git वाक्य रचना के साथ मर्ज बीच में बंद करें:

git merge --abort 

और बड़े वाक्य रचना के साथ:

git reset --merge 

और वास्तव में

+0

उउ, धन्यवाद। मैं एक नई फीचर शाखा में काम कर रहा हूं और यह देखने के लिए कि क्या यह काम करता है, मैं आपके सुझाव का परीक्षण करूंगा। मैं इस प्रश्न को परिणामों के साथ अपडेट करूंगा। धन्यवाद। – jdias

+0

बस परीक्षण किया और यह काम करता है। धन्यवाद मार्क मैंने अभी आपके प्रश्न के साथ अपना प्रश्न अपडेट कर लिया है। – jdias

+0

+1 एक और विचारधारा लोहे से बाहर। धन्यवाद! (थोड़ी निराशाजनक नोट पर: ऐसा इसलिए है क्योंकि गिट में सभी उपसमूह थोड़ा असंगत व्यवहार करते हैं - मर्ज करें, लागू करें, स्थानीय परिवर्तनों के साथ चेकआउट करें, सभी अलग-अलग व्यवहार करें। 'गिट चेकआउट हेड - 'बनाम' गिट चेकआउट की पर्याप्तता का जिक्र नहीं करना हेड - .', 'गिट रीबेज --बॉर्ट', लेकिन 'गिट मर्ज --बॉर्ट', 'गिट पुश --ॉल' नहीं, लेकिन 'गिट पुल --all' नहीं और इस तरह के कई सूक्ष्म उदाहरण :)) – sehe

0

आप करने से पहले अपना मन बदलते हैं तो आपको ये विकल्प है पुराना स्कूल:

git reset --hard 

लेकिन असल में, यह ध्यान देने योग्य है कि git merge --abort केवल git reset --merge के बराबर है जो MERGE_HEAD मौजूद है। इसे मर्ज कमांड के लिए गिट सहायता में पढ़ा जा सकता है।

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. 

एक असफल मर्ज के बाद, जब है वहाँ कोई MERGE_HEAD, विफल रहा है मर्ज git reset --merge साथ पूर्ववत किया जा सकता लेकिन git merge --abort साथ जरूरी नहीं कि, तो वे नहीं एक ही बात के लिए ही पुराने और नए वाक्य रचना कर रहे हैं। व्यक्तिगत रूप से मुझे git reset --merge रोजमर्रा के काम में और अधिक उपयोगी लगता है।

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