Git में मास्टर से शाखा में परिवर्तन प्राप्त करें


690

मेरे भंडार में मेरी एक शाखा है जिसे aqमैं काम कर रहा हूं।

मैंने तब नया काम किया और बग्स में गया master

उन लोगों को aqशाखा में लाने का सबसे अच्छा तरीका क्या है ? एक और नई शाखा बनाएँ और masterउसमें विलय करें aq?


3
भविष्य में, आप मास्टर और अन्य शाखाओं के एक सामान्य पूर्वज से अपनी बगफिक्स शाखा को भी शुरू कर सकते हैं, जिसे फ़िक्सेस की आवश्यकता होगी, ताकि आप इसे उन सभी शाखाओं में विलय कर सकें, बिना कुछ और उठाए।
Cascabel

2
@Jefromi लेकिन वह अपने नियंत्रण से बाहर है अगर वह इस परियोजना पर काम करने वाला एकमात्र व्यक्ति नहीं है। अन्य लोग मास्टर को अपडेट करते हैं। नरक, आप स्वयं एक तीसरी शाखा से मास्टर को अपडेट कर सकते हैं, और स्थिति अपरिहार्य होगी, और सामान्य समाधान की आवश्यकता होगी।
एहनबीकैड

@ahnbizcad मुझे पूरा यकीन है कि वह नियंत्रण में है जहां वह अपनी शाखा शुरू करता है। अगर उसकी शाखा उन लोगों का एक सामान्य पूर्वज है जिसे वह विलय करना चाहता है, और लोग बाद में उन शाखाओं में जोड़ते हैं, तो यह अभी भी एक सामान्य पूर्वज होगा।
Cascabel

लोग सवाल करते हैं, क्या यह कमांड ऐसा करता है,git pull origin my_branch_name
बशीर अल-मोमानी

जवाबों:


794

की जाँच करें aqशाखा, और से rebase master

git checkout aq
git rebase master

क्या किसी अन्य शाखा से रिबेस हो सकता है? अर्थात। अन्य विद्रोह ऐसा लगता है कि मैं अपने प्रश्न में थोड़ा हट गया था, मैंने एक शाखा से शाखा की, फिर मूल शाखा में परिवर्तन किया।
आस्तीन

2
यदि सही है, तो पुल अनुरोध पर रिबेस करें यह सभी मास्टर कमिट्स को दिखाएगा। यदि आप मर्ज / मूल मास्टर का उपयोग करते हैं, तो सभी मास्टर कमिट्स को 1 कमिट के रूप में दिखाया जाएगा, जिससे यह कोड समीक्षा के लिए आसान हो जाता है।
फू बार यूजर

4
कभी-कभी, git mergeबेहतर होगा। यदि दोनों शाखाएं समय के साथ विकसित हुईं, तो आपको विचार करना चाहिए कि आपके लिए कौन सा सबसे अच्छा है।
erick2red

70
पार्टी के लिए देर से, लेकिन यह एक बड़ा अवलोकन है कि कब रिबास
ebuat3989

7
यदि आपका पिछला शाखा शाखा पर सार्वजनिक है तो रिबास न करें। atlassian.com/git/tutorials/rewriting-history/git-rebase
हनमंत

301

git merge origin/masterजब आप अपने aq ब्रांच पर होते हैं, तो आपको बस सक्षम होना चाहिए ।

git checkout aq
git merge origin/master

55
अगर रिबास "बेहतर" है तो पूरी तरह से विशिष्ट स्थिति पर निर्भर करता है।
बॉम्बे

13
आप "गिट मर्ज मूल / मास्टर" के बजाय सिर्फ "गिट मर्ज मास्टर" क्यों नहीं कहते हैं?
माइकल कुलर 12

145
उपयोग करें rebaseयदि आपकी शाखा स्थानीय है और उसे धक्का नहीं दिया गया है origin। उपयोग करें mergeयदि आपकी शाखा पहले से ही धकेल दी गई है। rebaseइतिहास को फिर से लिखेंगे।
कचरा पात्र

17
@Toskan आप उन मुद्दों में भाग सकते हैं जहां आपका स्थानीय मास्टर रिमोट के साथ अद्यतित नहीं है। इस तरह यह सुनिश्चित करता है कि आप कोड की रिमोट कॉपी में विलय कर रहे हैं।
क्रिस कूकेन

