2012-03-01 17 views
189

मैं लंबे समय तक शाखा पर विकसित होने के बाद मास्टर पर स्विच करता हूं। लॉग दिखाता है:शाखा को आगे बढ़ने के लिए कैसे तेजी से आगे बढ़ाना है?

आपकी शाखा 167 कामों द्वारा 'उत्पत्ति/मास्टर' के पीछे है, और इसे तेजी से अग्रेषित किया जा सकता है।

मैंने कोशिश की:

git checkout HEAD 

यह कोई प्रभाव नहीं है। इसका कारण यह है कि मैंने मास्टर पर इंटरमीडिएट प्रतिबद्धता की जांच की है।

मास्टर पर मास्टर रहने के लिए कैसे करें?

उत्तर

207

कर:

git checkout master 
git pull origin 

लाने और origin/master शाखा में मर्ज हो जाएगी (आप बस git pull कह सकते हैं के रूप में मूल डिफ़ॉल्ट है)।

+41

मुझे लगता है कि रोब का जवाब बेहतर है तो सुझाए गए उत्तर से बेहतर है। मुझे आम तौर पर इस स्थिति का सामना करना पड़ता है जहां मैंने अभी खींच लिया है * और फिर मैं एक अलग शाखा में स्विच करता हूं, जिसे तेजी से अग्रेषित करने की आवश्यकता होती है। यह मुझे परेशान करता है अगर मुझे एक और (नो-ऑप) खींचना है और इसे पूरा करने की प्रतीक्षा है; स्थानीय-केवल ऑपरेशन करना तेज़ है और वही है जो मैं चाहता हूं। –

270

git merge origin/master आज़माएं। यदि आप यह सुनिश्चित करना चाहते हैं कि यह केवल तेज़-आगे करता है, तो आप git merge --ff-only origin/master कह सकते हैं।

+4

यह उपयोग करना अच्छा होता है जब आपके रिमोट के पास कुछ प्रमाणीकरण हुप्स के माध्यम से कूदने के लिए होता है। जब मैं एक शाखा में खींचता हूं, तो मुझे प्रमाणित करना होता है। फिर, जब मैं दूसरी शाखा में जाता हूं (यानी, मेरे बदलावों को चुनने के लिए), मैं इस 'मर्ज' कमांड का उपयोग करना पसंद करता हूं ताकि मुझे पुनः प्रमाणीकरण करने की आवश्यकता न हो। – RustyTheBoyRobot

+19

'--ff-only' बेहद उपयोगी है। – Luke

+1

मुझे नहीं पता कि 'मूल/मास्टर' भाग की आवश्यकता है या यदि यह समझदारी से डिफ़ॉल्ट है, लेकिन मुझे तेजी से आगे के लिए उपनाम बनाने में उपयोगी लगता है, इसलिए मैं यह सुनिश्चित करना चाहता था कि अपस्ट्रीम शाखा का उपयोग हार्ड कोडिंग के बजाय किया जाता है 'मूल/मास्टर'' के लिए: 'ff = merge --ff-only @ {u} '(' @ {u} 'अपस्ट्रीम है)। – Thor84no

26
git checkout master 
git pull 

नौकरी करना चाहिए।

मास्टर से अलग शाखा पर काम करते समय आपको "आपकी शाखा पीछे है" संदेश प्राप्त होगा, कोई मास्टर में परिवर्तन करता है और आप खींचते हैं।

(branch) $ //hack hack hack, while someone push the changes to origin/master 
(branch) $ git pull 

अब मूल/मास्टर संदर्भ खींच लिया जाता है, लेकिन अपने गुरु इसके साथ का विलय नहीं किया है

(branch) $ git checkout master 
(master) $ 

अब मास्टर मूल/मास्टर के पीछे और तेजी से अग्रेषित किया जा सकता है

this will pull and merge (so merge also newer commits to origin/master) 
(master) $ git pull 

this will just merge what you have already pulled 
(master) $ git merge origin/master 

अब आपके मास्टर और मूल/मास्टर सिंक में हैं

29

आपकी स्थिति में, git rebase यह भी चाल करेगा। चूंकि आपके पास मास्टर में कोई बदलाव नहीं है, इसलिए गिट बस तेज़ी से आगे बढ़ेगा। यदि आप रीबेज वर्कफ़्लो के साथ काम कर रहे हैं, तो यह अधिक सलाह दे सकता है, क्योंकि यदि आप गड़बड़ करते हैं तो आप विलय प्रतिबद्धता के साथ समाप्त नहीं होंगे।

[email protected]:~/work$ git status 
# On branch master 
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded. 
# (use "git pull" to update your local branch) 
# 
nothing to commit, working directory clean 
[email protected]:~/work$ git rebase 
First, rewinding head to replay your work on top of it... 
Fast-forwarded master to refs/remotes/origin/master. 
# On branch master 
nothing to commit, working directory clean 
+0

और मेरे लिए बहुत उपयोगी है क्योंकि हमें गिट पुल का उपयोग नहीं करना चाहिए! – Stefan

+0

भले ही आपके पास कुछ बदलाव लंबित है, फिर भी आप हमेशा छेड़छाड़ कर सकते हैं और पुनर्जीवित कर सकते हैं, मुझे नहीं पता कि यह 'उचित' तरीका है लेकिन आश्चर्यजनक काम करता है। –

2

कोई जटिलताओं आवश्यक बस अपने शाखा में खड़े होकर एक Git खींच यह केवल मामले में मुझे

के लिए काम किया या, एक दूसरे के रूप में Git पुल मूल मास्टर कोशिश करता है, तो आप बदकिस्मत रहे हैं पहले आदेश के साथ

5

आप एक अलग शाखा पर खड़े और मास्टर के नवीनतम संस्करण चेकआउट करने के लिए चाहते हैं, तो आप भी ऐसा कर सकते हैं

git checkout -B master origin/master

0

प्रमुख करने के लिए अपने ब्रंच सूचक ले जाना: आपका शाखा master पहले से मौजूद है

git branch -f master 

, तो Git आप इसे अधिलेखित करना, जब तक आप का उपयोग की अनुमति नहीं होगी ... -f (इस तर्क --force के लिए खड़ा है)

या आप रिबेस उपयोग कर सकते हैं:

git rebase HEAD master 

अपने जोखिम पर यह करो;)

0

करने के लिए रिबेसवर्तमान स्थानीय ट्रैकर शाखा नवीनतम दूरस्थ राज्य के शीर्ष पर स्थानीय परिवर्तन चलती:

$ git fetch && git rebase 

आम तौर पर, तेजी से आगे और स्थानीय परिवर्तनों को छोड़ने के लिए (मुश्किल रीसेट) *:

$ git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name} 

को तेजी से आगे और स्थानीय परिवर्तन (rebase) रखें:

$ git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name} 

* - कि उलटे क्रम में प्रमुख के राज्य को प्रदर्शित करता है अनजाने में मुश्किल की वजह से रीसेट पहले git reflog कर परिवर्तन, पूर्ववत करने के लिए , हैश हेड को रीसेट ऑपरेशन (आमतौर पर स्पष्ट) से पहले इंगित कर रहा था और उस हैश को शाखा को रीसेट करना मुश्किल था।

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

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