2010-03-11 23 views
42

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

मुझे लगता है कि मुझे रिपो बी को रिपो ए पर किसी भी तरह से पुनर्जीवित करना है, लेकिन मुझे नहीं पता कि यह कैसे करना है, शायद fetch/pull और rebase का उपयोग कर?

उत्तर

57

यदि ए और बी एक ही रेपो नहीं हैं (आपने अपनी नवीनतम कामकाजी प्रति का उपयोग करके बी बनाया है), तो आपको graft का उपयोग करने का नाटक करने के लिए उपयोग करना होगा कि उनके पास आम इतिहास है।

मान लेते हैं आप प्रति VonC’s answer के रूप में बी के लिए एक रिमोट के रूप में एक जोड़ा है, और रेपो इस की तरह दिखता है:

~/B$ git tnylog 
* 6506232 (HEAD, master) Latest work on B 
* 799d6ae Imported backup from USB stick 
~/B$ git tnylog A/master 
* 33b5b16 (A/master) Head of A 
* 6092517 Initial commit 

एक भ्रष्टाचार बी की जड़ यह है कि अपनी मूल है कह बनाएं एक के सिर:

echo '799d6aeb41095a8469d0a12167de8b45db02459c 33b5b16dde3af6f5592c2ca6a1a51d2e97357060' \ 
>> .git/info/grafts 

अब उपरोक्त दो इतिहास एक के रूप में जब आप बी भ्रष्टाचार स्थायी बनाने के लिए इतिहास का अनुरोध दिखाई देगा कोई तर्क के साथ एक सरल git filter-branch है। फ़िल्टर-शाखा के बाद, हालांकि, आप किसी भी शाखा पर नहीं हैं, इसलिए आपको git branch -D master; git checkout -b master होना चाहिए।


git tnylog = git log --oneline --graph --decorate

+2

+1 ए और बी प्रतिबद्ध इतिहास में पूरी तरह भिन्न थे। – VonC

+3

यह एक शानदार मदद थी; पूरी तरह से झगड़ा के साथ मैं क्या चाहता था। धन्यवाद! –

+1

मैंने कई रिपॉजिटरीज़ को एक में सिलाई करने के लिए बस उप-मर्ज दृष्टिकोण का उपयोग किया। मैं एक दूसरे पर एक बार फिर से प्रयास करने के प्रयास में लगातार असफल रहा। भ्रष्टाचार बिंदुओं का उपयोग करके, अब मैं उन्हें एक एकल विकास समयरेखा पर सिलाई करने में सक्षम हूं, धन्यवाद! –

24

ए और बी हैं, तो एक ही रेपो (प्रथम SHA1 आम हैं), आप:

बी के लिए एक रिमोट के रूप में
  • घोषित एक: बी रेपो पर git remote add A /path/to/A
  • git fetch Aupdate all remote A branches करने के लिए
  • git checkout dev (बी, जहाँ आप विकसित कर रहे हैं पर)
  • git rebase A/devBranch बी पुनः चलाने के लिए (यानी आप क्या विकसित करने या अपने बैकअप से फिर से विकसित) A/devBranch के शीर्ष पर (विकास आप खो)। इस SO question की तरह थोड़ा।

अंतिम चरण आपको खोने वाले व्यक्ति के साथ अपने देव को सिंक करने की अनुमति देता है।
लेकिन वास्तव में, एक बार आप एक से ला नहीं है, तो आप से किया जाता है: बी अब "सभी" इतिहास (एक आप खो दिया है और अपने वर्तमान काम)

+0

धन्यवाद, काम करने के लिए, बस मर्ज के दौरान कुछ विवादों को सुलझाने के लिए है लगता है/अब rebase :) – kroimon

+0

@kroimon: संघर्ष अपरिहार्य थे, मुझे लगता है, जब से तुम थे ए में किए गए कोड के कुछ हिस्से में बी में फिर से विकास करना। – VonC

+0

मैं एक अलग सिर में समाप्त हुआ, और इसे संदर्भित करना पड़ा: https://stackoverflow.com/a/25670296/1807668 –

2

सबसे पहले, एक काम क्लोन बनाकर शुरू होता है रेपो ए

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

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