Git शाखाओं से विशिष्ट फ़ाइलों को मर्ज कैसे करें


179

मेरे पास 2 गिट शाखाएं हैं शाखा 1 और शाखा 2 और मैं चाहता हूं कि मैं फाइल 2 के माध्यम से शाखा 2 में फाइलहोम में विलय कर दूं।

संक्षेप में, मैं सिर्फ ब्रांच 1 में file.py पर काम करना चाहता हूँ, लेकिन मर्ज कमांड का लाभ उठाना चाहता हूँ। इसे करने का बेहतरीन तरीका क्या है?



जवाबों:


207

जब सामग्री में है file.pyसे Branch2 जाता है कि पर लागू होता है नहीं रह गया है Branch1 , यह कुछ परिवर्तन उठा और दूसरों को छोड़ने की आवश्यकता है। पूर्ण नियंत्रण के लिए --patchस्विच का उपयोग कर एक इंटरैक्टिव मर्ज करें:

$ git checkout --patch branch2 file.py

git-add(1)उपयोग किए जाने वाले कुंजियों की व्याख्या करने के लिए आदमी पृष्ठ में इंटरैक्टिव मोड अनुभाग :

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk nor any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk nor any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

स्प्लिट कमांड विशेष रूप से उपयोगी है।


3
हम पैच का उपयोग कैसे कर सकते हैं और एक ही समय में मर्ज टूल का उपयोग कर सकते हैं? मुख्य सामग्री के बजाय
गेब्रियल

@ गैब्रिएल मैंने पैच फ़ाइलों और टारबॉल के साथ भी गिट का उपयोग किया है क्योंकि यह एक रेपो ( git init <dir>) बनाने के लिए बहुत आसान है और अंत में इसे दूर फेंक देता है ( rm -r <dir>)।
पीडी

105

हालांकि एक नहीं मर्ज असल, कभी कभी किसी अन्य शाखा पर किसी अन्य फ़ाइल की संपूर्ण सामग्री की जरूरत है। जेसन रूडोल्फ की ब्लॉग पोस्ट एक शाखा से दूसरी शाखा में फ़ाइलों को कॉपी करने का एक सरल तरीका प्रदान करती है। तकनीक को इस प्रकार लागू करें:

$ git checkout branch1 # ensure in branch1 is checked out and active
$ git checkout branch2 file.py

अब file.pyमें है Branch1


91
आसान है, लेकिन यह वास्तव में एक मर्ज नहीं है । यह सिर्फ file.pyशाखा 2 में जो कुछ भी है उसे ओवरराइट करता है
ग्रेग हेविगेल

क्या होगा अगर आप ब्रांच को ब्रांच 1 से ब्रांच 2 में मर्ज करते हैं? आपको संघर्ष मिलेगा!
आमिर

क्या यह इतिहास को बनाए रखता है?
C2H50H

18

अन्य वर्तमान उत्तरों में से कोई भी वास्तव में फाइलों को "मर्ज" नहीं करेगा, जैसे कि आप मर्ज कमांड का उपयोग कर रहे थे। (कम से कम उन्हें आपको मैन्युअल रूप से अलग-अलग लेने की आवश्यकता होगी।) यदि आप वास्तव में एक सामान्य पूर्वज से जानकारी का उपयोग करके विलय करने का लाभ उठाना चाहते हैं, तो आप गिट के "उन्नत विलय" अनुभाग में पाए गए एक के आधार पर एक प्रक्रिया का पालन कर सकते हैं। संदर्भ पुस्तिका।

इस प्रोटोकॉल के लिए, मैं मान रहा हूं कि आप मूल / मास्टर से फ़ाइल 'पथ / / to / file.txt' को मर्ज करना चाहते हैं - उपयुक्त के रूप में संशोधित करें। (आपको अपनी रिपॉजिटरी की शीर्ष निर्देशिका में होने की ज़रूरत नहीं है, लेकिन यह मदद करता है।)

# Find the merge base SHA1 (the common ancestor) for the two commits:
git merge-base HEAD origin/master

# Get the contents of the files at each stage
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show HEAD:path/to/file.txt > ./file.ours.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt

# You can pre-edit any of the files (e.g. run a formatter on it), if you want.

