कैसे एक साथ कई शाखाओं में खींचने के लिए?


13

रेपो में मेरी कई शाखाएँ हैं, उनमें से "मास्टर" और "विकसित" हैं, जो दूरस्थ शाखाओं "मूल / मास्टर" और "उत्पत्ति / विकास" को ट्रैक करने के लिए स्थापित किए गए हैं।

क्या यह निर्दिष्ट करना संभव है कि मैं चाहता हूं कि मास्टर और विकास दोनों को एक साथ विलय (तेजी से अग्रेषित) किया जाए?

जब मैं git pullअब ऐसा कुछ करता हूं:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

सभी दूरस्थ शाखाओं को प्राप्त किया जाता है, लेकिन वर्तमान में मैं जिस शाखा पर हूं, उसका केवल उसी संबंधित शाखा से विलय होता है।

तो मुझे करना होगा git checkout master...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

... और फिर git pullफिर से, और फिर वांछित परिणाम प्राप्त करने के लिए, विकास के लिए वापस स्विच करें।

मुझे पता है कि मैं इन चरणों को करने वाले उपनाम / स्क्रिप्ट बना सकता हूं। लेकिन मैं इससे बचना चाहता हूं कि यदि संभव हो, तो यह त्रुटि प्रवण है और बहुत कुशल नहीं है
संपादित करें: ठीक है, मुझे लगता है कि rephrase। मेरा लक्ष्य पटकथा / उपनाम के अनुरूपीकरण पर रोक या हतोत्साहित करना नहीं था। अगर यह मौजूद है तो मैं सिर्फ एक बिलिन समाधान पसंद करूंगा :)


मैंने कोशिश की, git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/masterलेकिन इससे दूरस्थ मास्टर का विकास हो गया ..
Superole

1
यह त्रुटिपूर्ण या अक्षम क्यों होगा? Git को इस तरह से अनुकूलित करने का इरादा है। बीटीडब्ल्यू, प्रत्येक शाखा की जांच करने से बचने के लिए, आप अपने प्रत्येक शाखा pullमें एक के fetchबाद विभाजित करना चाह सकते हैं merge
19-28 को jjlin

@jjlin अच्छी तरह से अगर मैं प्रत्येक शाखा की जांच किए बिना कर सकता हूं जो दक्षता पर मदद कर सकती है। यह त्रुटि प्रवण है क्योंकि चीजों का मैट्रिक्स गलत हो सकता है और बाकी स्क्रिप्ट पर इसका प्रभाव पड़ सकता है। मैं यह नहीं कह रहा हूं कि इसे सुरक्षित बनाना संभव नहीं है, लेकिन यह एक व्यापार बंद होगा। तो मैं एक अंतर्निहित समाधान पसंद करूंगा अगर यह मौजूद है :)
Superole

जवाबों:


11

आप एक ऐसा उपनाम सेट कर सकते हैं जो git fetchकेवल एक कमांड के साथ अपनी शाखाओं को तेजी से अग्रेषित करने के लिए रीस्पेक के साथ उपयोग करता है । इसे अपनी उपयोगकर्ता .gitconfigफ़ाइल में अन्य नाम के रूप में सेट करें :

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

उपयोग: git sync

यहाँ क्यों यह काम करता है:

  1. git checkout --quiet HEADसीधे आपकी वर्तमान प्रतिबद्धताओं की जाँच करता है, आपको अलग राज्य में डाल देता है । इस तरह, यदि आप चालू हैं masterया develop, आप अपनी कार्यशील प्रतिलिपि को उन शाखा बिंदुओं से अलग कर लेते हैं, जिससे उन्हें स्थानांतरित किया जा सकता है (Git आपको शाखा संदर्भों को स्थानांतरित करने की अनुमति नहीं देगा, जबकि आपकी कार्य प्रतिलिपि ने उन्हें चेक आउट कर दिया है)।

  2. git fetch origin master:master develop:developआपके स्थानीय रेपो में और शाखाओं fetchको तेज़ी से अग्रेषित करने के लिए रीस्पेक का उपयोग करता है । वाक्यविन्यास मूल रूप से Git को बताता है "यहाँ फॉर्म का एक refspec है , इसे उसी बिंदु पर ले और तेज़ी से अग्रेषित करें "। इसलिए उपनाम में स्रोत से शाखाएं हैं , जबकि गंतव्य उन शाखाओं के स्थानीय रेपो संस्करण हैं।masterdevelop<source>:<destination><destination><source>origin

  3. अंत में, git checkout --quiet -पिछली शाखा की विफलता की परवाह किए बिना, चाहे आप जिस शाखा पर थे , उसकी जाँच करें। इसलिए यदि आप masterदौड़ने के दौरान थे git sync, और सब कुछ सफल रहा, तो आप अलग-अलग हेड स्टेट छोड़ देंगे और नए अपडेट की जांच करेंगे master

