मैं 'मर्ज' के बजाय, 'मर्ज' कैसे करूं, Git में एक शाखा पर एक शाखा?


257

मेरी दो शाखाएँ हैं, emailऔर stagingstagingनवीनतम है और मुझे अब emailशाखा में पुराने परिवर्तनों की आवश्यकता नहीं है , फिर भी मैं उन्हें हटाना नहीं चाहता।

तो मैं बस की सभी सामग्री डंप करना चाहते हैं stagingमें emailतो वे एक ही करने के लिए दोनों बिंदु प्रतिबद्ध है कि। क्या यह संभव है?


जवाबों:


196

आप 'हमारी' मर्ज रणनीति का उपयोग कर सकते हैं:

$ git checkout staging
$ git merge -s ours email # Merge branches, but use our branch head

26
मैंने यह कोशिश की, और यह मुझे पीछे लगता है? क्या यह ईमेल की सामग्री को मंचन में नहीं डंप करता है और अन्य तरीके से नहीं?
अधिकतम

27
@ मोम को मुझे वही भ्रम था और इससे मुझे बहुत परेशानी हुई। आपको नई शाखा (स्टेजिंग) से इस कमांड को करने की आवश्यकता है, और फिर अपनी पुरानी शाखा (ईमेल) में एक सामान्य मर्ज / पीआर करें।
मृगलास

7
;प्रत्येक आज्ञा के अंत में क्यों ? मैंने इसके बिना किया ;और यह काम करने लगता है। इसके अलावा यह उत्तर अधूरा है, तीसरा चरण पुरानी शाखा (ईमेल) की जांच करना और फिर से मचान के साथ विलय करना है।
रोजी कासिम

4
git rebase -s theirs <oldbranc> <newbranch> के रूप में अच्छी तरह से काम करता है (कोई फर्क नहीं पड़ता कि आप कौन सी शाखा हैं)। ध्यान दें कि रिबास में 'उनका' वास्तव में newbranch है क्योंकि 'हमारा' वह प्रमुख है जो वर्तमान में हम कमिट को लागू कर रहे हैं।
रॉल्फ

4
@ रॉल्फ: लेकिन रिबेस को मर्ज की जानकारी से छुटकारा मिल जाएगा और इतिहास को समतल कर देगा। जरूरी नहीं कि आप उसके बाद क्या हो। इसके अलावा एक अच्छा विचार नहीं है, अगर आप पहले से प्रकाशित इतिहास के साथ काम कर रहे हैं।
निट

99

यदि आप चाहते हैं कि दो शाखाएँ 'ईमेल' और 'स्टेजिंग' समान हों, तो आप 'ईमेल' शाखा को टैग कर सकते हैं, फिर 'ईमेल' शाखा को 'स्टेजिंग' एक पर रीसेट करें:

$ git checkout email
$ git tag old-email-branch
$ git reset --hard staging

आप 'ईमेल' शाखा पर 'स्टेजिंग' शाखा को भी रिबेस कर सकते हैं। लेकिन परिणाम में दो शाखाओं का संशोधन शामिल होगा।


1
आप शायद मतलब है git checkout, git checkमेरे ज्ञान के लिए मौजूद नहीं है
knittl

4
आप सही हैं, मैं git कमांड को पूरा करने के लिए उपयोग किया जाता हूं कि मैं "git checkout" लिखने के लिए हमेशा "git check <TAB>" लिखता हूं! सही किया।
सिल्वेन डिफ्रेंसने

16
git reset अन्य लोगों के रेपो को तोड़ता है जो आपके रेपो का क्लोन
बनाते हैं

मेरा मानना ​​है कि यह सही उत्तर है। emailशाखा के प्रमुख को केवल एक ही सिर की ओर इशारा करना चाहिए stagingऔर वे दोनों एक ही इतिहास, समान इतिहास होंगे।
cicerocamargo

76

मैंने कई उत्तर देखे हैं और यह एकमात्र प्रक्रिया है जो मुझे बिना किसी संघर्ष के ठीक करने देती है।

यदि आप Branch_new से Branch_old में सभी परिवर्तन चाहते हैं, तो:

git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new

एक बार उन चार आदेशों को लागू करने के बाद आप बिना किसी समस्या के ब्रांच_ओल्ड को धक्का दे सकते हैं


5
आपका उत्तर वास्तव में मेरे मुद्दे पर सबसे अच्छा बैठता है क्योंकि मैं हेड को रीसेट नहीं करना चाहता था, बस नई शाखा में नई फ़ाइलों के लिए प्राथमिकता दें जब चीजों को पुराने में विलय कर दिया जाए, और बिना मुद्दे के काम किया! +1
स्टोव

