एक शाखा में 'गिट पुल' कैसे करें जो वर्तमान नहीं है?


126

जब आप शाखा git pullपर चलते हैं master, तो यह आम तौर पर खींचता है origin/master। मैं नामक एक अलग शाखा में हूँ newbranch, लेकिन मैं एक आदेश है कि एक करता है चलाने की आवश्यकता git pullसे origin/masterमें master, लेकिन मैं नहीं चल सकता git checkoutजब तक के बाद पुल पूरा हो गया है चयनित शाखा बदलने के लिए। क्या इसे करने का कोई तरीका है?

कुछ पृष्ठभूमि देने के लिए, भंडार एक वेबसाइट को संग्रहीत करता है। मैंने newbranchवेबसाइट में स्विच करके उनमें कुछ बदलाव किए हैं और उन्हें तैनात किया है newbranch। अब उन परिवर्तनों को masterशाखा में विलय कर दिया गया है , मैं वेबसाइट को वापस masterशाखा में बदलने की कोशिश कर रहा हूं । इस बिंदु पर, newbranchऔर origin/masterसमान हैं, लेकिन masterपिछड़ रहा है origin/masterऔर इसे अद्यतन करने की आवश्यकता है। समस्या यह है, अगर मैं इसे पारंपरिक तरीके से करता हूं:

$ git checkout master
   # Uh oh, production website has now reverted back to old version in master
$ git pull
   # Website is now up to date again

मुझे उपरोक्त ( git checkout master && git pull) के समान ही प्राप्त करने की आवश्यकता है , लेकिन प्रक्रिया के दौरान कार्यशील निर्देशिका को पहले के संशोधन में बदले बिना।


@phi: मुझे नहीं लगता कि यह काम करेगा, क्योंकि मैं अंदर हूँ newbranchऔर वहाँ कुछ भी नहीं है!
मालवीयस

मैं एक नई निर्देशिका में क्लोन करूंगा, न्यूबर्न्च को मास्टर में मर्ज करूंगा, न्यूब्रांच में मास्टर को वापस मर्ज करूंगा, फिर आप जहां हैं, वहां से पुल खींच लेंगे। मास्टर और न्यूब्रांच समान होंगे।
AET

@ और वह अभी से अपनी वर्तमान निर्देशिका में ऐसा कर सकता git fetch; git merge origin/masterहै newbranch। रिपॉजिटरी की पूरी दूसरी प्रति का क्लोनिंग करने के लिए शून्य लाभ है।
meagar


जवाबों:


5

आपको एक ऐसी कार्यशैली मिली है जिसे आप स्पर्श नहीं करना चाहते हैं, इसलिए किसी अन्य का उपयोग करें। क्लोन सस्ता है, यह इसके लिए बनाया गया है।

git fetch origin master       # nice linear tree
git clone . ../wip -b master  # wip's `origin/master` is my `master`
cd ../wip                     # .
git pull origin origin/master # merge origin's origin/master
git push origin master        # job's done, turn it in.
cd ../main
rm -rf ../wip                 # wip was pushed here, wip's done

git checkout master           # payload

यहाँ अन्य सभी उत्तरों के साथ समस्या है, वे वास्तव में पुल नहीं करते हैं। यदि आपको उस मर्ज या रिबेस की आवश्यकता है जिसके लिए आपको सेट अप मिल गया है, तो आपको एक और वर्कट्री और उपरोक्त प्रक्रिया की आवश्यकता है। नहीं तो बस git fetch; git checkout -B master origin/masterकरेंगे।


2
जब आप चलाते हैं git checkout masterतो आप पुरानी masterशाखा को चेकआउट करेंगे क्योंकि आपने इसे मूल / मास्टर के साथ सिंक्रनाइज़ करने के git pullलिए mainफ़ोल्डर में नहीं किया है । यही मैं बचने की कोशिश कर रहा हूं।
माल्वेनियस

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