मेरे उत्तर को भी देखें : स्थानीय शाखा को अपडेट किए बिना उसे अपडेट करें?


मैं यहाँ अलग-थलग-जादू को नहीं समझता, विकास की जाँच करने पर सूचक को मास्टर में स्थानांतरित क्यों नहीं किया जा सकता है? ... वैसे भी मैंने यह कोशिश की, और यह काम करने लगता है सिवाय अब मुझे "आपकी शाखा 1 प्रतिबद्ध द्वारा 'उत्पत्ति / विकास' से आगे है।"
सुपरोल

... जो अगली बार जब मैं खींचता हूं तो हल हो जाता है
सुपरओल

@ उर्फ का उपयोग करते समय कौन सी शाखा आगे है origin/develop? यह समझ में नहीं आता अगर यह आपकी स्थानीय developशाखा थी। इसके अलावा, पॉइंटर के लिए master ले जाया जा सकता है अगर इसकी developजाँच की जाती है, तो बिंदु यह है कि यदि इसकी masterजाँच की जाती है, तो आप तेज़ी से अग्रेषित नहीं कर सकते हैं masterक्योंकि इससे आपकी वर्किंग कॉपी प्रभावित होगी, इसलिए आप वर्किंग कॉपी को अलग कर सकते हैं। पहले इसका उपयोग करके git checkout head। मैंने एक और जवाब देखा जिसने इसे "एक चट्टान पर खड़ा" के रूप में वर्णित किया, आपको इसे स्थानांतरित करने से पहले चट्टान से उतरना होगा।
40XUserNotFound

यह वास्तव में मेरा स्थानीय विकास था। और इसका कारण यह होना चाहिए कि यह भ्रूण ट्रैकिंग शाखाओं को अपडेट नहीं करता है। जैसा मुझे समझ में आया; एक पुल उत्पत्ति / विकास में लाएगा, और फिर उस विलय को विकसित करेगा।
सुपर होल

यह बहुत महत्वपूर्ण है कि यह उत्तर का कारण बनता है fatal: bad config line xx in file xxx। जो अर्धविराम के कारण होता है। इस समस्या से बचने के लिए आपको पूरी कमांड को डबल कोट में लपेटना होगा।
विलियम लेउंग

1

गिट-अप स्थापित करें । यह आपको वह आदेश देता है, git-upजो आपके भंडार में सभी स्थानीय शाखाओं को खींच लेगा।


मिठाई! मैं यह सुनिश्चित करने के लिए जाँच करूँगा।
सुपर नोवेल

2
heh: P स्टेटमेंट्स विंडोज सपोर्ट का अनुमान अनुपस्थित है। और एक कठोर प्रमाण अभी तक तैयार नहीं किया गया है कि यह निश्चित रूप से आपके git सेटअप के साथ खिलवाड़ नहीं करेगा, आपकी ओर से Hacker News में डेटा या पोस्ट इनटेन ड्राइवल को हटा देगा। , रूबी की आवश्यकता के साथ, मुझे दूर कर दिया। मैं हालांकि अवधारणा पसंद है।
सुपरले

खुशी है कि सभी में एक तरीका है ... थोड़े चूना, हालांकि हर एक विधि में कुछ तीसरे पक्ष के उपकरण की आवश्यकता होती है । जैसे कि यह एक और कुछ शेल कमांड "रेसिपी" या किसी विशेष (प्लेटफ़ॉर्म-विशिष्ट) शेल के उपयोग का उपनाम है।
0xC0000022L

0

ऐसा लगता है कि कई शाखाओं में खींचने के लिए गिट के लिए कोई बिल्टइन विकल्प नहीं है। कम से कम संस्करण 1.8.0 में नहीं। हालांकि @ कपकेक का जवाब इसके करीब है।

हालाँकि @ jjlin की टिप्पणी ने मुझे एहसास दिलाया कि कम से कम मुझे दो बार खींचने की आवश्यकता नहीं है।

तो थोड़ा और कुशल क्रम होगा:

git pull
git checkout master
git merge origin/master
git checkout -

अनिवार्य रूप से मैंने एक उपनाम बनाकर समाप्त कर दिया, लेकिन इसमें से बाहर निकलने का फैसला किया, और बस एक अलग शाखा को अग्रेषित करने पर ध्यान केंद्रित किया।

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

बेशक, कोई भी परीक्षण इस उपनाम के साथ नहीं मानता है कि मैं 1 तर्क के रूप में एक ff'able शाखा का वैध नाम प्रदान करता हूं, और अन्यथा अपरिभाषित व्यवहार करता हूं। यह दो से अधिक शाखाओं वाले उपयोग-मामलों के लिए भी इष्टतम नहीं है, लेकिन यह मुझे वही मिलेगा जो मुझे अभी चाहिए।

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