मेरी दो शाखाएँ हैं (A और B) और मैं शाखा B से संगत एकल फ़ाइल के साथ शाखा A से एकल फ़ाइल को मर्ज करना चाहता हूँ।
git diff branch_name > patch
git apply patch
। stackoverflow.com/a/9473543/1091853
मेरी दो शाखाएँ हैं (A और B) और मैं शाखा B से संगत एकल फ़ाइल के साथ शाखा A से एकल फ़ाइल को मर्ज करना चाहता हूँ।
git diff branch_name > patch
git apply patch
। stackoverflow.com/a/9473543/1091853
जवाबों:
मैं उसी समस्या को लेकर आया था। सटीक होने के लिए, मेरी दो शाखाएँ हैं A
और B
एक ही फाइल के साथ लेकिन कुछ फाइलों में एक अलग प्रोग्रामिंग इंटरफेस है। अब फाइल के तरीके f
, जो दो शाखाओं में अंतर के अंतर से स्वतंत्र है, को शाखा में बदल दिया गया था B
, लेकिन परिवर्तन दोनों शाखाओं के लिए महत्वपूर्ण है। इस प्रकार, मैं सिर्फ फ़ाइल को आपस में f
शाखा के B
फाइल में f
शाखा के A
।
एक साधारण कमांड ने मेरे लिए पहले से ही समस्या को हल कर दिया है अगर मुझे लगता है कि सभी परिवर्तन दोनों शाखाओं में किए गए हैं A
और B
:
git checkout A
git checkout --patch B f
पहली कमांड शाखा A
में बदल जाती है, जहाँ मैं B
फ़ाइल के संस्करण को मर्ज करना चाहता हूँ f
। दूसरा आदेश फ़ाइल पैच f
के साथ f
की HEAD
की B
। आप पैच के एक हिस्से को स्वीकार / त्याग भी सकते हैं। इसके बजाय B
आप यहां कोई भी प्रतिबद्धता बता सकते हैं, यह होना जरूरी नहीं है HEAD
।
समुदाय संपादित करें : यदि फ़ाइल f
पर B
पर मौजूद नहीं है A
अभी तक, फिर छोड़ देते हैं --patch
विकल्प। अन्यथा, आपको "नो चेंज" मिलेगा। संदेश।
git checkout --patch B -- f
काम करने के लिए उपयोग करना था ।
a
दबाने के बजाय इंटरैक्टिव चरण के दौरान दबा y
सकते हैं। या git checkout B -- f
इसके बजाय कमांड का उपयोग करें ।
यहाँ मैं इन स्थितियों में क्या करता हूँ। यह एक कीचड़ है, लेकिन यह मेरे लिए ठीक काम करता है।
मैंने पैचिंग की कोशिश की और मेरी स्थिति इसके लिए बहुत बदसूरत थी। तो संक्षेप में यह इस तरह दिखेगा:
वर्किंग ब्रांच: एक प्रायोगिक शाखा: बी (इसमें फ़ाइल.टेक्स्ट शामिल है जिसमें ऐसे परिवर्तन हैं जिन्हें मैं गुना करना चाहता हूं।)
git checkout A
A पर आधारित नई शाखा बनाएँ:
git checkout -b tempAB
टेम्प बी में मर्ज करें
git merge B
मर्ज के sha1 हैश की प्रतिलिपि बनाएँ:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
अपनी कार्य शाखा की जाँच करें:
git checkout A
अपनी फिक्स्ड-अप फ़ाइल चेकआउट करें:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
और वहां आपके पास होना चाहिए। अपना परिणाम दें।
A
को B
अन्य तरीकों से शुरू करने के लिए डायवर्ट किया गया है। नकल उन मतभेदों को दूर करेगी।
यह git के आंतरिक difftool का उपयोग करता है। शायद थोड़ा काम करना है लेकिन सीधे आगे।
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
--
(खाली तर्क लेबल) के उपयोग को स्पष्ट करने के लिए , चेक चेकआउट डॉक्स: ARGUMENT DISAMBIGUATION कहते हैं: " git checkout -- <pathspec>
यदि आप इन रास्तों को इंडेक्स से चेकआउट करना चाहते हैं तो उपयोग करें ।" ऐसा इसलिए है क्योंकि आपके पास एक ही नाम से एक शाखा और एक फ़ाइल / पथ दोनों हो सकते हैं। ऐसे मामलों में, आपको यह पूछने के बजाय कि क्या शाखा या पथ की जाँच की जानी चाहिए, जब दोनों मौजूद हों, तो git डिफ़ॉल्ट रूप से शाखा की जाँच करने का विकल्प चुन लेगा। हालाँकि, यदि --
इससे अधिक हो तो इसके बजाय फ़ाइल / पथ की जाँच करेंगे।
मुझे यह दृष्टिकोण सरल और उपयोगी लगा: विशिष्ट फ़ाइलों को किसी अन्य शाखा से "मर्ज" कैसे करें
जैसा कि यह पता चला है, हम बहुत कठिन प्रयास कर रहे हैं। हमारा अच्छा दोस्त गिट चेकआउट नौकरी के लिए सही उपकरण है।
git checkout source_branch <paths>...
हम केवल git checkout को सुविधा शाखा A और उन विशिष्ट फ़ाइलों के पथ बता सकते हैं, जिन्हें हम अपनी मास्टर शाखा में जोड़ना चाहते हैं।
अधिक समझ के लिए कृपया पूरा लेख पढ़ें
-p
उस आदेश में विकल्प का उपयोग कर रहे थे । फिर, आपके वर्कट्री फ़ाइल के किसी भी हिस्से को ओवरराइट करता है, जो पहले शाखा से आपके चेक आउट से, डायवर्ट परिवर्तन से पहले, दुर्भाग्य से हटा दिया गया है।
आप उपयोग कर सकते हैं:
git merge-file
टिप: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
git merge-file
निम्नलिखित कमांड विल (1) सही शाखा की फाइल की तुलना, मास्टर (2) से करती है, जो आपसे इंटरेक्टिव तरीके से पूछती है कि कौन सा संशोधन लागू करना है।
गिट चेकआउट - मास्टर को चेक करें
मेरा संपादन अस्वीकार कर दिया गया है, इसलिए मैं संलग्न कर रहा हूं कि यहां एक दूरस्थ शाखा से विलय के परिवर्तनों को कैसे संभालना है।
यदि आपको गलत मर्ज के बाद ऐसा करना है, तो आप कुछ इस तरह से कर सकते हैं:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
मान लें कि B वर्तमान शाखा है:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
ध्यान दें कि यह केवल स्थानीय फ़ाइल में परिवर्तन लागू करता है। आप बाद में करने की आवश्यकता होगी।
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
मैं इसे करूंगा
git format-patch branch_old..branch_new file
यह फ़ाइल के लिए एक पैच का उत्पादन करेगा।
लक्ष्य Branch_old पर पैच लागू करें
git am blahblah.patch