लाइन 6 पर आप मर्ज किए गए (अपडेट किए गए) को masterवापस धकेल देते हैं origin, लेकिन मुझे विश्वास नहीं होता कि आपका अंतिम चेकआउट इस अपडेट का है master। निर्देशिका में शाखा git pullको अपडेट करने के लिए कोई भी नहीं है , इसलिए जब तक मैं कुछ याद नहीं कर रहा हूं तब तक आपके आदेश केवल अपने आप से चलने और पुराने पेड़ को प्राप्त करने से अलग नहीं हैं । यदि आप बारीकी से देखते हैं, तो आप उस निर्देशिका में कोई कमांड नहीं चला रहे हैं , जो अपस्ट्रीम (लाइन 1 के अलावा, जो आपके द्वारा अपस्ट्रीम रेपो में कोई बदलाव किए जाने से पहले चलाया जाता है) को चला रही है।mastermaingit checkout mastermastermain
मालवीनस

ठीक है, आप इसे टेस्ट रेपो पर आज़मा सकते हैं, या पुश डॉक्स की जाँच कर सकते हैं।
jthill

1
@jwg की तुलना में, कृपया? ओपी की सभी जरूरतों को पूरा करना सुनिश्चित करें।
jthill

163

सीधा: वर्तमान में चेक-आउट शाखा मास्टर में दूरस्थ शाखा से अद्यतन करना :

git fetch origin master:master

जहां मूल आपका रिमोट है और वर्तमान में आप कुछ शाखा जैसे देव में जांचे जाते हैं ।

यदि आप एक बार में निर्दिष्ट शाखा के अलावा अपनी वर्तमान शाखा को अपडेट करना चाहते हैं:

git pull origin master:master

4
हम्म, ऐसा लगता है कि यह हमेशा काम नहीं करता है, हालांकि; मुझे सिर्फ अपनी WIP शाखा के साथ विलय करने का संकेत मिला।
अंडरस्कोर_ड

मेरे लिए @underscore_d वही।
ग्रेग

1
मेरे लिए काम किया ... अगर यह विलीन होने का संकेत देता है, तो मुझे लगता है कि आपकी शाखा में ऐसे बदलाव हैं जो आप अपडेट कर रहे हैं जो मूल के लिए प्रतिबद्ध नहीं हैं
स्किम

2
यह कैसे काम करना है? यह मेरे लिए काम नहीं करता है, यह सिर्फ मूल / मास्टर को मेरी वर्तमान में चेक-आउट शाखा में विलय करने की कोशिश करता है।
मघेरीजेडे

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

90

इसका उत्तर यहां दिया गया है: चेकआउट का उपयोग किए बिना Git शाखाओं को मर्ज करना, अपडेट करना और खींचना

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

2
यह सबसे अच्छा है, क्योंकि यह बिना स्थानीय परिवर्तन के साथ काम करता है।
टॉमस गैंडर

2
यदि आप अभी उन नवीनतम परिवर्तनों को पकड़ना चाहते हैं जो आप करेंगे git fetch origin master:mastergit fetchअपने आप मान लेंगे कि आप वर्तमान शाखा को अपडेट करने के लिए हैं, न कि किसी अन्य शाखा को।
जॉन लेडिग्रेन 12

2
यह सबसे सरल और सबसे सीधा जवाब है। यह स्वीकृत उत्तर IMO होना चाहिए।
कीगो

@ जॉनीलीडग्रेन - सिवाय इसके हमेशा की तरह काम नहीं करता। Stackoverflow.com/a/42902058/274579 उत्तर के लिए टिप्पणियां देखें ।
ysap

22

जैसा कि यह पता चला है, उत्तर भ्रामक सरल है:

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

यह आपको अपडेट कर सकते हैं masterजब तक यह पर स्विच किए बिना शाखा के बाद यह अद्यतन किया गया है।


11
यह वह नहीं करता है जो आपने पूछा था कि कैसे करना है।
jthill

जैसा कि ऊपर टिप्पणी में कहा गया है, आप जिस सवाल को पूछ रहे हैं वह वास्तव में वह सवाल नहीं है जिसका आपने उत्तर दिया है। आपको अपने प्रश्न को अपडेट करना चाहिए ताकि यह विशेष रूप से एक शाखा में विलय किए बिना इसे बाहर की जाँच के बारे में कम हो, और पहले से पुराने संस्करण की जांच किए बिना रिमोट पर उपलब्ध शाखा के नवीनतम संस्करण पर सीधे स्थानांतरित करने के बारे में।
meagar

1
यह बिल्कुल जवाब है कि मैं यहाँ आया था :)
सोफिस्टिफ़ंक

1
ओपी नहीं चाहता था, लेकिन ईमानदार होने में मेरी मदद की।
मार्सेल ब्रो

1
@anoniim, ओपी क्या नहीं चाहता था? आप ओपी मतलब है कि सिर्फ इस सवाल का जवाब दिया?
3

12

आप ऐसी किसी चीज़ के बारे में चिंतित हैं, जिसे ठीक नहीं किया जा सकता, क्योंकि Git ऑपरेशंस परमाणु नहीं हैं। आपके पास हमेशा एक छेद होगा जहां आपकी कामकाजी निर्देशिका शाखाओं के बीच आधा रास्ता है , भले ही आप इसे पहले स्विच किए बिना मास्टर अपडेट करें। यही कारण है कि गिट एक परिनियोजन उपकरण नहीं है

चूंकि आप वास्तव में अपने उत्पादन वातावरण में कोड नहीं कर रहे हैं (मुझे उम्मीद है), आपको वास्तव में एक शाखा की जाँच करने की आवश्यकता नहीं है। आप बस git fetchअपने दूरस्थ refs को अपडेट करने के लिए कर सकते हैं , और फिर वर्तमान में इंगित की गई कमेटी को सीधेgit checkout origin/master कार्यशील निर्देशिका में स्थानांतरित कर सकते हैं । यह आपको एक अलग सिर की स्थिति में डाल देगा, लेकिन फिर से, जैसा कि आप कोड नहीं कर रहे हैं, इससे कोई फर्क नहीं पड़ता।origin/master

यह आपके द्वारा प्राप्त किया जाने वाला सबसे छोटा छेद है, लेकिन जैसा कि मैंने कहा, एक छेद अभी भी मौजूद है; checkoutपरमाणु नहीं है।


मैं तैनाती के लिए गिट का उपयोग करने की सीमाओं को समझता हूं, समस्या यह है कि इस मामले में छेद एक सेकंड से कम के बजाय मिनट लंबा होने वाला है। origin/masterहालांकि बाहर की जाँच के बारे में अच्छा विचार है , कि बस चाल हो सकती है।
मालवीस

क्या छेद "मिनट" को लंबा बनाता है? पूरे नेटवर्क में डेटा खींचना? बस एक कर git fetchइससे पहले कि आप कुछ और करने और रास्ते से बाहर डेटा के वास्तविक हस्तांतरण मिलता है।
meagar

यह लंबे समय से है क्योंकि एक (अब) अनट्रैक की गई फ़ाइल को पहले की प्रतिबद्ध द्वारा अधिलेखित कर दिया जाएगा। तो मुझे फाइल को कॉपी करना है, गिट स्टफ करना है, फिर वापस रखना है। The मिनट लंबा ’मेरी टाइपिंग स्पीड से आता है। (हाँ, मैं इसे
लिपिबद्ध

3

आप इसके लिए अपडेट-रेफ का उपयोग कर सकते हैं:

git fetch
git update-ref refs/heads/master origin/master
git checkout master

ध्यान दें कि यह मास्टर शाखा में किसी भी स्थानीय आवागमन को दूर फेंक देगा। आपके मामले में ऐसा नहीं होगा, इसलिए यह ठीक है। ऐसा करने की कोशिश करने वाले अन्य लोगों के लिए जहां स्थानीय कमिट हैं, मुझे नहीं लगता कि यह संभव है, क्योंकि मर्ज केवल वर्तमान शाखा पर चलाया जा सकता है।


क्या यह इसके बराबर होगा git branch --force master origin/master? यह बलों स्थानीय सिर masterबात करने के लिए के मुखिया के originरोंmaster
Keego

2

मेरे लिए माल्विनस का समाधान काम करता है

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

सिर्फ त्रुटि देने में


warning: not deleting branch 'master' that is not yet merged to
         'refs/remotes/origin/master', even though it is merged to HEAD.
error: The branch 'master' is not fully merged.
If you are sure you want to delete it, run 'git branch -D master'.

इसलिए मैं -D विकल्प के साथ दौड़ता हूं

धन्यवाद


0

git fetch origin master:master

  • "पुल्स" (वास्तव में प्राप्त होता है) master
  • यदि आपके पास ऐसे परिवर्तन masterहैं जो अभी तक धकेले नहीं गए हैं,origin/master तो आपके गुरु में विलय कर दिया जाता है।
  • यदि मर्ज संघर्ष हैं, तो आपको पहले उन्हें हल करना होगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.