2012-12-04 11 views
38

में एक शाखा से एक शाखा में एक विशिष्ट फ़ाइल को कैसे विलय कर सकता हूं मेरे पास एक गिट रेपो में 2 शाखाएं हैं, उन्हें कॉल, देव और परीक्षण कहें। मेरे पास एक फ़ाइल में कुछ बदलाव हैं, somecode.js। दोनों शाखाओं में somecode.js में परिवर्तन हैं। 2 शाखाएं काफी हद तक अलग हो गई हैं (लेकिन प्रबंधकीय) इसलिए एक सीधी "विलय" अपर्याप्त है।मैं गिट

मैंने http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/ को आजमाया है लेकिन यह दोनों फ़ाइलों की सामग्री को मर्ज नहीं करता है। वास्तव में फ़ाइल की सामग्री को विलय करने के बजाय आप मूल रूप से फ़ाइल पर लिखते हैं।

मैं भी कोशिश की है:

git checkout -b newbranch 
git checkout test somecode.js 
git commit -m "somecode changes from newbranch" 
git checkout dev 
git merge newbranch 

और

git checkout -m test somecode.js 

(मैं वास्तव में मर्ज के लिए -m साथ उम्मीद थी, लेकिन यह मेरे लिए काम करने के लिए प्रकट नहीं किया था ...)

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

तो, दोहराने के लिए, मैं शाखा में फ़ाइल को लिखने के बिना एक शाखा से किसी अन्य शाखा में एक विशिष्ट फ़ाइल कैसे विलय कर सकता हूं, मैं गिट का उपयोग करने में विलय कर रहा हूं।

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge – rlegendi

+0

चेरी-पिक समस्या को हल नहीं करता है क्योंकि इसमें पूर्ण प्रतिबद्धता शामिल होती है । तो यह कई फाइलें लाएगा और मुझे यह देखने के लिए सभी कामों को देखना होगा कि कौन से प्रासंगिक – jeremy

+0

संभावित डुप्लिकेट [मैं एक फ़ाइल में परिवर्तन कैसे विलय करने के बजाए परिवर्तनों को विलय कर सकता हूं?] (Http: // stackoverflow .com/प्रश्न/10784523/कैसे-करें-i-merge-change-to-a-single-file-than-than-merging-commits) –

उत्तर

40

मैं तुम्हें

git checkout -p 

उपयोग करने के लिए अपने मामले

git checkout dev 
git checkout -p test somecode.js 

में तरह लगता है और आप सहभागी डिफ आवेदन कर सकते हैं।

+0

बिल्कुल सही !! धन्यवाद!! – jeremy

+1

लेकिन आप गिट को किसी भी विलय करने की अनुमति नहीं देते .. आप मैन्युअल रूप से सभी काम करते हैं। –

+1

@ the.malkolm पहले प्रश्न पर आप 'ए' के ​​साथ जवाब देते हैं और यही वह है। (ए - इस हंक और फ़ाइल में बाद में सभी शिकारी लागू करें) –

1

मुझे लगता है कि गिट मर्ज-फाइल वह है जिसे आप ढूंढ रहे हैं। आदमी पृष्ठ से:

git merge-file incorporates all changes that lead from the <base-file> to 
<other-file> into <current-file>. The result ordinarily goes into <current-file>. 
git merge-file is useful for combining separate changes to an original. Suppose 
<base-file> is the original, and both <current-file> and <other-file> are 
modifications of <base-file>, then git merge-file combines both changes. 
+0

मुझे दूसरी शाखा से फ़ाइल निर्दिष्ट करने का कोई तरीका नहीं दिख रहा है। ऐसा लगता है कि यह आंतरिक उपयोग के लिए शायद है? क्या आप उपयोग दिखा सकते हैं? – jeremy

+0

'गिट मर्ज-फाइल' फाइलों के लिए केवल 3-तरफा मर्ज ड्राइवर है। वह विवरण थोड़ा भ्रामक है; यह बीच में सभी कामों को नहीं देखता है, यह सिर्फ क्लासिक 3-तरफा विलय करता है। –

5
git checkout dev 
git show test:somecode.js > somecode.js.theirs 
git show $(git merge-base dev test):somecode.js > somecode.js.base 
git merge-file somecode.js somecode.js.base somecode.js.theirs 

इस तरह आप मैन्युअल रूप से एक तीन तरह से देव शाखा पर somecode.js में परीक्षण शाखा पर somecode.js से विलय कर देंगे।

या .. आप अपने इच्छित परिवर्तनों के साथ एक अस्थायी शाखा बना सकते हैं और इससे स्क्वैश विलय कर सकते हैं। क्या यह 'गिट रास्ता' पर्याप्त है? :)

git checkout -b test/filtered $(git merge-base dev test) 
git diff ..test -- somecode.js | git apply 
git add -- somecode.js 
git commit -m "Updated somecode.js" 
git checkout dev 
git merge --squash test/filtered 
git branch -D test/filtered 
+0

मुझे लगता है कि काम करता है, लेकिन मैं इसे करने के लिए "गिट-वे" की उम्मीद कर रहा हूं। मैं कुछ और उत्तरों के लिए इंतजार करूंगा और अगर मैं गिट-रास्ता नहीं समझ पा रहा हूं तो इसे स्वीकृति दूंगा। – jeremy

+0

क्या यह एक 'गिट रास्ता' पर्याप्त है? :) –

+3

मैं कुछ "गिट चेकआउट -एम परीक्षण कुछcode.js" की उम्मीद कर रहा था – jeremy