एक शाखा को तेजी से कैसे आगे बढ़ाएं?


249

मैंने एक शाखा पर लंबे समय तक विकसित होने के बाद मास्टर में बदल दिया। लॉग दिखाता है:

आपकी शाखा 167 द्वारा 'मूल / मास्टर' के पीछे है, और इसे तेजी से आगे बढ़ाया जा सकता है।

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

git checkout HEAD

इसका कोई असर नहीं हुआ। ऐसा इसलिए है क्योंकि मैंने मास्टर पर इंटरमीडिएट कमिटमेंट चेक किया है।

गुरु को सिर पर कैसे रखा जाए?


6
git checkout HEADकभी कुछ नहीं करता। HEADपहले से ही चेक-आउट का मतलब है।
एमेरे तापसी

जवाबों:


244

करते हुए:

git checkout master
git pull origin

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


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

353

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


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

30
--ff-onlyअत्यंत उपयोगी है।
ल्यूक

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

2
यदि आप ऑफ़लाइन हैं तो सुझाए गए उत्तर से बेहतर है
Jacek Pietal

1
क्या आप बता सकते हैं कि एक साधारण पुल एक ही काम क्यों नहीं करता है? इसके अलावा, पुल अभी भी जरूरत है अगर हम ऐसा करते हैं?
ज़ुजु कॉर्नेलियू

40

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

username@workstation:~/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
username@workstation:~/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

1
और मेरे लिए बहुत उपयोगी है क्योंकि हम गिट पुल का उपयोग करने वाले नहीं हैं!
स्टेफन

यहां तक ​​कि अगर आपके पास कुछ बदलाव लंबित हैं, तो आप हमेशा संघर्ष कर सकते हैं और रिबेस कर सकते हैं, मुझे नहीं पता कि यह 'उचित' तरीका है, लेकिन अद्भुत काम करता है।
एफ एन।

28
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

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


13

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

git checkout -B master origin/master


9

किसी को भी है कि फास्ट फॉरवर्ड करना चाहता है के लिए वे कर रहे हैं पर नहीं है कि शाखा बाहर की जाँच के बिना (अपने आप सहित) एक और दूरस्थ शाखा के लिए, आप कर सकते हैं:

git fetch origin master:other

यह मूल रूप से तेजी से आगे के सूचकांक otherको origin/masterअगर आप पर नहीं हैं otherशाखा। आप इस तरह से कई शाखाओं को तेजी से आगे बढ़ा सकते हैं।

यदि आप कुछ समय के लिए दूसरी शाखा पर काम कर रहे हैं, और दूरस्थ शाखाओं को उनके संबंधित प्रमुख के पास अद्यतन करना चाहते हैं:

git fetch origin master:master other:other etc:etc

2

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

या, यदि आप पहले आदेश के साथ अशुभ हैं, तो केवल दूसरी स्थिति में ही मूल गुरु की कोशिश करें


0

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

$ git fetch && git rebase

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

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

करने के लिए तेजी से आगे और स्थानीय परिवर्तन (रखने रिबेस ):

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

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


0

अपने मामले में, तेज़-फॉरवर्ड करने के लिए, दौड़ें:

$ git merge --ff-only origin/master

यह --ff-onlyविकल्प का उपयोग करता है git merge, क्योंकि प्रश्न विशेष रूप से "फास्ट-फॉरवर्ड" के लिए पूछता है।

यहाँ एक अंश है git-merge(1)जो अधिक तेजी से आगे के विकल्प दिखाता है:

--ff, --no-ff, --ff-only
    Specifies how a merge is handled when the merged-in history is already a descendant of the current history.  --ff is the default unless merging an annotated
    (and possibly signed) tag that is not stored in its natural place in the refs/tags/ hierarchy, in which case --no-ff is assumed.

    With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When
    not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

    With --no-ff, create a merge commit in all cases, even when the merge could instead be resolved as a fast-forward.

    With --ff-only, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.

मैं तेजी से आगे अक्सर पर्याप्त है कि यह एक उपनाम वारंट:

$ git config --global alias.ff 'merge --ff-only @{upstream}'

अब मैं इसे आगे-आगे चलाने के लिए चला सकता हूं:

$ git ff

-2

अपने ब्रांच पॉइंटर को HEAD में ले जाएं:

git branch -f master

आपकी शाखा masterपहले से मौजूद है, इसलिए git आपको इसे ओवरराइट करने की अनुमति नहीं देगा, जब तक कि आप उपयोग नहीं करते ... -f(यह तर्क खड़ा है --force)

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

git rebase HEAD master

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


1
यह कोशिश मत करो। यदि आपके पास निम्न स्थिति है तो बुरी चीजें होंगी: C0 --- C1 --- C2 --- C3 --- C4 (उस्ताद)। C0 --- C1 --- C2 --- B1 --- B2 --- B3 (dev) यदि आपका हेड B3 (देव) पर है और आप git ब्रांच -फ मास्टर करते हैं, तो आप C0 के साथ समाप्त हो जाएंगे - - सी 1 --- सी 2 --- बी 1 --- बी 2 --- बी 3 (देव) (मास्टर)। C3 --- C4 किसी भी शाखा से उपलब्ध नहीं हैं और अंततः कचरा एकत्र किया जाएगा। यदि आप इस स्थिति में खुद को पाते हैं तो नई शाखा बनाने के लिए -b <शाखा> विकल्प के साथ रीफ़्लॉग और चेकआउट C4 कमिट देखें।
a_P
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.