8
@garbagecollector मैं रिबेस के खिलाफ हूँ (मैं कर सकता हूँ, लेकिन रिबास नहीं करूँगा) मुझे रिबेस के साथ जुआ खेलने का कोई कारण नहीं दिखता। यह सिर्फ चीजों को अनावश्यक रूप से जटिल बनाता है। आपके पास हमेशा यह सवाल होता है कि "क्या मैंने इसे रिमोट पर धकेल दिया था?" विचार करने के लिए और नए लोगों को समझाने के लिए एक दर्द है। कुछ लोग कहते हैं कि यह मर्ज होने से बचा जाता है। लेकिन मैं चाहता हूं कि मर्ज कमिट हो। वे अव्यवस्थित नहीं होते हैं, वे शाखाओं में विलय होने पर दस्तावेज करते हैं। तो आखिरी समय के लिए, हम आखिरकार अभिनय करना बंद कर सकते हैं जैसे हम सभी मास्टर करने के लिए प्रतिबद्ध हैं? यदि आप मर्ज को नापसंद करते हैं तो लॉग में बहुत कुछ होता है, बस उन्हें --no- मर्ज के साथ फ़िल्टर करें।
नुरेटिन

92

पहले मास्टर को देखें:

git checkout master

सभी परिवर्तन, हॉटफ़िक्स करें और अपने मास्टर को कमिट करें और धक्का दें।

अपनी शाखा में वापस जाएं, 'aq', और इसमें मास्टर मर्ज करें:

git checkout aq
git merge master

आपकी शाखा मास्टर के साथ अद्यतित होगी। मर्ज का एक अच्छा और मूल उदाहरण 3.2 Git Branching - मूल शाखा और विलय है


25

इसमें कोई गारंटी नहीं है कि मास्टर बग फिक्स अन्य कमिट्स में से नहीं हैं, इसलिए आप बस विलय नहीं कर सकते। करना

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

यह मानते हुए कि कमिट बग फिक्स का प्रतिनिधित्व करते हैं।

हालाँकि, अब से, बग फिक्स को एक अलग शाखा में रखें। आप बस कर पाएंगे

git merge hotfixes

जब आप उन सभी को नियमित देव शाखा में रोल करना चाहते हैं।


17

या cherry-pickतो संबंधित aqशाखा masterमें जाता है या शाखा को शाखा में विलय करता है aq


5
@ क्या आपने स्वयं उत्तर दिया ... यह इस स्थिति का हल नहीं है
mtet88

13

इसके साथ विलय करें aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push


7

मेरे लिए, मेरे पास पहले से ही परिवर्तन थे और मैं आधार शाखा से नवीनतम चाहता था। मैं करने में असमर्थ था rebase, और cherry-pickहमेशा के लिए ले लिया था, इसलिए मैंने निम्नलिखित कार्य किया:

git fetch origin <base branch name>  
git merge FETCH_HEAD

इस मामले में तो:

git fetch origin master  
git merge FETCH_HEAD

7

यह ( यहाँ से ) मेरे लिए काम किया:

git checkout aq
git pull origin master
...
git push

का हवाला देते हुए:

git pull origin masterअपनी शाखा के साथ मास्टर ब्रांच की सामग्री को लाता है और मर्ज करता है। यदि कोई मर्ज संघर्ष है तो आपको इस स्तर पर सूचित किया जाएगा और आगे बढ़ने से पहले आपको मर्ज के समाधान का समाधान करना होगा । जब आप अपने नए मर्ज कमिट सहित अपने स्थानीय कमिट्स को रिमोट सर्वर पर धकेलने के लिए तैयार हों, तो दौड़ें git push


यह ध्यान रखना महत्वपूर्ण है कि यह समाधान सही है यदि विशेष रूप से मर्ज की आवश्यकता है, अर्थात, यदि मास्टर शाखा को किसी कारण से छूट नहीं दी जा सकती है।
कुडाकोडर

3

आपके पास कुछ विकल्प हैं। git rebase master aqशाखा पर जो प्रतिबद्ध नाम रखेंगे, लेकिन अगर यह एक दूरस्थ शाखा है, तो इसका जवाब न दें। आप कर सकते हैं git merge master aqअगर आप प्रतिबद्ध नाम रखने के बारे में परवाह नहीं है। यदि आप प्रतिबद्ध नाम रखना चाहते हैं और यह git cherry-pick <commit hash>आपकी शाखा पर आने वाली एक दूरस्थ शाखा है।


0

आप सिंगल लाइन चलाकर भी ऐसा कर सकते हैं।
git merge aq master

इसके बराबर है

git checkout aq
git merge master

