2010-01-18 23 views
13

मेरे पास my_branch में एक बाइनरी फ़ाइल है, और जब मुझे इसमें बदलाव करने की ज़रूरत है, तो गिट निश्चित रूप से इसे विलय नहीं करेगा।मैं एक बाइनरी फ़ाइल कैसे विलय करूं?

तो क्या अब मैं क्या है:

git checkout my_branch 
# make a change to gui.bin 
mv gui.bin ~/ 
git commit -a 
mv ~/gui.bin . 
git commit -a 
# git rebase to 1 commit 
git checkout master 
git merge my_branch 

लेकिन वहाँ एक आसान तरीका है?

+0

http: // stackoverflow भी देखें।कॉम/प्रश्न/1 910444/गिट-मर्ज-एस-थीस-जरूरी-लेकिन-मुझे-पता-यह-अस्तित्व में नहीं है/1 910479 # 1 910479 – VonC

उत्तर

17

मैं काफी यकीन है कि क्या अपने परीक्षण मामले में गाड़ी चला रहा है नहीं कर रहा हूँ: यह अनिवार्य रूप से की तरह कुछ कर सकते हैं। प्रतीत होता है कि आप gui.bin को रास्ते से बाहर ले जा रहे हैं और फिर इसे वापस जिस तरह से ...

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

मुझे लगता है कि आप अपने उदाहरण में commit -a का उपयोग करते हैं। अनावश्यक संघर्षों से बचने के लिए पहला कदम यह है कि जब तक आप उन्हें प्रतिबद्ध नहीं करना चाहते हैं तब तक किसी भी बाइनरी को आकस्मिक रूप से छुआ नहीं जा सकता है। यदि आप git add फ़ाइलों को -a के बिना प्रतिबद्ध करने और प्रतिबद्ध करने की आवश्यकता है तो इससे मदद मिलेगी। वैकल्पिक रूप से, यदि केवल एक फ़ाइल है जिसे आप प्रतिबद्ध नहीं करना चाहते हैं तो आप add -u कर सकते हैं और प्रतिबद्ध करने से पहले इसे रीसेट कर सकते हैं।

git add -u 
git reset -- dontcommit.dat 
git commit 

जब आप शाखाओं को मर्ज करते हैं जो दोनों बाइनरी बदलते हैं तो आप एक संस्करण रखना चाहते हैं, न कि दूसरे। किसी मर्ज जहां Git आप अपने को अपनी बाइनरी में संघर्ष आप शाखा है कि आप इस तरह पर थे में संस्करण का उपयोग करने Git बता सकते हैं कि बताता है के बाद:

git checkout --ours binary.dat 
git add binary.dat 

या शाखा है कि आप इस तरह के विलय कर रहे हैं से :

git checkout --theirs binary.dat 
git add binary.dat 
+0

अब यह वास्तव में अच्छा लग रहा है। तो बस स्पष्ट करने के लिए। अगर मैंने "गिट चेकआउट मास्टर" किया है। तो मुझे अंतिम कोड ब्लॉक का उपयोग "उनके" के साथ करना चाहिए और फिर विलय करना चाहिए? – Louise

+0

आपका प्रश्न मेरे लिए 100% स्पष्ट नहीं है। यदि आप 'मास्टर' (सफल चेकआउट के बाद) पर हैं, और आप अन्य ब्रांच मर्ज करते हैं, तो यह केवल 'binary.dat' में संघर्ष उत्पन्न करता है, तो मेरे उत्तर में पिछले दो आदेश' अन्य ब्रांच 'से संस्करण का चयन करेंगे और संघर्ष को हल के रूप में चिह्नित करें। आप हल किए गए संघर्ष को करने के लिए 'प्रतिबद्ध प्रतिबद्ध' कर सकते हैं। –

+0

उत्कृष्ट। धन्यवाद =) – Louise

10

आप इस्तेमाल कर सकते हैं में निर्मित binary मर्ज चालक:

binary: Keep the version from your branch in the work tree, but 
leave the path in the conflicted state for the user to sort out. 

उदाहरण लाइन .gitattributes:

*.bin -crlf -diff merge=binary 

लाइन अंत जोड़ नहीं करने के लिए, अंतर के लिए नहीं है, और रखने के लिए Git बताता है स्थानीय संस्करण

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

कि केवल अपने काम की नकल ...

एक और तरीका है एक कस्टम मर्ज ड्राइवर का उपयोग करने के लिए है को बरकरार रखता है:

[merge "binmerge"] 
    name = my binary merge script 
    driver = binmerge.sh %O %A %B 

कि फ़ाइलों की एक सूची है जो हमेशा अपने स्थानीय संस्करण द्वारा ओवरराइट किया जाना चाहिए के खिलाफ परस्पर विरोधी फ़ाइल की जाँच कर सकते हैं। ..

मर्ज ड्राइवर का उपयोग, config में परिभाषित है, तो निर्दिष्ट क्या रास्तों यह .gitattributes में पर इस्तेमाल किया जाना चाहिए, ताकि जैसे करने के लिए:

*.bin -crlf -diff merge=binmerge 

binmerge.s विलय को संभालने के लिए एच कहा जाएगा।

#!/bin/sh 
echo "Performing merge of binary object ($1, $2, $3)" 
touch $2 
exit 0 
+0

ठीक है, गिट के लिए ड्राइवर मेरे लिए बिल्कुल नया है। क्या यह कुछ है जो मैंने .git config फ़ाइल में रखा है? – Louise

+1

हाँ, जो ~/.gitconfig या .git/config – jspcal

+0

में जाना होगा बहुत दिलचस्प। तो क्या मुझे बस ड्राइवर = gui.bin बदलना चाहिए? – Louise

संबंधित मुद्दे