विकास शाखा में मास्टर से पकड़ पुल


493

मेरे पास dmgr2 (विकास) नामक एक शाखा है और मैं मास्टर शाखा (लाइव साइट) से खींचना चाहता हूं और मेरी विकास शाखा में सभी परिवर्तनों को शामिल करना चाहता हूं। क्या ऐसा करने के लिए इससे अच्छा तरीका है? यहाँ है कि मैंने क्या करने की योजना बनाई थी, परिवर्तनों को करने के बाद:

git checkout dmgr2
git pull origin master

इसे मेरी विकास शाखा में लाइव परिवर्तन खींचना चाहिए, या क्या मेरे पास यह गलत है?


1
पहले dmgr2 शाखा में अपने सभी परिवर्तन करें। और उसके बाद मास्टर 1.git चेकआउट गुरु को इंगित और फिर नवीनतम परिवर्तन 2.git पुल 3.git मर्ज dmgr2 4.git धक्का -u मूल गुरु मिल और फिर अपने dmgr2 5.git चेकआउट dmgr2 के लिए वापस जाओ
mat_vee

मैंने पहले ही dmgr2 शाखा में अपने सभी परिवर्तन कर लिए हैं, क्षमा करें कि वह जोड़ना भूल गया है
मैथ्यू कोली

1
अगर मैं चरण 4 करता हूं, तो मेरे विकास के बदलावों को मास्टर में नहीं धकेलूंगा? मैं ऐसा नहीं करना चाहता
मैथ्यू कॉली

तो आप क्या कह रहे हैं कि आप अपनी मास्टर शाखा से परिवर्तन को अपनी देव शाखा में लाना चाहते हैं?
जेकेकेल्ले

9
devएक के साथ शाखा में स्विच करें git checkout dev। तब git pull --rebase origin master। यदि आप भाग्यशाली हैं, तो कोई संघर्ष नहीं होगा और देव के पास मास्टर से नवीनतम परिवर्तन होंगे।
jww

जवाबों:


722

आपके द्वारा सूचीबद्ध कदम काम करेंगे, लेकिन एक लंबा रास्ता है जो आपको अधिक विकल्प देता है:

git checkout dmgr2      # gets you "on branch dmgr2"
git fetch origin        # gets you up to date with origin
git merge origin/master

fetchआदेश किसी भी बिंदु पर किया जा सकता है पहले merge, यानी, आप के आदेश स्वैप कर सकते हैं लाने और चेकआउट, क्योंकि fetchसिर्फ रिमोट नामित (के लिए खत्म हो जाता है origin) और यह करने के लिए कहते हैं: "गिम्मी सब कुछ आपको लगता है कि मैं नहीं है “, अर्थात, सभी सभी शाखाओं पर आधारित है। वे आपकी रिपॉजिटरी में कॉपी हो जाते हैं, लेकिन रिमोट पर origin/branchनामित किसी भी शाखा के लिए नामित branchहोते हैं।

इस बिंदु पर आप किसी भी दर्शक ( git log, gitkआदि) का उपयोग कर सकते हैं कि "उनके पास क्या है" यह देखने के लिए कि आप नहीं करते हैं, और इसके विपरीत। कभी-कभी यह केवल वार्म फजी फीलिंग्स के लिए उपयोगी होता है ("आह, हाँ, यह वास्तव में जो मैं चाहता हूं") और कभी-कभी यह पूरी तरह से रणनीति बदलने के लिए उपयोगी है ("वाह, मुझे अभी तक सामान नहीं चाहिए")।

अंत में, mergeकमांड दी गई कमिट को लेती है, जिसे आप नाम के रूप में ले सकते हैं origin/master, और उस कमिट और उसके पूर्वजों को लाने में जो कुछ भी लेता है, आप जिस भी शाखा में हैं, उसे चलाते हैं merge। आप तेजी से अग्रेषित करने के लिए सम्मिलित कर सकते हैं --no-ffया --ff-onlyरोक सकते हैं, या केवल तभी मर्ज कर सकते हैं जब परिणाम आपको पसंद हो, यदि आप चाहते हैं।