यह वह नहीं कर रहा है जो आप सोचते हैं कि यह कर रहा है। git merge a bमर्ज की शाखाएँ aऔर bवर्तमान शाखा में। लेकिन git merge aजब आप शाखा में होते हैं aतो कुछ भी नहीं करेंगे (यही कारण है कि यह थोड़ा सा दिखता है जैसे आप जो कर रहे हैं वह ऐसा लगता है)। (देखें git-scm.com/docs/git-merge#Documentation/… ।)
माइकबटन

0

संपादित करें:

दस्तावेजों नीचे मेरा जवाब मर्ज के लिए एक रास्ता masterमें aqहै, जहां अगर आप मर्ज उस पर किए गए परिवर्तनों को सूचीबद्ध करता है का विवरण देखने के aqमर्ज करने से पहले, नहीं परिवर्तन पर किए गए master। मैंने महसूस किया है कि शायद वह नहीं है जो आप चाहते हैं, भले ही आपको लगता है कि यह है!

बस:

git checkout aq
git merge master

ठीक है।

हां, यह सरल मर्ज दिखाएगा कि उस बिंदु से परिवर्तन masterकिए गए थे aq, दूसरे तरीके से नहीं; लेकिन यह ठीक है - क्योंकि वही हुआ है! बाद में, जब आप अंत में अपनी शाखा को मर्ज करते हैं master, तो वह यह है कि एक मर्ज आखिरकार आपके सभी परिवर्तनों को दिखाएगा master(जैसा कि आप चाहते हैं, और यही वह जगह है जहां लोग वैसे भी उस जानकारी को खोजने की उम्मीद करने जा रहे हैं)।

मैं जाँच की और गए भी पता चलता है बिल्कुल वैसा ही परिवर्तन (सभी पर किए गए परिवर्तनों को नीचे दृष्टिकोण aqके बाद से मूल के बीच विभाजन aqऔर master) के ऊपर सामान्य दृष्टिकोण, जब आप अंततः मर्ज सब कुछ वापस करने के लिए के रूप में master। इसलिए मुझे लगता है कि इसका एकमात्र वास्तविक नुकसान (अति-जटिल और गैर-मानक होने के अलावा ...: - /) यह है कि यदि आप एन हाल के परिवर्तनों को वापस हवा देते हैं git reset --hard HEAD~<n>और यह मर्ज पिछले हो जाता है, तो नीचे दिए गए संस्करण वापस नीचे रोल करते हैं 'गलत' शाखा, जिसे आपको हाथ से ठीक करना होगा (जैसे git reflog& के साथ git reset --hard [sha])।


[तो, मैंने जो पहले सोचा था कि:]

इसके साथ एक समस्या है:

git checkout aq
git merge master

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

दूसरी ओर

git checkout master
git merge aq

शो aq में की गई है, जो शायद परिवर्तन है कि आप क्या चाहते। (या, कम से कम, यह अक्सर वही होता है जो मैं चाहता हूं!) लेकिन सही बदलाव दिखाने वाला मर्ज गलत शाखा पर है!

सामना कैसे करें?!

पूर्ण प्रक्रिया, ऐज पर किए गए परिवर्तनों को दिखाते हुए एक मर्ज कमिट के साथ समाप्त होती है (जैसा कि ऊपर दूसरे मर्ज के अनुसार), लेकिन मर्ज के साथ ऑक ब्रांच को प्रभावित करने वाला है:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

यह: मास्टर पर aq को मर्ज करता है, फास्ट-फॉरवर्ड कि aq में एक ही मर्ज करता है, इसे मास्टर पर undoes करता है, और आपको फिर से aq पर वापस रखता है!

मुझे ऐसा लगता है कि मुझे कुछ याद आ रहा है - ऐसा लगता है कि आप स्पष्ट रूप से चाहते हैं, और ऐसा कुछ करना मुश्किल है।

इसके अलावा, रिबास समकक्ष नहीं है। यह aq पर किए गए कमिट्स की टाइमस्टैम्प और पहचान खो देता है, जो कि मैं चाहता भी नहीं हूं।


0

परिदृश्य:

  • मैंने मास्ट-ब्रांच -1 से मास्टर ब्रांच बनाई और उसे अपने लोकल में खींचा।
  • माई फ्रेंड ने मास्टर कहना शाखा -2 से एक शाखा बनाई।
  • उसने मास्टर में कुछ कोड परिवर्तन किए।
  • अब मैं उन परिवर्तनों को मास्टर शाखा से अपनी स्थानीय शाखा में ले जाना चाहता हूं।

समाधान

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

"गिट स्टैशन लागू" को निष्पादित करने के बाद आप अपनी फ़ाइल पर संघर्ष पा सकते हैं। आपको इसे मैन्युअल रूप से ठीक करने की आवश्यकता है और अब आप पुश करने के लिए तैयार हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.