एक शाखा से दूसरी शाखा में कैसे जाएं?


727

मुझे अपने गुरु से दो शाखाएँ मिली हैं:

  • v2.1 : (संस्करण 2) मैं कई महीनों से काम कर रहा हूं
  • wss : जो मैंने अपने मास्टर (उत्पादन में) में एक विशिष्ट विशेषता जोड़ने के लिए कल बनाया था

वहाँ एक तरीका है कल wss से v2.1 को हिट करता है?


एक शाखा से दूसरी शाखा में कमिट्स (या कमिट की एक सीमा) को कॉपी करने के लिए इस उत्तर से मुझे सबसे अच्छी मदद मिली: stackoverflow.com/questions/1994463/…
caramba

जवाबों:


563

आपके पास वास्तव में एक वर्कफ़्लो होना चाहिए जो आपको मर्ज करके यह सब करने देता है:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

सब तो तुम करना है git checkout v2.1और git merge wss। अगर किसी कारण से आप वास्तव में ऐसा नहीं कर सकते हैं, और आप अपनी wss शाखा को सही जगह पर ले जाने के लिए git rebase का उपयोग नहीं कर सकते हैं , तो कमांड कहीं से एक प्रतिबद्ध करने और इसे कहीं और लागू करने के लिए git चेरी-पिक है । बस उस शाखा की जांच करें जिसे आप इसे लागू करना चाहते हैं, और चलाएं git cherry-pick <SHA of commit to cherry-pick>

कुछ तरीकों से छूट आपको बचा सकती है:

यदि आपका इतिहास इस तरह दिखता है:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

आप git rebase --onto v2 v2-only wssसीधे v2 पर wss को स्थानांतरित करने के लिए उपयोग कर सकते हैं :

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

तब आप विलय कर सकते हैं! यदि आप वास्तव में, वास्तव में, वास्तव में उस बिंदु तक नहीं पहुंच सकते हैं जहां आप विलय कर सकते हैं, तो आप अभी भी एक बार में कई चेरी-पिक्स को प्रभावी ढंग से करने के लिए रीबेस का उपयोग कर सकते हैं:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

नोट: ऐसा करने के लिए कुछ अतिरिक्त कार्य करने का कारण यह है कि यह आपकी रिपॉजिटरी में डुप्लिकेट कमिट बना रहा है। यह वास्तव में एक अच्छी बात नहीं है - आसान ब्रांचिंग और मर्जिंग का पूरा बिंदु कमिटमेंट को एक जगह बनाकर और उन्हें जहाँ भी ज़रूरत हो, वहाँ विलय करके सब कुछ करने में सक्षम होना है। डुप्लिकेट कमिट्स का मतलब है कि उन दोनों शाखाओं को मर्ज करने का कोई इरादा नहीं है (यदि आप तय करते हैं कि आप बाद में चाहते हैं, तो आपको संघर्ष मिलेगा)।


1
इस उत्तर से अधिक सहमत नहीं हो सके। +1। चेरी-पिकिंग के परिणामों को दर्शाने के लिए मेरा पुराना उत्तर भी देखें: stackoverflow.com/questions/881092/…
VonC

18
यह कैसे उचित तरीके से करने के लिए शानदार जवाब ! मेरी इच्छा है कि मैं ASCII चित्र बनाने के प्रयास के लिए दो बार मतदान कर सकूं।
1923

@VonC: समर्थन के लिए धन्यवाद, और चेरी-पिक नहीं करने के बारे में अतिरिक्त जानकारी - मुझे पता है कि मैंने वहां थोड़ा कंजूसी की। @ वार्ता: धन्यवाद! मुझे लगता है कि यह पूरी तरह से प्रयास के लायक है - बस git-rebase manpage देखें। इसे समझाने का कोई बेहतर तरीका नहीं है।
Cascabel

