2012-06-07 16 views
55

मेरे पास एक ही फाइल के साथ दो शाखाएं हैं (आप सोच रहे हैं कि यह एक .sql फ़ाइल है) और मैं इसे अंतःक्रियात्मक रूप से विलय करना चाहता हूं।गिट इंटरएक्टिव मर्ज?

बहुत अधिक मैं एक diff प्रोग्राम खोलना चाहता हूं जैसे कि जब कोई संघर्ष होता है (या कमांड लाइन) और वास्तव में किन लाइनों पर जाना है।

क्या ऐसा करने के लिए वैसे भी है?

उत्तर

52

हां, लेकिन यह ज्यादातर मैन्युअल रूप से ऐसा होने से होगा। आप गिट को बताएंगे कि आप दो प्रासंगिक शाखाओं को विलय कर रहे हैं, लेकिन यह परिणाम स्वयं को करने की कोशिश नहीं करनी चाहिए, (जोड़ने के लिए संपादित: और न ही तेज़-आगे अगर यह सोचता है कि विलय छोटा है):

git merge --no-commit --no-ff branch-to-merge 

तो फिर तुम के रूप में यह दो शाखाओं में छपी फ़ाइल के लिए Git कहेंगे:

git show HEAD:filename >filename.HEAD 
git show branch-to-merge:filename >filename.branch 

और उनके मर्ज आधार,

git show `git merge-base HEAD branch-to-merge`:filename >filename.base 

आप उन्हें उसी विलय करेंगे एनजी आप चाहते हैं जो कुछ भी उपकरण (जैसे)

meld filename.{HEAD,branch,base} 

आप मंच होगा कि (git add filename), और फिर मर्ज (git commit) करते हैं।

+4

और आप यह सब कैसे करते हैं ...? –

+1

एक ही चीज़ ग्राहम को आश्चर्यचकित कर रहा हूं ... मैंने 'गिट मर्ज - नो-प्रतिबद्ध शाखा' करने की कोशिश की और यह इसे विलय कर दिया ... मुझे क्या चाहिए 3 फाइलों, या 2 फाइलों के साथ समाप्त करना है। कि मैं एक diff का उपयोग कर सकता हूं और उस फाइल में जो कुछ भी चाहता हूं उसे ले जा सकता हूं। – Steven

+0

यदि आप मूल मर्ज कमांड को * सबकुछ * अकेले छोड़ने के लिए मैन्युअल रूप से करने के लिए चाहते हैं, तो आप इसे मौजूदा शाखा में रखने के लिए इसे 'गिट मर्ज-एसएस' के रूप में कॉल कर सकते हैं, लेकिन फिर यह आपके ऊपर है सुनिश्चित करें कि अन्य फाइलों में बदलाव इसे खत्म कर दें। – Novelocrat

1

आप मैन्युअल रूप से काम करने के लिए WinMerge, DiffMerge, या किसी भी उपलब्ध diff/merge UI टूल का उपयोग कर सकते हैं। यदि आप इसे "गिट difftool" में हुक करना चाहते हैं, तो आप उन उपकरणों को गिट के साथ काम करने के तरीके खोजने के लिए ऑनलाइन खोज सकते हैं।

35

सबसे आसान तरीका git merge <other_branch करने के लिए सबसे आसान तरीका है git mergetool संघर्षों को ग्राफिक रूप से हल करने के लिए। Mergetool कैसे सेट अप करें के लिए # 10935226 देखें।

हिचकिचाहट है, आपकी बदली गई फ़ाइल पुरानी के साथ तेजी से आगे बढ़ सकती है। फिर आपको थोड़ा और चालाक होना होगा।

नोवेलोक्रेट थोड़ा गहरा खोदने का एक शानदार तरीका प्रदान करता है, लेकिन आपको अक्सर प्रारंभिक कमांड को git merge --no-commit --no-ff <other_branch> में बदलना होगा क्योंकि - वास्तव में प्रतिबद्धता का मतलब है "विलय न करें ... जब तक कि यह एक तेज़- आगे विलय करें। " आप जो भी चाहते हैं उसे करने की कोशिश कर रहे बहुत से लोगों के लिए यह एक स्टिंगर है।

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

+1

10935226 इस प्रश्न का नंबर है। वहां लिखने का आपका क्या मतलब था? –

21

इस गिस्ट के अनुसार, जहां अस्थायी शाखा हो सकती है।

https://gist.github.com/katylava/564416


मास्टर पर:

git checkout -b temp 

अस्थायी पर:

git merge --no-commit --no-ff refactor 

... जो सब कुछ है, तो चरण:

git reset HEAD 

फिर टुकड़े जोड़ना शुरू कर आप चाहते हैं:

git add --interactive 
+1

यह काम करता था, लेकिन मुझे 'गिट रीसेट हेड' में 'हेड' छोड़ना पड़ा, लेकिन गिट रीसेट ठीक काम करता था। – Micah

+0

अंतिम 'गिट प्रतिबद्ध' विलय नहीं करता है! - मैं अंत में विलय कैसे समाप्त करूं? –

+0

@RobertSiemer शायद मुझे लगता है कि आप अगले चरणों में सामान्य विलय कर सकते हैं: गिट सह मास्टर; गिट मर्ज अस्थायी –

13

शाखा आप में मर्ज करना चाहते हैं से:

git checkout -p branch_to_merge -- 

यह branch_to_merge चेकआउट नहीं होगा, लेकिन आप सहभागी से जिसे जोड़ने दूँगी पैच (diff)।

http://git-scm.com/docs/git-checkout

0

सबसे अच्छा तरीका है मैं यह करने के पाया है है:

  1. चेकआउट आपके परिवर्तनों के साथ शाखा
  2. उस बिंदु
  3. से एक नई शाखा बनाने के लिए अपने नए शाखा रीसेट वह प्रतिबद्धता जिसे आप तुलना करना और बनाना चाहते हैं। रीसेट डिफ़ॉल्ट रूप से "मिश्रित" रीसेट होगा, जिसका अर्थ है कि यह "काम करने वाले पेड़" को नहीं बदलेगा, यानी वास्तविक कोड फ़ाइलें
  4. इस बिंदु पर, मेरा टेक्स्ट एडिटर (वीएससीओडी) मुझे दिखाता है कि मेरे वर्तमान के बीच क्या अंतर है फाइलें और प्रतिबद्धता जिसे मैं रीसेट करता हूं। मैं यह चुनने के लिए कोड संपादित कर सकता हूं कि मैं कौन सी लाइनों को प्रतिबद्ध करना चाहता हूं। यह क्या करता है मुझे यह देखने की अनुमति देता है कि मेरी शाखा बदल गई है और कोड की हर पंक्ति की पुष्टि करें। यह उपयोगी है जैसे कि मेरे परिवर्तनों को वापस उत्पादन में विलय करना।
संबंधित मुद्दे