मुझे अपने गुरु से दो शाखाएँ मिली हैं:
- v2.1 : (संस्करण 2) मैं कई महीनों से काम कर रहा हूं
- wss : जो मैंने अपने मास्टर (उत्पादन में) में एक विशिष्ट विशेषता जोड़ने के लिए कल बनाया था
वहाँ एक तरीका है कल wss से v2.1 को हिट करता है?
मुझे अपने गुरु से दो शाखाएँ मिली हैं:
वहाँ एक तरीका है कल wss से v2.1 को हिट करता है?
जवाबों:
आपके पास वास्तव में एक वर्कफ़्लो होना चाहिए जो आपको मर्ज करके यह सब करने देता है:
- 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
नोट: ऐसा करने के लिए कुछ अतिरिक्त कार्य करने का कारण यह है कि यह आपकी रिपॉजिटरी में डुप्लिकेट कमिट बना रहा है। यह वास्तव में एक अच्छी बात नहीं है - आसान ब्रांचिंग और मर्जिंग का पूरा बिंदु कमिटमेंट को एक जगह बनाकर और उन्हें जहाँ भी ज़रूरत हो, वहाँ विलय करके सब कुछ करने में सक्षम होना है। डुप्लिकेट कमिट्स का मतलब है कि उन दोनों शाखाओं को मर्ज करने का कोई इरादा नहीं है (यदि आप तय करते हैं कि आप बाद में चाहते हैं, तो आपको संघर्ष मिलेगा)।
git-svn-id
पहले गलत संदर्भों को हटाने के लिए एक इंटरैक्टिव रिबेस / रीवर्ड प्रदर्शन dcommit
किया। हालांकि मैं शायद चेरी-पिक कदम को छोड़ सकता था और बस अपने आप से एक रिबास का इस्तेमाल करता था।
उपयोग
git cherry-pick <commit>
<commit>
अपनी वर्तमान शाखा में आवेदन करने के लिए ।
मैं स्वयं संभवतः उन कमिटों को क्रॉस-चेक करूंगा, जिन्हें मैं अंदर ले जाता हूं gitk
और चेरी-पिक करता हूं, बजाय इसके कि वे कमिट एंट्री पर राइट-क्लिक करते हैं।
यदि आप अपने सभी खतरों के साथ और अधिक स्वचालित (सभी खतरों के साथ) जाना चाहते हैं और कल से wss पर हुआ तो आप उपयोग की जाने वाली कमिट की सूची तैयार कर सकते हैं git log
(साथ ही --pretty
Jefromi द्वारा सुझाए गए)
git log --reverse --since=yesterday --pretty=%H
तो सब कुछ एक साथ आप का उपयोग कर ग्रहण करते हैं bash
for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
git cherry-pick $commit
done
अगर यहां कुछ गलत हो जाता है (बहुत अधिक संभावना है) तो आप मुसीबत में हैं क्योंकि लाइव चेकआउट पर यह काम करता है, इसलिए या तो मैनुअल चेरी-पिक्स करें या फिर रिफ़र का उपयोग करें जैसे कि जेफ्रोमी द्वारा सुझाए गए।
git rebase
मेरे जवाब में उपयोग करने का तरीका अधिक मजबूत है। विशेष रूप से, इस तरह के लिए लूप का उपयोग करना, अगर चेरी-पिक्स में से एक विफल हो जाता है, तो यह अभी भी बाकी सभी को करने की कोशिश करेगा। यह है ... बहुत अच्छा नहीं है, चलो कहते हैं।
git
उत्तर जो सरल और सीधे समाधान के लिए है, बजाय इसे समझने के लिए कि यह कितनी अच्छी तरह से उत्तर देने वाला है।
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
।
आप उन कमिटों से एक पैच बना सकते हैं जिन्हें आप गंतव्य शाखा में पैच कॉपी और लागू करना चाहते हैं ।
git format-patch <revision range>
और है git am *.patch
।
checkout
लिए दूसरी शाखा की आवश्यकता होती है।
या अगर आप इंजीलवादी की तरफ से बहुत कम हैं, तो मैं थोड़ा बदसूरत तरीका कर सकता हूं। तैनात_टिप्पलेट में मेरे स्वामी को शाखा में तैनात के रूप में कॉपी करना चाहते हैं
git branch deploy deploy_template
git checkout deploy
git rebase master
यह नयी शाखा को तैनात करेगा (I उपयोग -f का उपयोग मौजूदा तैनाती शाखा को अधिलेखित करने के लिए करता है) पर, फिर यह मास्टर पर इस नई शाखा को रिजेक्ट कर देता है, जिससे तैनाती_टाइपलेट अछूता रह जाता है।
चेरी-पिक कमांड मानक इनपुट से आने की सूची पढ़ सकता है।
निम्नलिखित कमांड चेरी-पिक्स उपयोगकर्ता जॉन द्वारा अधिकृत करता है जो "विकसित" शाखा में मौजूद है, लेकिन "रिलीज" शाखा में नहीं है, और कालानुक्रमिक क्रम में ऐसा करता है।
git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin