2013-01-15 7 views
8

विलय पर हटाए गए फ़ाइल को अनदेखा करता है मेरे पास दो भंडार हैं। समय-समय पर, मैं other की सामग्री को main में मर्ज करना चाहता हूं। हालांकि विलय हटाए गए फाइलों को अनदेखा करता है। मुझे एक उदाहरण के माध्यम से यह स्पष्ट करने दें:गिट

mkdir -p test/main test/other 

cd test/other/ 
git init 
touch one two three 
git add . 
git commit -m "Add one, two and three." 

cd ../main/ 
git init 
touch four 
git add . 
git commit -m "Add four." 

रिमोट के रूप में main करने के लिए other जोड़ें।

git remote add other ../other/ 
git fetch other 

इसकी सामग्री मर्ज करें।

git merge --squash other/master 
git commit -m "Merge other." 

यह फ़ाइलों को सही तरीके से जोड़ता है। अब, other में एक फ़ाइल को हटा दें।

cd ../other/ 
git rm two 
git commit -m "Remove two." 

main में परिवर्तन मर्ज करें।

cd ../main/ 
git fetch other 
git merge --squash other/master 

के बाद मर्ज git status का कहना है:

# On branch master 
nothing to commit (working directory clean) 

मैं, मर्ज two नष्ट करने के लिए उम्मीद करेंगे के रूप में यह other में हटाया गया था। मैं क्या गलत कर रहा हूं?

उत्तर

6

यहां समस्या स्क्वैश प्रतिबद्धताओं का उपयोग है।

जब आप merge --squash करते हैं, तो आप शाखा के सभी इतिहास को त्याग देते हैं। आपने वास्तव में "शाखा को विलय नहीं किया है" - आपने अभी अपने इतिहास का एक संघीय प्रतिनिधित्व लागू किया है। तो यदि आप बाद में merge --squash करते हैं, तो गिट सभी शाखा के इतिहास में काम करता है (क्योंकि दोनों शाखाओं में कोई आम पूर्वज नहीं है)।

जब आप पहलेmerge --squash करते हैं, आप एक main जिसमें पर प्रतिबद्ध "बनाएँ एक, दो, तीन और" पैदा करते हैं। तो main का इतिहास पहले "चार बनाएं" है, फिर "एक, दो, और तीन बनाएं"।

जब आप दूसरा merge --squash करते हैं, तो आप एक प्रतिबद्धता जोड़ते हैं (प्रभाव में) "एक, दो, और तीन बनाएं" प्लस "दो निकालें"। उन दोनों का नेट एक साथ (squashed!) है "एक और तीन बनाएं" है। तो गिट ऑटो-विलय को आपके वर्तमान रेपो स्टेटस के साथ "एक और तीन बनाएं" को विलय करता है - जो आपको चार फाइलों के साथ छोड़ देता है। सामग्री मर्ज स्वचालित रूप से सफल हो जाती है क्योंकि फाइलें "एक" और "तीन" दोनों तरफ समान होती हैं।

यदि आप रिमोट के साथ एक रिपो अप-टू-डेट रखना चाहते हैं तो आपको स्क्वैशिंग के बजाय "असली" विलय या चेरी-पिकिंग का उपयोग करना चाहिए। एक merge --squash समान बात नहीं है "रिमोट रिपोजिटरी में सभी नए कामों के माध्यम से खेलते हैं और उन्हें यहां एकीकृत करते हैं"।

+0

सच है, यह स्पष्टीकरण समझ में आता है। मैं दूसरे के साथ मुख्य इतिहास को प्रदूषित न करने के लिए स्क्वैश विलय करना चाहता था। लेकिन ऐसा लगता है कि कोई दूसरा रास्ता नहीं है। आपकी सहायताके लिए धन्यवाद! –

+1

@GergoErdosi यदि आप * "अनपॉल किए गए" इतिहास को देखना चाहते हैं, तो 'गिट लॉग' के लिए 'प्रथम-पैरेंट' विकल्प देखें। – Borealid

+0

टिप के लिए धन्यवाद! –