जैसा कि आप विलय करने में असमर्थ हो सकते हैं, क्योंकि - गिट विलय svit के साथ अच्छा नहीं खेलता है। एक एसवीएन शाखा से दूसरे तक कमिट्स की एक श्रृंखला की प्रतिलिपि बनाने के लिए, मैंने चेरी-पिकिंग को समाप्त किया और फिर एक आईएनजी फिर से git-svn-idपहले गलत संदर्भों को हटाने के लिए एक इंटरैक्टिव रिबेस / रीवर्ड प्रदर्शन dcommitकिया। हालांकि मैं शायद चेरी-पिक कदम को छोड़ सकता था और बस अपने आप से एक रिबास का इस्तेमाल करता था।
बॉब

1
यहाँ मेरा उपयोग मामला है: महत्वपूर्ण बग फिक्स सुविधा शाखा के लिए प्रतिबद्ध थे। मुझे अब इसे प्रोडक्शन में जाने की जरूरत है। इससे मेरा बट बच जाएगा।
कप्तान हाइपरटेक्स्ट

910

उपयोग

git cherry-pick <commit>

<commit>अपनी वर्तमान शाखा में आवेदन करने के लिए ।

मैं स्वयं संभवतः उन कमिटों को क्रॉस-चेक करूंगा, जिन्हें मैं अंदर ले जाता हूं gitkऔर चेरी-पिक करता हूं, बजाय इसके कि वे कमिट एंट्री पर राइट-क्लिक करते हैं।


यदि आप अपने सभी खतरों के साथ और अधिक स्वचालित (सभी खतरों के साथ) जाना चाहते हैं और कल से wss पर हुआ तो आप उपयोग की जाने वाली कमिट की सूची तैयार कर सकते हैं git log(साथ ही --prettyJefromi द्वारा सुझाए गए)

git log --reverse --since=yesterday --pretty=%H

तो सब कुछ एक साथ आप का उपयोग कर ग्रहण करते हैं bash

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

अगर यहां कुछ गलत हो जाता है (बहुत अधिक संभावना है) तो आप मुसीबत में हैं क्योंकि लाइव चेकआउट पर यह काम करता है, इसलिए या तो मैनुअल चेरी-पिक्स करें या फिर रिफ़र का उपयोग करें जैसे कि जेफ्रोमी द्वारा सुझाए गए।


- व्याख्या विकल्प के सभी प्लेसहोल्डर गिट-लॉग मैनपेज में हैं। आप अपनी इच्छानुसार कोई भी प्रारूप प्राप्त कर सकते हैं - विशेष रूप से उन क्षेत्रों को प्राप्त करने के लिए जो आप एक स्क्रिप्ट के लिए आसानी से पार्स करने योग्य रूप में प्राप्त कर सकते हैं।
Cascabel

मैं यह भी कहना चाहूंगा कि, यह मानते हुए कि आप वास्तव में डुप्लिकेट कमिट बनाना चाहते हैं, git rebaseमेरे जवाब में उपयोग करने का तरीका अधिक मजबूत है। विशेष रूप से, इस तरह के लिए लूप का उपयोग करना, अगर चेरी-पिक्स में से एक विफल हो जाता है, तो यह अभी भी बाकी सभी को करने की कोशिश करेगा। यह है ... बहुत अच्छा नहीं है, चलो कहते हैं।
Cascabel

2
माना। इसलिए मैं इसका उपयोग कभी नहीं करता हूं, लेकिन इसे मैन्युअल रूप से करता हूं। लेकिन चेरी-पिक अभी भी उत्तर है, कम से कम प्रश्न शीर्षक के लिए। मैंने प्रतिक्रिया को संशोधित किया।
बेंजामिन बानिएर

1
किसी ने एक पुरानी / गलत शाखा के लिए, और चेरी-पिक ने मुझे उस सही शाखा में डाल दिया (जबकि अभी भी उन्हें कमिटेटर के रूप में रखा गया है)। उत्तम।
पैट्रिक

8
एक दुर्लभ दृश्य, एक ऐसा gitउत्तर जो सरल और सीधे समाधान के लिए है, बजाय इसे समझने के लिए कि यह कितनी अच्छी तरह से उत्तर देने वाला है।
प्रेज़ेमेक डी

74

git cherry-pick : कुछ मौजूदा कमिट द्वारा शुरू किए गए परिवर्तनों को लागू करें

मान लें हम शाखा है एक साथ (एक्स, वाई, जेड) करता है। हमें इन कमिटों को शाखा B में जोड़ना होगा । हम cherry-pickसंचालन का उपयोग करने जा रहे हैं ।

जब हम उपयोग करते हैं cherry-pick, तो हमें शाखा बी पर उसी कालानुक्रमिक क्रम में कमिट जोड़ना चाहिए जो शाखा में दिखाई देते हैं ।

चेरी-पिक कमिट की एक सीमा का समर्थन करता है, लेकिन अगर आपके पास उस रेंज में मर्ज होता है, तो यह वास्तव में जटिल हो जाता है

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

वर्कफ़्लो का उदाहरण:

यहां छवि विवरण दर्ज करें

हम विकल्पों केcherry-pick साथ उपयोग कर सकते हैं

-e या --edit : इस विकल्प के साथ, git चेरी-पिक आपको कमिट करने से पहले प्रतिबद्ध संदेश को संपादित करने देगा।

-n या --no-प्रतिबद्ध : आमतौर पर कमांड स्वचालित रूप से कमिट का एक क्रम बनाता है। यह ध्वज किसी भी काम किए बिना, आपके काम करने वाले पेड़ और सूचकांक के लिए प्रत्येक नामित समिति को चेरी-पिक करने के लिए आवश्यक परिवर्तनों को लागू करता है। इसके अलावा, जब इस विकल्प का उपयोग किया जाता है, तो आपके सूचकांक को HEAD प्रतिबद्ध से मेल नहीं खाता है। चेरी-पिक आपके सूचकांक की शुरुआत की स्थिति के खिलाफ किया जाता है।

यहाँ एक दिलचस्प लेख से संबंधित है cherry-pick


19

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


16
यहां तक ​​कि अगर आप किसी कारण से चेरी-पिक (एस) / रिबास के बजाय पैच (एस) का उपयोग करना चाहते हैं, तो इसके साथ सीधा करने का तरीका git format-patch <revision range>और है git am *.patch
कैस्केबेल

इसके checkoutलिए दूसरी शाखा की आवश्यकता होती है।
कूलमाइंड

12

या अगर आप इंजीलवादी की तरफ से बहुत कम हैं, तो मैं थोड़ा बदसूरत तरीका कर सकता हूं। तैनात_टिप्पलेट में मेरे स्वामी को शाखा में तैनात के रूप में कॉपी करना चाहते हैं

git branch deploy deploy_template
git checkout deploy
git rebase master

यह नयी शाखा को तैनात करेगा (I उपयोग -f का उपयोग मौजूदा तैनाती शाखा को अधिलेखित करने के लिए करता है) पर, फिर यह मास्टर पर इस नई शाखा को रिजेक्ट कर देता है, जिससे तैनाती_टाइपलेट अछूता रह जाता है।


1

शाखा wss से अंतिम प्रतिबद्धता को v2.1 में कॉपी करने के सरल मामले के लिए, आप बस कमिट आईडी ( git log --oneline | head -n 1) और कर सकते हैं:

git checkout v2.1
git merge <commit>

इसके लिए किसी अन्य शाखा की जाँच की आवश्यकता होती है।
कूलमाइंड

1

चेरी-पिक कमांड मानक इनपुट से आने की सूची पढ़ सकता है।

निम्नलिखित कमांड चेरी-पिक्स उपयोगकर्ता जॉन द्वारा अधिकृत करता है जो "विकसित" शाखा में मौजूद है, लेकिन "रिलीज" शाखा में नहीं है, और कालानुक्रमिक क्रम में ऐसा करता है।

git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.