# Merge the files
git merge-file -p ./file.ours.txt ./file.common.txt ./file.theirs.txt > ./file.merged.txt

# Resolve merge conflicts in ./file.merged.txt
# Copy the merged version to the destination
# Clean up the intermediate files

git मर्ज-फ़ाइल को स्वरूपण और पसंद के लिए अपनी सभी डिफ़ॉल्ट मर्ज सेटिंग का उपयोग करना चाहिए।

यह भी ध्यान दें कि यदि आपका "हमारा" वर्किंग कॉपी वर्जन है और आप अत्यधिक सतर्क नहीं रहना चाहते हैं, तो आप सीधे फाइल पर काम कर सकते हैं:

git merge-base HEAD origin/master
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt
git merge-file path/to/file.txt ./file.common.txt ./file.theirs.txt

15

सभी के लिए संशोधन कर रहे हैं file.pyमें branch2अपने स्वयं के प्रतिबद्ध में, अन्य फ़ाइलों में किए गए संशोधन से अलग? यदि हां, तो आप बस cherry-pickबदलावों को देख सकते हैं:

git checkout branch1
git cherry-pick <commit-with-changes-to-file.py>

अन्यथा, mergeसे अधिक अलग-अलग रास्तों काम नहीं करता है ... तुम भी सिर्फ एक बना सकता है git diffकी पैच file.pyसे परिवर्तन branch2और git applyकरने के लिए उन्हें branch1:

git checkout branch2
git diff <base-commit-before-changes-to-file.py> -- file.py > my.patch
git checkout branch1
git apply my.patch

8

आप कर सकते हैं stashऔर stash popफ़ाइल:

git checkout branch1
git checkout branch2 file.py
git stash
git checkout branch1
git stash pop

यह एक मर्ज के बजाय शाखा 2 / file.py की सामग्री के साथ शाखा 1 / file.py को अधिलेखित करता है जिसे हल करने के लिए मर्ज संघर्ष को उठाना चाहिए।
22

2

केवल शाखा 2 के परिवर्तनों को मर्ज करने के file.pyलिए, अन्य परिवर्तनों को दूर करें।

git checkout -B wip branch2
git read-tree branch1
git checkout branch2 file.py
git commit -m'merging only file.py history from branch2 into branch1'
git checkout branch1
git merge wip

मर्ज कभी भी किसी अन्य फ़ाइल को नहीं देखेगा। यदि पेड़ अलग-अलग हों, तो आपको चेकआउट को '-फ' करना पड़ सकता है।

ध्यान दें कि यह शाखा 1 को छोड़ देगा जैसे कि शाखा 2 के इतिहास में उस बिंदु पर सब कुछ विलय कर दिया गया है, जो कि आप जो चाहते हैं वह नहीं हो सकता है। ऊपर दिए गए पहले चेकआउट का एक बेहतर संस्करण शायद है

git checkout -B wip `git merge-base branch1 branch2`

जिस स्थिति में प्रतिबद्ध संदेश भी होना चाहिए

git commit -m"merging only $(git rev-parse branch2):file.py into branch1"

0

मैं उसी स्थिति में हूं, मैं एक शाखा से एक फाइल को मर्ज करना चाहता हूं, जिस पर 2 शाखा पर कई कमिट हैं। मैंने ऊपर दिए गए कई तरीकों की कोशिश की और अन्य मैंने इंटरनेट पर पाया और सभी विफल रहे (क्योंकि प्रतिबद्ध इतिहास जटिल है) इसलिए मैं अपना रास्ता (पागल तरीका) करने का फैसला करता हूं।

git merge <other-branch>
cp file-to-merge file-to-merge.example
git reset --hard HEAD (or HEAD^1 if no conflicts happen)
cp file-to-merge.example file-to-merge

0

मैंने जो किया है वह थोड़ा मैनुअल है, लेकिन मैं:

  1. शाखाओं को सामान्य रूप से मिलाया; के साथ मर्ज वापस कर दिया revert;
  2. मेरी सभी फ़ाइलों की जाँच HEAD~1की, अर्थात्, मर्ज कमिट में उनका राज्य;
  3. इस हैकरी को कमिट इतिहास से छिपाने के लिए मेरे कमिट किए गए।

बदसूरत? हाँ। याद करने के लिए आसान? हाँ भी।

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