मैं किसी एकल फ़ाइल में परिवर्तनों को मर्ज करने के बजाय विलय कैसे करूं?


382

मेरी दो शाखाएँ हैं (A और B) और मैं शाखा B से संगत एकल फ़ाइल के साथ शाखा A से एकल फ़ाइल को मर्ज करना चाहता हूँ।


2
पहले से ही यहां चर्चा की गई है stackoverflow.com/questions/449541/…
पॉज़िट्रॉन

27
कि अन्य पोस्ट के लिए प्रतिक्रियाओं के अधिकांश चुनिंदा मर्ज करने के बारे में हैं करता है, न कि फ़ाइलें । यह चयनित उत्तर को गलत बनाता है। प्रश्न अनुत्तरित है।


यह उत्तर आईएमओ जाने का तरीका है। git diff branch_name > patch git apply patchstackoverflow.com/a/9473543/1091853
बम

जवाबों:


630

मैं उसी समस्या को लेकर आया था। सटीक होने के लिए, मेरी दो शाखाएँ हैं 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विकल्प। अन्यथा, आपको "नो चेंज" मिलेगा। संदेश।


10
यह केवल तभी काम करता है जब आप किसी फ़ाइल को अपडेट करना चाहते हैं। क्या होगा अगर मैं शाखा बी से शाखा ए में एक नई फ़ाइल जोड़ना चाहता हूं?
उमर ए।

25
@UmairAshraf - the-patch विकल्प को हटाकर आपको B से A तक एक नई फ़ाइल जोड़ने में सक्षम होना चाहिए।
22

9
हम्म् ... जब मैं यह कोशिश करता हूं तो मुझे "कोई परिवर्तन नहीं" संदेश मिलता है, लेकिन स्पष्ट रूप से परिवर्तन होते हैं। ठीक है, मुझे उस फ़ोल्डर में रहने की आवश्यकता है जहां प्रासंगिक फ़ाइल थी। संपादित करें: यह संभवतः एक समस्या का मेरा पसंदीदा समाधान हो सकता है, जिसे मैंने
स्टैकओवरफ्लो

2
मुझे इसे git checkout --patch B -- fकाम करने के लिए उपयोग करना था ।
user545424

8
बस यह जोड़ना है कि यदि आपके पास फ़ाइल में कई परिवर्तन (हंक) हैं और आप उन सभी को चरणबद्ध करना चाहते हैं , तो आप हर बार aदबाने के बजाय इंटरैक्टिव चरण के दौरान दबा yसकते हैं। या git checkout B -- fइसके बजाय कमांड का उपयोग करें ।
दिमित्री गोचर

17

यहाँ मैं इन स्थितियों में क्या करता हूँ। यह एक कीचड़ है, लेकिन यह मेरे लिए ठीक काम करता है।

  1. अपनी कार्यशील शाखा के आधार पर एक और शाखा बनाएँ।
  2. git पुल / git उस संशोधन (SHA1) को मिलाता है जिसमें वह फ़ाइल है जिसे आप कॉपी करना चाहते हैं। तो यह आपके सभी परिवर्तनों को मर्ज कर देगा, लेकिन हम केवल एक फ़ाइल को हथियाने के लिए इस शाखा का उपयोग कर रहे हैं।
  3. किसी भी टकराव आदि को ठीक करें अपनी फ़ाइल की जांच करें।
  4. अपनी कार्य शाखा की जाँच करें
  5. अपने मर्ज से शुरू की गई फ़ाइल की जाँच करें।
  6. इसे कमिट करें।

मैंने पैचिंग की कोशिश की और मेरी स्थिति इसके लिए बहुत बदसूरत थी। तो संक्षेप में यह इस तरह दिखेगा:

वर्किंग ब्रांच: एक प्रायोगिक शाखा: बी (इसमें फ़ाइल.टेक्स्ट शामिल है जिसमें ऐसे परिवर्तन हैं जिन्हें मैं गुना करना चाहता हूं।)

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

और वहां आपके पास होना चाहिए। अपना परिणाम दें।


3
तो हमें यह सब सिर्फ एक फ़ाइल को मर्ज करने के लिए करना होगा? क्या फाइल को दूसरी शाखा में कॉपी और पेस्ट करना आसान नहीं होगा
रॉबिन

1
@ रॉबिन शायद नहीं, क्योंकि विलय फ़ाइल में परिवर्तन रखता है, जो शाखा ए और बी के बीच भिन्न होता है। फ़ाइल की प्रतिलिपि बनाने से आपकी कार्य शाखा ए के बीच किसी भी अतिरिक्त अंतर को अधिलेखित कर दिया जाएगा, और जो आप बी से लाना चाहते थे, जिसमें शामिल नहीं हो सकता है। वे प्रवेश / संपादन। उदाहरण के लिए संदिग्ध Aको Bअन्य तरीकों से शुरू करने के लिए डायवर्ट किया गया है। नकल उन मतभेदों को दूर करेगी।
बम

13

यह 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.

1
--(खाली तर्क लेबल) के उपयोग को स्पष्ट करने के लिए , चेक चेकआउट डॉक्स: ARGUMENT DISAMBIGUATION कहते हैं: " git checkout -- <pathspec>यदि आप इन रास्तों को इंडेक्स से चेकआउट करना चाहते हैं तो उपयोग करें ।" ऐसा इसलिए है क्योंकि आपके पास एक ही नाम से एक शाखा और एक फ़ाइल / पथ दोनों हो सकते हैं। ऐसे मामलों में, आपको यह पूछने के बजाय कि क्या शाखा या पथ की जाँच की जानी चाहिए, जब दोनों मौजूद हों, तो git डिफ़ॉल्ट रूप से शाखा की जाँच करने का विकल्प चुन लेगा। हालाँकि, यदि --इससे अधिक हो तो इसके बजाय फ़ाइल / पथ की जाँच करेंगे।
शेरिलहोमन

8

मुझे यह दृष्टिकोण सरल और उपयोगी लगा: विशिष्ट फ़ाइलों को किसी अन्य शाखा से "मर्ज" कैसे करें

जैसा कि यह पता चला है, हम बहुत कठिन प्रयास कर रहे हैं। हमारा अच्छा दोस्त गिट चेकआउट नौकरी के लिए सही उपकरण है।

git checkout source_branch <paths>...

हम केवल git checkout को सुविधा शाखा A और उन विशिष्ट फ़ाइलों के पथ बता सकते हैं, जिन्हें हम अपनी मास्टर शाखा में जोड़ना चाहते हैं।

अधिक समझ के लिए कृपया पूरा लेख पढ़ें


2
यह फाइलों को अधिलेखित कर देता है, यह उन्हें विलय नहीं करता है
एलेक्स जी

आपके लिए यह हो सकता है, यह निर्भर करता है कि आप क्या कर रहे हैं और क्या हासिल करने की कोशिश कर रहे हैं। यहाँ विचार यह है कि शाखा B A का कांटा है, आप B में 4 फ़ाइलों को संशोधित करते हैं, लेकिन B से A में केवल 2 को मर्ज करना चाहते हैं। नियमित रूप से मर्ज सभी 4 में विलय हो जाएगा, यहाँ आप चुन सकते हैं। ऐसा इसलिए लग सकता है क्योंकि उन्हें ओवरराइड किया गया था क्योंकि बी में अनिवार्य रूप से नई फाइलें हैं। आपको कुछ सबूतों के साथ अपने अनुभव का समर्थन करने की आवश्यकता है।
पावेल कियोच

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

वैसे यह विचार 2009 से था, संभावना है कि नए संस्करण अलग-अलग तरीके से और जरूरतों -p या कुछ और व्यवहार करते हैं, लेकिन जब मैं इसे पोस्ट कर रहा था तो यह मेरे लिए काम कर रहा था, लेकिन फिर शायद मुझे इस बात की परवाह नहीं थी कि फाइल ओवरराइड हो रही है, जैसा कि नवीनतम संस्करण जो मुझे चाहिए था
पावेल किओच

7

आप उपयोग कर सकते हैं:

    git merge-file

टिप: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html


2
Im केवल एक फ़ाइल को मर्ज करने की कोशिश कर रहा है, लेकिन दूसरी शाखा से। मैं दूसरी शाखा से विलय करने का विकल्प नहीं देख रहा हूंgit merge-file
ब्लेम

3

निम्नलिखित कमांड विल (1) सही शाखा की फाइल की तुलना, मास्टर (2) से करती है, जो आपसे इंटरेक्टिव तरीके से पूछती है कि कौन सा संशोधन लागू करना है।

गिट चेकआउट - मास्टर को चेक करें


0

मेरा संपादन अस्वीकार कर दिया गया है, इसलिए मैं संलग्न कर रहा हूं कि यहां एक दूरस्थ शाखा से विलय के परिवर्तनों को कैसे संभालना है।

यदि आपको गलत मर्ज के बाद ऐसा करना है, तो आप कुछ इस तरह से कर सकते हैं:

# 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.

0

मान लें कि 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
R.Chatsiri

0

आप मर्ज करने के लिए फ़ाइल के पुराने संस्करण की जांच कर सकते हैं, इसे एक अलग नाम के तहत सहेज सकते हैं, फिर जो भी मर्ज टूल दो फ़ाइलों पर है उसे चलाएं।

जैसे।

git show B:src/common/store.ts > /tmp/store.ts (जहां बी शाखा का नाम / कमिट / टैग है)

meld src/common/store.ts /tmp/store.ts


0

मैं इसे करूंगा

git format-patch branch_old..branch_new file

यह फ़ाइल के लिए एक पैच का उत्पादन करेगा।

लक्ष्य Branch_old पर पैच लागू करें

git am blahblah.patch


क्या आप अतिरिक्त सुरक्षा के लिए पैच में आसानी से देख सकते हैं?
जेवियरस्ट्यूव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.