2012-12-16 12 views
177

क्या एक शाखा से दूसरे में परिवर्तन करना और धक्का देना संभव है।पुश किसी अन्य शाखा में काम करता है

मान लें मैं Branch1 में परिवर्तन के लिए प्रतिबद्ध है और उन्हें Branch2 को पुश करने के लिए चाहते हैं।

git push origin **BRANCH2** 

और फिर Branch1 रीसेट:

Branch1 से, यह करने के लिए मान्य है?

उत्तर

342

यह लगभग काम करेगा।

जब एक गैर-डिफ़ॉल्ट शाखा को आगे बढ़ाने के लिए, आप स्रोत रेफरी और लक्ष्य रेफरी निर्दिष्ट करना होगा:

git push origin branch1:branch2 

या

git push <remote> <branch with new changes>:<branch you are pushing to> 
+11

क्या दोनों 'शाखा 1' और' शाखा 2 'को रिमोट पर होना चाहिए? क्या होगा यदि आप स्थानीय 'शाखा 1' से दूरस्थ' मूल शाखा 2 'पर धक्का देना चाहते हैं? – orad

+5

@orad: नहीं। पहला भाग वास्तव में स्थानीय प्रतिबद्धता के लिए एक पहचानकर्ता है; इसे एक शाखा होने की भी आवश्यकता नहीं है। – SLaks

+2

क्या होगा यदि मैं पहले एक शाखा को बिना किसी शाखा के दूसरे रिमोट शाखा को धक्का देना चाहता हूं? – abhisekp

47

निश्चित रूप से, हालांकि यह केवल तभी काम करेगा यदि यह ब्रैंच 2 का तेज़ आगे है या यदि आप इसे मजबूर करते हैं। ऐसा करने के लिए सही सिंटैक्स

git push <remote> <source branch>:<dest branch> 

यह कैसे काम करता बारे में अधिक विस्तार के लिए git push man page पर एक "refspec" का विवरण देखें है। यह भी ध्यान रखें कि एक बल धक्का और रीसेट दोनों ऑपरेशन हैं जो "इतिहास को फिर से लिखते हैं", और दिल की बेहोशी से प्रयास नहीं किया जाना चाहिए जबतक कि आप पूरी तरह से सुनिश्चित नहीं हैं कि आप जानते हैं कि आप किसी भी दूरस्थ भंडार और अन्य के संबंध में क्या कर रहे हैं वे लोग जिनके पास एक ही परियोजना के कांटे/क्लोन हैं।

+2

धन्यवाद: तुम सिर्फ माध्यम से चेरी ले, के तर्क के लिए एक commitish की जरूरत है! मैं बस इतना जोड़ूंगा कि आप 'गिट पुश - फोर्स रिमोट लोकल-ब्रांच: रिमोट-शाखा' के साथ मजबूर कर सकते हैं। –

0

मेरे मामले में मैं एक स्थानीय प्रतिबद्ध था, जो origin\master पर धक्का नहीं दिया गया था, लेकिन मेरे स्थानीय master शाखा में चला गया। इस स्थानीय प्रतिबद्धता को अब दूसरी शाखा में धकेल दिया जाना चाहिए।

Git एक्सटेंशन आप कुछ इस तरह कर सकते हैं के साथ:

  • नई शाखा है, जहां आप पुश करने के लिए अपने प्रतिबद्ध चाहते चेकआउट (मौजूदा और न बनाएं)।
  • इतिहास से प्रतिबद्धता का चयन करें, जिसे & को इस शाखा में धक्का दिया जाना चाहिए।
  • राइट क्लिक करें और चेरी पिक प्रतिबद्ध चुनें।
  • चेरी बटन बाद में दबाएं।
  • चयनित प्रतिबद्धता आपकी चेक आउट की गई शाखा पर लागू होती है। अब प्रतिबद्ध और इसे धक्का।
  • दोषपूर्ण प्रतिबद्धता के साथ, अपनी पुरानी शाखा देखें।
  • इस शाखा को दूसरी अंतिम प्रतिबद्धता में रीसेट करें, जहां सब कुछ ठीक था (जागरूक रहें कि आप यहां क्या कर रहे हैं!)। आप इसे दूसरी अंतिम प्रतिबद्धता पर राइट क्लिक के माध्यम से कर सकते हैं और का चयन करें वर्तमान शाखा को पर रीसेट करें। अगर आप जानते हैं कि आप क्या कर रहे हैं तो opperation की पुष्टि करें।

आप जीआईटी कमांड लाइन पर भी ऐसा कर सकते हैं।उदाहरण David Christensen से नकल:

मुझे लगता है कि आप git cherry-pick + git reset एक बहुत तेज कार्यप्रवाह होने के लिए मिल जाएगा: अपने ही परिदृश्य का उपयोग

"सुविधा" के साथ शाखा होने के साथ, सर्वोच्च गलत जा रहा है के लिए प्रतिबद्ध है, यह ऐसा करने के लिए बहुत आसान हो जाएगा:

git checkout master
git cherry-pick feature
git checkout feature
git reset --hard HEAD^

काफी काम का एक सा बचाता है, और परिदृश्य है कि git cherry-pick को संभालने के लिए डिजाइन किया गया है।

मैं यह भी ध्यान रखूंगा कि यह भी काम करेगा अगर यह शीर्ष प्रतिबद्ध नहीं है;

git checkout master
git cherry-pick $sha1
git checkout feature
git rebase -i ... # whack the specific commit from the history

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