2011-08-05 10 views
5

मैं जिप स्नैपशॉट से एक पूर्वव्यापी परियोजना इतिहास का निर्माण कर रहा हूँ के लिए प्रतिबद्ध। मैं पहले से ही स्नैपशॉट हाथ थे कि से प्रतिबद्ध की एक लंबी शाखा अनुक्रम का निर्माण किया है। अब मैं अंत में कुछ और 'मिला' स्नैपशॉट कि प्रतिबद्ध अनुक्रम के 'बीच में' विभिन्न स्थानों पर किया जाना चाहिए पर जोड़ लिया है।Git: कैसे करने के लिए फिर से आदेश (गंभीर रूप से) एक दृश्य

मैं पुनः आदेश देना Git स्नैपशॉट git rebase -i <startCommit> उपयोग करने के लिए कोशिश कर रहा हूँ। मैं बस पिक सूची ऑर्डर के आसपास स्वैप करता हूं। यह केवल फिर से लिखकर वस्तुओं के लिए प्रतिबद्ध है, लेकिन अंतर्निहित पेड़ ही (क्योंकि स्नैपशॉट नहीं बदला है) रखने का एक मामला होना चाहिए।

ऐसा लगता है कि इस मामले में, रीबेज की तरह दिख रहा है, अभी भी सरल पुन: व्यवस्था करने के बजाय पैच बनाने और कई संघर्ष करने की कोशिश कर रहा है। क्या इस विशेष मामले के लिए कोई और उचित आदेश है? मेरे पास कोई विलय नहीं है, और केवल एक शाखा है। पूरा रेपो अभी भी बहुत स्थानीय और निजी है।

+1

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

+0

मुझे आश्चर्य है कि [इस कस्टम मर्ज ड्राइवर] का उपयोग कर रहे हैं (http://stackoverflow.com/questions/928646/how-do-i-tell-git-to-always-select-my-local-version-for- विवादित-विलय-ऑन-ए-एसपी/930495 # 930495) या इसी तरह काम करेगा। –

+0

@ करल: कम से कम समझने के लिए कि यह क्या कर रहा है, उस विधि के माध्यम से मुझे एक अच्छा नज़र डालना होगा। त्वरित रूप से पता चलता है कि यह Adymitruk की विधि से आगे निकल सकता है अगर यह मेरे विंडोज <-> लिनक्स भ्रम को सरल बनाता है ;-) –

उत्तर

3

पुन: परेशान न करें। एक नई शाखा बनाओ। कालानुक्रमिक क्रम जो आप चाहते में सभी प्रतिबद्ध के लिए

git checkout X -- . 
git add -A 
git commit -C X 

दोहराएँ: यदि एक्स SHA1 या उपयोग करने के लिए प्रतिबद्ध है, तो के treeish है।

एक उदाहरण है जहाँ हम पिछले 5 प्रतिबद्ध का क्रम उलटने:

git checkout -b temp old_branch~5 
git checkout old_branch -- . 
git add -A 
git commit -C old_branch 
git checkout old_branch~1 -- . 
git add -A 
git commit -C old_branch~1 
git checkout old_branch~2 -- . 
git add -A 
git commit -C old_branch~2 
git checkout old_branch~3 -- . 
git add -A 
git commit -C old_branch~3 
git checkout old_branch~4 -- . 
git add -A 
git commit -C old_branch~4 

git push . HEAD:old_branch -f 
git checkout old_branch 
git branch -d temp 

git log -5 # to see the new history 

आशा है कि यह मदद करता है।

+0

मुझे लगता है कि मैं इस के साथ भी जा सकता हूं, लेकिन प्रतिबद्ध sha1s की सूची प्राप्त करने के लिए प्रारंभिक रीबेस का उपयोग करने के मोड़ के साथ, मुख्य रूप से क्योंकि यह उन्हें सभी को पिक फ़ाइल में रखता है। फिर इसे एक स्क्रिप्ट के रूप में चलाएं। अन्य ओएस पर 30 वर्षों के बाद लिनक्स संपादन और स्क्रिप्ट विधियों में से कुछ सीखने के लिए यह अजीब है! –

+0

क्या सभी गिट्स को चुनने के लिए 'गिट ऐड-ए' कमांड का पिछला भाग होना चाहिए, या यह '-A' का एक निहित हिस्सा है? (मैंने हमेशा इसे देखा/उपयोग किया है) –