मैंने "हमारी मर्ज" के बाद अपनी ब्रांच_न्यू को रिमोट से धकेल दिया, और इस विधि ने मेरे लिए काम किया। क्या मेरे लिए धक्का देना जरूरी था? या इसके बिना काम किया होगा? (निश्चित नहीं था कि यह स्थानीय शाखा या रिमोट का उपयोग करेगा)। धन्यवाद!
aspergillusOryzae

आप बस नीचे क्यों नहीं कर सकते? Git चेकआउट branch_old Git मर्ज -s उनकी branch_new सुराग से लिया stackoverflow.com/questions/14275856/...
Ripu दमन

यह कहता है, मर्ज की रणनीति 'उनकी' नहीं मिल सकी।
अरण्गो_ a६

मेरे लिए पूरी तरह से काम करता है, कुछ भी रीसेट न करने का फायदा है
रोमेन

68

अन्य उत्तरों ने मुझे सही सुराग दिए, लेकिन उन्होंने पूरी तरह से मदद नहीं की।

यहाँ मेरे लिए क्या काम किया गया है:

$ git checkout email
$ git tag old-email-branch # This is optional
$ git reset --hard staging
$
$ # Using a custom commit message for the merge below
$ git merge -m 'Merge -s our where _ours_ is the branch staging' -s ours origin/email
$ git push origin email

हमारी रणनीति के साथ विलय के चौथे चरण के बिना, पुश को एक गैर-फास्ट-फॉरवर्ड अपडेट माना जाता है और इसे अस्वीकार कर दिया जाएगा (गिटहब द्वारा)।


यह मर्ज-कमिट मैसेज को गलत बनाता है, लेकिन हाँ, यह बहुत अच्छा काम करता है।
cdunn2001

cdunn2001, मैं उत्सुक हूं। आप जिस मर्ज-कमिट मैसेज की उम्मीद कर रहे थे वह क्या था और इससे कैसे गड़बड़ हुई?
श्याम हबारक

यह कहता है कि "दूरस्थ दूरस्थ ट्रैकिंग शाखा 'मूल / ईमेल' ईमेल में"। इसमें मंचन का उल्लेख नहीं है। हालांकि कोई बड़ी बात नहीं। बस कमिट में संशोधन करें, या उपयोग करें merge -m 'This is not my beautiful house.' -s ours origin/email
cdunn2001

@ShyamHabarakada, जैसा कि आप कहते हैं, मैं करता हूं और मुझे गैर-फास्ट-फॉरवर्ड अपडेट के बारे में समस्या आती है। क्योंकि जब मैं 4 स्टेप करता हूं तो कुछ नहीं होता है।
कोमराधोमेर

4 वें चरण के लिए आपको मूल / ईमेल का उपयोग करना होगा, यह सिर्फ स्थानीय ईमेल के साथ काम नहीं करता है।
ट्रैविस रीडर

45

यदि आप मेरे जैसे हैं और आप विलय से निपटना नहीं चाहते हैं, तो आप उपरोक्त चरणों को मर्ज के बजाय बल प्रयोग को छोड़कर कर सकते हैं, क्योंकि यह एक विचलित लॉग पेपर निशान पैदा करेगा:

git checkout email
git reset --hard staging
git push origin email --force

नोट: यह केवल तभी है जब आप वास्तव में फिर से ईमेल में सामान नहीं देखना चाहते हैं।


1
git पुश ओरिजिनल ईमेल --force ने मेरे लिए काम नहीं किया क्योंकि Step2 ने शाखाओं को छोड़ दिया। तो Step2 के बाद, मैंने यही किया है: git रीसेट उत्पत्ति / ईमेल और फिर git पुश
user3505394

2
यह वही है जो सवाल में पूछा गया था - "मर्ज के बजाय ओवरराइट कैसे करें"। उत्तर स्वीकार किया जाना चाहिए।
जोज़ोले

17

मैं दो शाखाओं को मिलाना चाहता था ताकि सभी सामग्री old_branchको सामग्री से अद्यतन किया जा सकेnew_branch

मेरे लिए यह एक आकर्षण की तरह काम करता है:

$ git checkout new_branch
$ git merge -m 'merge message' -s ours origin/old_branch
$ git checkout old_branch
$ git merge new_branch
$ git push origin old_branch

10

कैसा रहेगा:

git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease

@emptywalls क्योंकि यह उपयोगकर्ता को चेतावनी दिए बिना एक बल धक्का देता है कि इसे सर्वर द्वारा अस्वीकार किया जा सकता है, न ही यह बताता है कि इसकी आवश्यकता क्यों है। उस ने कहा, यह एक डेवलपर-प्रोजेक्ट के लिए एक व्यवहार्य विकल्प है
डेविड कोस्टा