जब आप अनुक्रम का उपयोग करते हैं:

git checkout dmgr2
git pull origin master

pullआदेश का निर्देश चलाने के लिए git git fetch, और उसके बाद का नैतिक बराबर git merge origin/master। तो यह लगभग दो चरणों को हाथ से करने के समान है, लेकिन कुछ सूक्ष्म अंतर हैं जो शायद आपके संबंध में नहीं हैं। (विशेष रूप से fetchकदम से कदम केवलpull ऊपर लाता है , और यह आपके रेपो में रेफरी को अद्यतन नहीं करता है: 1 कोई भी नया हवाला केवल विशेष संदर्भ से हवा में भेजा जाता है ।) origin/masterFETCH_HEAD

यदि आप अधिक स्पष्ट git fetch origin(फिर वैकल्पिक रूप से चारों ओर देखते हैं) और फिर git merge origin/masterअनुक्रम का उपयोग करते हैं, तो आप masterरिमोट के साथ अपने स्वयं के स्थानीय को भी ला सकते हैं , fetchपूरे नेटवर्क में केवल एक रन के साथ :

git fetch origin
git checkout master
git merge --ff-only origin/master
git checkout dmgr2
git merge --no-ff origin/master

उदाहरण के लिए।


1 इस दूसरे भाग को बदल दिया गया है - मैं कहता हूँ "निश्चित" - git 1.8.4, जो अब "दूरस्थ शाखा" को अवसरवादी संदर्भ में अद्यतन करता है। (यह था, जैसा कि रिलीज नोट्स कहते हैं, अपडेट को छोड़ने के लिए एक जानबूझकर डिजाइन का निर्णय, लेकिन यह पता चला है कि अधिक लोग इसे पसंद करते हैं जो इसे अपडेट करते हैं। यदि आप पुरानी रिमोट-शाखा SHA-1 चाहते हैं, तो इसे सहेजने में चूक होती है। , और इस तरह से पुनर्प्राप्त करने योग्य, फिर से भरना। यह अपस्ट्रीम विद्रोहियों को खोजने के लिए एक नया git 1.9 / 2.0 सुविधा भी सक्षम करता है।)


28
मैं सिर्फ एक के लिए पूछ रहा हूँ, उह, दोस्त - आप यहाँ पर आने वाले पहले कोड ब्लॉक को कैसे चेक करेंगे (checkout / fetch / merge)?
रिच ब्रैडशॉ

10
@ रीचबर्डशॉ: git checkoutसामान्य रूप से गैर-विनाशकारी है और आम तौर पर git fetchइसे पूर्ववत करने का कोई कारण नहीं है , इसलिए ऐसा लगता है कि आप पूछ रहे हैं कि मर्ज कमिट कैसे करें। या तो: इस सवाल का जवाब अन्य प्रतिबद्ध के लिए के रूप में ही है git resetया git revert। के लिए अप्रकाशित परिवर्तन git resetआमतौर पर सबसे अच्छा तरीका है, अन्य परिवर्तनों के लिए पहले से ही git revertबेहतर हो सकता है, लेकिन मर्ज को वापस लाने के लिए लिनुस टोरवाल्ड की सलाह देखें: kernel.org/pub/software/scm/git/docs/howto/…
torek

2
@WeDoTDD: मुझे सवाल समझ नहीं आ रहा है। ग्राफ प्रतिबद्ध (देखने के लिए आदेशों की एक संख्या हैं gitk, git log --graphके साथ या बिना --oneline, और इतने पर) और आप कर सकते हैं git showया git show -mकिसी मर्ज के लिए प्रतिबद्ध है, या उपयोग git diff। इन सभी मामलों में, आप कमांड-लाइन पर कमांड दर्ज करते ही प्रोग्राम को निर्दिष्ट कर रहे हैं।
torek