+0

मुझे चेकआउट के बीच गिराए गए निर्देशिकाओं और फ़ाइलों को हटाने के अनुक्रम की विफलता के साथ भी समस्या हो रही है। शीर्ष स्तरीय निर्देशिका नाम प्रत्येक स्नैपशॉट के बीच बदलता है, जो आमतौर पर नामों के सेट के रूप में दिखाया जाएगा, लेकिन यहां मैं बस एक योजक सेट प्राप्त कर रहा हूं! कोई सुझाव? –

0

मैं रिबेस आसान बनाने में सहायता नहीं कर सकता, लेकिन मैं समझा सकता है क्यों यह एक नहीं है "सरल फिर से व्यवस्था।" उदाहरण के तौर पर, एक फ़ाइल लें जिसमें प्रति संशोधन में संलग्न टेक्स्ट की एक पंक्ति हो। पर पहले प्रतिबद्ध, ऐसा लगता है:

Commit 1 

पर दूसरे के लिए प्रतिबद्ध है, क्योंकि आप मूल रूप से उन्हें आदेश से बाहर रखा है, यह दिखाई देता है:

Commit 1 
Commit 2 
Commit 3 

तीसरे पर प्रतिबद्ध है, जो आपके था दूसरा स्नैपशॉट, ऐसा लगता है:

Commit 1 
Commit 2 

Git Git को पैच के साथ काम कर रहा है, इसलिए, सेरी प्रतिबद्ध के तों लगता है कि:

  • दर्शाने वाली पंक्ति के बाद "कमिट 1"
  • लाइनों है कि कहते हैं कि "कमिट 2" जोड़ें दर्शाने वाली पंक्ति के साथ एक फ़ाइल जोड़ें और "3 प्रतिबद्ध" "कमिट 1"
    • एक लाइन टी के साथ एक फ़ाइल जोड़ें:
    • "2 कमिट"

    जब आप इसे पुन: व्यवस्थित, ऐसा लगता है कि लाइन है कि कहते हैं, "कमिट 3" दर्शाने वाली पंक्ति के बाद निकालें टोपी कहते हैं, "कमिट 1"

  • "3 कमिट" के बाद लाइन है कि कहते हैं, "2 कमिट"
  • लाइनों है कि कहते हैं कि "कमिट 2" और "3 कमिट" पंक्ति को कहते हैं के बाद जोड़े दर्शाने वाली पंक्ति निकालें "कमिट 1 "

यह दूसरे चरण के लिए हो जाता है, के साथ कोई लाइनों देखता है" कमिट 2 "के खिलाफ, क्या करना है पता नहीं है, इसलिए एक मैनुअल मर्ज की आवश्यकता मैच के लिए।

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

+0

यही कारण है कि मुझे लगता है कि 'गिट रिबेस' इस नौकरी के लिए सही उपकरण नहीं है। मुझे यकीन नहीं है कि वास्तव में क्या है। – svick

+0

यह बहुत कठिन होगा। आप एक पैच लागू नहीं करना चाहते हैं, बल्कि इसके बजाय प्रत्येक प्रतिबद्धता में मौजूद स्नैपशॉट्स को एकसाथ सिलाई करें। –

0

अपने इतिहास इस तरह दिखाई देता है:

a->b->c->d->e->f 

कहाँ e और f अपेक्षा की जाती है में a और d

के बीच

तुम अब भी rebase -i कर सकते हैं कहीं भी रखा जा सकता है, लेकिन प्रतिबद्ध पर edit डाल इससे पहले कि आप स्नैप शॉट डालना चाहते हैं। जब गिट उस संपादन के लिए रुक जाता है, तो स्नैपशॉट को अपने कामकाजी डीआईआर में रखें और इसे जोड़ें/प्रतिबद्ध करें। अगले स्थान तक रिबेस जारी रखें, कुल्ला, दोहराना।

यदि इसे कहा जाने की आवश्यकता है, तो आप प्रारंभिक रूप से गलत जगहों, e और f को भी हटाना चाहते हैं, जो गलत जगहों के स्नैप शॉट्स से निपटते हैं।

+0

यह अभी भी कई संघर्षों का कारण बन जाएगा। और यह परिवर्तनों को लागू करने का प्रयास करेगा, इसलिए परिणाम पहले जैसा ही पेड़ नहीं हो सकता है। – svick

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