विलय या जोड़ के बिना, शाखा b से a में परिवर्तन लागू करना


86

मेरा परिदृश्य यह है कि मेरी एक शाखा है जिसमें मैंने निर्माण प्रक्रिया (शाखा ए) में बड़े सुधार किए हैं और दूसरे में मैं एक असंबंधित सुविधा (शाखा बी) पर काम कर रहा हूं। इसलिए अब जब मैं शाखा बी में हैकिंग कर रहा हूं, तो मैं शाखा ए में लिखे सामान को खींचना चाहता हूं क्योंकि मैं तेज और आसान बिल्ड चाहता हूं। हालाँकि, मैं अपनी शाखा बी को "प्रदूषित" नहीं करना चाहता, बस शाखा से परिवर्तन को बिना किसी परिवर्तन के जोड़ना चाहता हूँ।

मैंने क्या करने की कोशिश की है (जब शाखा पर खड़ा है):

git merge --no-commit branchA

काम नहीं करता क्योंकि यह आपको एक मर्ज के अंदर रखता है। यदि ऐसा नहीं होता, तो यह सही होगा।

git checkout branchA -- .

काम नहीं करता क्योंकि यह ब्रांच के बीच बदलावों को लागू करता है..ब्रांचबी और न कि बदलावों के मास्टर..ब्रांचा के बीच।

और कुछ?

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


क्या ए पर बदलाव पहले से ही प्रतिबद्ध हैं?
थियोडोडिस

जवाबों:


152

मुझे बस कुछ ऐसा ही करना था और --squashमर्ज कमांड में जोड़कर इसे ठीक करने में सक्षम था

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes

3
यह भी एक व्याख्यात्मक नोट किया जाना चाहिए कि इसके साथ ही क्या कर रहा है। यह आपकी वर्तमान शाखा में
शाखाए

मैं कहता हूं कि मैं केवल ब्रांच से मास्टर में कोड मर्ज कर देता हूं, लेकिन मैं कुछ भूल गया हूं और इस मर्ज कमिटमेंट में कुछ और कोड / बदलाव जोड़ना चाहता हूं, जैसे कि git हिस्ट्री में कोई दूसरा मर्ज कमिट नहीं। क्या यह तरीका काम करेगा?
सुष्मिता सागर

@Sushmit मुझे लगता है कि आप एक कर सकते हैं git commit —amendऔर यह अंतिम बदलावों के लिए नए बदलावों को जोड़ देगा, मुझे पूरी तरह से यकीन नहीं है कि यह मर्ज कमिट पर काम करता है
guilffer

1
मुझे नहीं लगता - यहाँ कमिटमेंट की जरूरत है? डिफ़ॉल्ट होना चाहिए।
पेट्टर

11

cherry-pick -n आपको वही करना चाहिए जो आप चाहते हैं, लेकिन मुझे यकीन नहीं है कि आप निर्माण सुधार को अस्थिर परिवर्तनों के रूप में क्यों चाहते हैं - जो कि कई चीजों को कठिन बनाता है (जैसे संशोधित फ़ाइलों में अन्य परिवर्तनों को मर्ज करना, या किसी भी चीज़ को रिबास करना)।

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

उस स्थिति में, मैं एक नई शाखा, सी बनाऊंगा, जिसे आप ए और बी दोनों (और सुधार के साथ किसी भी अन्य शाखा) से मिलाते हैं। सुविधा शाखा, B पर परिवर्तन करें, फिर उन्हें C शाखा में मिला दें, जिसमें अब बिल्ड सुधार और सुविधा शाखा परिवर्तन शामिल हैं, इसलिए आप उन्हें एक साथ परीक्षण कर सकते हैं। यदि आपको अधिक परिवर्तन करने की आवश्यकता है तो उचित शाखा में करें, C से नहीं, तो C में विलय कर दें। इसलिए C शाखा में कभी भी कुछ भी न बदलें, बस इसका उपयोग अन्य शाखाओं से परिवर्तन को एकीकृत करने के लिए करें।

इसका मतलब है कि आप एक गंदे पेड़ में अनियोजित परिवर्तनों की बाजीगरी करने के बजाय, Git की सभी विशेषताओं का उपयोग कर सकते हैं।


के लिए UseCase cherry-pick -n: मैंने यादृच्छिक स्थानों पर बहुत सारे सामान जोड़कर अपने कोड की एक कार्यशील प्रतिलिपि बनाई। अब मैं इस सुविधा की शाखा में जाने से पहले अपने कोड को साफ करना चाहता हूं। इसलिए मैं एक अस्थायी शाखा में जाता हूं, सभी परिवर्तन करता हूं। फीचर शाखा में वापस आएं, cherry-pickजो प्रतिबद्ध है। क्या ऐसा करने का कोई बेहतर तरीका है?
तेजस काले

6

आपको कमिट्स को चेरी-पिक करने में सक्षम होना चाहिए ( -nतुरंत कमिटमेंट से बचने के लिए)।


-एक काम नहीं किया। इसमें कहा गया है कि चेरी-पिक कमिटमेंट दिया गया कोई भी विकल्प नहीं है।
अलेजांद्रो सानज़ डिआज

5

मैं 100% निश्चित नहीं हूं कि मैंने इसे स्पष्ट रूप से समझा है, लेकिन मेरे मामले में मैंने शाखाओं के बीच अलग-अलग पैच बनाए हैं और फिर बी शाखा पर इस पथ को लागू किया है।

शाखा ए के अंदर:

 git diff branchA..branchB > patch.diff
 git apply patch.diff

4

मुझे यकीन नहीं है कि मैं आपकी आवश्यकताओं को समझता हूं।

आप मर्ज चला सकते हैं, फिर कॉल करें git reset HEAD~1


निम्नलिखित अनुक्रम के बीच masterऔर branchAऊपर हर प्रतिबद्ध को फिर से खेलना चाहिए branchB। पहले से लागू किए गए कमिट को branchBछोड़ दिया जाएगा।

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip

यह फ़ाइल को git के स्टेजिंग क्षेत्र में जोड़ता है जो मुझे नहीं चाहिए। इसके अलावा, यह केवल तभी अच्छा लगता है जब सभी शाखाएँ मास्टर शाखा पर एक ही वचनबद्ध हों। अन्यथा रेंज मास्टर में भिन्न नहीं है..ब्रांचा को पेश किया जाता है।
ब्योर्न लिंडकविस्ट

@ BjörnLindqvist: --softयदि आप मंचन क्षेत्र में परिवर्तन नहीं चाहते हैं तो विकल्प को हटा दें । क्या आप इस बात का ग्राफ खींच सकते हैं कि आपकी शाखाएँ कैसे स्थापित की जाती हैं?
LeGEC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.