1
@torek: अपना तरीका आज़माया: git checkout शाखा और फिर git पुल ओरिजिनल मास्टर, लेकिन इसने सभी मास्टर परिवर्तनों को एक एकल परिवर्तन के रूप में खींच लिया, जिसे स्थानीय स्तर पर फिर से प्रतिबद्ध होना चाहिए, बजाय इसके कि वे अपने प्रतिबद्ध इतिहास और संदेशों के साथ खींच लें, इसलिए स्थानीय अद्यतन करने के बाद मास्टर और शाखा में स्विच करने पर, "git rebase master" सभी संघर्षों को हल करने के लिए काम करता है, और फिर मैं "git pull --rebase" में जोड़ता हूं और फिर से सभी संघर्षों को संभालता हूं, और फिर सभी को प्राप्त करने के लिए git पुश ओरिजिन शाखा को संभालता हूं। मुझे लगता है कि इसके लिए बेहतर तरीका होना चाहिए - क्या मैं सही हूं?
user10556443

1
@torek: मैं सहमत हूं कि मुझे जो परिणाम मिला है वह एक थकाऊ प्रक्रिया है जो मुझे दोहराव और मर्ज को संभालने के लिए मजबूर करती है और ... हर बार जब मैं मास्टर से अपडेट प्राप्त करना चाहता हूं ... लेकिन, प्रस्तावित तरीका, जिसे मैं मानता हूं, बहुत है आसान, मास्टर कमिटमेंट आर्डर / इतिहास को ध्यान में रखे बिना स्थानीय शाखा में एक एकल परिवर्तन के तहत सभी परिवर्तन हुए। मुझे "
भ्रूण

14

स्थिति : मेरी स्थानीय शाखा में काम करना, लेकिन मुझे नामांकित विकास शाखा में अपडेट रखने का शौक है dev

समाधान : आमतौर पर, मैं करना पसंद करता हूं:

git fetch
git rebase origin/dev

15
सामान्य अस्वीकरण के साथ कि रिबास केवल तभी किया जाना चाहिए यदि स्थानीय शाखा केवल स्थानीय है, अर्थात, इसे कहीं भी धक्का नहीं दिया गया है क्योंकि यह इतिहास को फिर से लिखता है।
Locus

8

यह मेरे लिए काम किया। मास्टर से मेरी शाखा में नवीनतम कोड प्राप्त करने के लिए

git rebase origin/master


पहले मत भूलना git fetch origin
लीनोह

3

परिदृश्य :

मेरे पास मास्टर अपडेटिंग और मेरी शाखा अपडेट है, मैं चाहता हूं कि मेरी शाखा रिबासिंग के साथ मास्टर का ट्रैक रखें, सभी इतिहास को ठीक से ट्रैक करने के लिए, मैं अपनी शाखा को माइब्रेनच कहूं

समाधान :

git checkout master    
git pull --rebase    
git checkout Mybranch    
git rebase master
git push -f origin Mybranch
  • git mergetool & के साथ सभी संघर्षों को हल करने की आवश्यकता है, git rebase --continue, git rebase --skip, git add -u, स्थिति और git संकेत के अनुसार, जब तक कि सब हल न हो जाए

(अंतिम चरण में सुधार, तजाची कोहेन के सौजन्य से, "-f" बलों का उपयोग "इतिहास को अपडेट करने के लिए" करने के लिए किया गया है)

अब शाखा को मास्टर के साथ संरेखित किया जाना चाहिए और रिबूट किया जाना चाहिए, रिमोट अपडेट के साथ भी, इसलिए गिट लॉग में "पीछे" या "आगे" नहीं हैं, बस फ़ोल्डर "साफ" रखने के लिए सभी स्थानीय संघर्ष * .orig फ़ाइलों को हटाने की आवश्यकता है।

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