@DavidCosta यह सर्वर द्वारा अस्वीकृत क्यों होगा? यह एक सरल डिलीट ईमेल ब्रांच है और ईमेल पर स्टेजिंग कॉपी करें ... इसलिए मैं 'स्टेजिंग' की सभी सामग्रियों को 'ईमेल' में डंप करना चाहता हूं, ताकि वे दोनों एक ही कमिट की ओर इशारा करें - ठीक यही हो रहा है यहाँ।
अरेक

@ अगर सर्वर को GitLab में "संरक्षित" उदाहरण के रूप में सेट किया जाता है, तो इसे सर्वर साइड हुक द्वारा अस्वीकार किया जा सकता है। समस्या यह है कि अगर किसी और ने इस ऑपरेशन से पहले ईमेल से अपनी शाखा निकाली और फिर धक्का देने की कोशिश की, तो संदर्भ अब मेल नहीं खाते (क्योंकि कुछ बस गायब हो जाता है)
डेविड कोस्टा

1
मैंने मूल -फोर्स से लेकर --फोर्स-विद-लीज़ तक का संपादन किया, जो चाल को गैर-विनाशकारी तरीके से करता है।
Frandroid

1
यह सबसे अच्छा तरीका है अगर आप सिर्फ एक शाखा को उड़ाना चाहते हैं और स्रोत शाखा से इसे साफ करना शुरू करते हैं।
शेन

6

अन्य उत्तर अपूर्ण दिखे।
मैंने नीचे पूरी कोशिश की है, और यह ठीक काम किया है।

नोट:
1. नीचे की कोशिश करने से पहले, सुरक्षित पक्ष पर होने के लिए अपने भंडार की एक प्रति बनाएँ।

विवरण:
1. देव शाखा में सभी विकास होते हैं
। क्यूए शाखा देव की एक ही प्रति है
। 3. समय-समय पर देव कोड को स्थानांतरित करना होगा / क्यूए शाखा को अधिलेखित करना होगा।

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

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

git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push

अंतिम पुश के लिए स्वचालित टिप्पणी नीचे दी गई है:

// Output:
//  *<MYNAME> Merge branch 'qa' into dev,*  

यह टिप्पणी रिवर्स दिखती है, क्योंकि ऊपर का क्रम भी रिवर्स दिखता है

भाग 2:

नीचे अनपेक्षित, नए स्थानीय देव हैं, जो अनावश्यक हैं
, इसलिए हमें दूर फेंकना होगा, और देव को अछूता बनाना होगा।

git checkout dev

// Output:
//  Switched to branch 'dev'  
//  Your branch is ahead of 'origin/dev' by 15 commits.  
//  (use "git push" to publish your local commits)


git reset --hard origin/dev  

//  Now we threw away the unexpected commits

भाग 3:
सत्यापित करें कि सब कुछ अपेक्षित है:

git status  

// Output:
//  *On branch dev  
//  Your branch is up-to-date with 'origin/dev'.  
//  nothing to commit, working tree clean*  

बस इतना ही।
1. पुरानी क्यूए को अब नए देव शाखा कोड द्वारा अधिलेखित कर दिया गया है
। 2. स्थानीय स्वच्छ है (दूरस्थ मूल / देव अछूता है)


6

इसे करने का सबसे आसान तरीका:

//the branch you want to overwrite
git checkout email 

//reset to the new branch
git reset --hard origin/staging

// push to remote
git push -f

अब ईमेल शाखा और मंचन समान हैं।


2
चेतावनी: यह emailशाखा पर सभी कमियों को हटाता है । यह emailशाखा को हटाने और शाखा के प्रमुख पर नए सिरे से बनाने जैसा है staging
कैमरून हडसन

2
git checkout email
git merge -m "Making email same as staging disregarding any conflicts from email in the process" -s recursive -X theirs staging

1
यह उत्तर मेरे लिए स्पष्ट होता यदि टिप्पणी को कमांड में विलय की टिप्पणी से अलग किया जाता। संक्षेप में बताएं कि -X क्या करता है और यह इस मर्ज को कैसे प्रभावित करता है। हालांकि धन्यवाद। मुझे यह देखने के लिए बनाया :)
noelicus

@noelicus टिप्पणी के लिए धन्यवाद और आप सही हैं। मैं भविष्य में उत्तर को संपादित कर सकता हूं।
विला

0

यह मूल नई शाखा को नहीं बदलता है, और आपको अंतिम प्रतिबद्ध से पहले और संशोधन करने का अवसर देता है।

git checkout new -b tmp
git merge -s ours old -m 'irrelevant'
git checkout old
git merge --squash tmp
git branch -D tmp
#do any other stuff you want
git add -A; git commit -m 'foo' #commit (or however you like)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.