Git मर्ज को पूर्ववत करने का सबसे अच्छा तरीका क्या है जो रेपो से फ़ाइलों को मिटा देता है?


13

तो निम्नलिखित की कल्पना करें (और हम सभी SourceTree का उपयोग कर रहे हैं):

  1. हम सभी मूल / विकास कार्य कर रहे हैं।
  2. मैं एक हफ्ते के लिए छुट्टी पर जाता हूं।
  3. मेरे सहकर्मी पिछले कई दिनों से स्थानीय स्तर पर काम कर रहे हैं, जो मूल विलय के बिना / अपनी स्थानीय विकास शाखा में वापस विकसित करने के लिए है।
  4. वह एक धक्का देने की कोशिश करता है, कहा जाता है कि उसे पहले विलय करना है, और फिर एक पुल करता है।
  5. उसे एक संघर्ष हो जाता है, जिससे स्वचालित कमिट-ए-मर्ज को आगे बढ़ने से रोक दिया जाता है।
  6. यह मानते हुए कि Git SVN की तरह है, मेरा सहकर्मी "नई" फाइलों को उनकी कार्यशील प्रतिलिपि में छोड़ देता है और फिर मर्ज शुरू कर देता है - उन "नई" फाइलों को मूल / विकास के प्रमुख से मिटा देता है।
  7. उस संशोधन के शीर्ष पर देव कार्य का एक सप्ताह चलता है।
  8. मैं छुट्टियों से वापस आता हूं और पता करता हूं कि मेरे काम के कई दिन गायब हैं।

हम सब Git के लिए बहुत नए हैं (यह प्रयोग करने वाला हमारा पहला प्रोजेक्ट है), लेकिन मैंने इसे ठीक करने के लिए जो किया वह था:

  1. "विकासशील" का नाम बदलकर "develop_old" करें।
  2. एक नई शाखा "develop_new" में develop_old को मिलाएं।
  3. बुरा मर्ज करने से पहले अंतिम प्रतिबद्धता के लिए develop_new शाखा रीसेट करें।
  4. चेरी तब से हर एक कमिटमेंट को चुनती है, एक-एक करके हाथ से टकराव को हल करती है।
  5. मूल के लिए develop_old और develop_new पुश करें।

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

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


1
क्या आप विभिन्न पेड़ों के git logसाथ हुई घटनाओं के बारे में उचित टिप्पणी के साथ गिट ट्री (उचित रूप से रीडायरेक्ट किए गए) या अपने पसंदीदा प्रारूप का आउटपुट पोस्ट कर सकते हैं ? (मैं / फिर से एनोटेट git log --graph --pretty=oneline --abbrev-commitऔर वहाँ से जाऊँगा)

1
आपके लिए बहुत देर हो चुकी है, लेकिन यूनिट परीक्षणों ने इसे पकड़ लिया है।
नालपुरी

1
@ वैमानिक: नहीं अगर बुरा मर्ज भी यूनिट परीक्षण नष्ट कर दिया।
हारून

वाह, यह वास्तव में कपटी दुर्भाग्य है।
nalply

जवाबों:


6

अगर मैं सही ढंग से समझ गया, तो यह आपकी स्थिति है:

    ,-c--c--c--c--M--a--a--X ← develop
o--o--y--y--y--y-´

कुछ सामान्य इतिहास (ओ) के बाद, आपने अपना काम (y) किया और धक्का दिया। आपके सहकर्मी (c) ने अपने स्थानीय भंडार पर काम किया और एक बुरा मर्ज (M) किया। बाद में एम के शीर्ष पर कुछ अतिरिक्त कमिट (ए) हो सकते हैं।

git reset --hard develop M^2
git branch coworker M^1

अब आपका ग्राफ खराब मर्ज से पहले जैसा दिखता है:

    ,-c--c--c--c ← coworker
o--o--y--y--y--y ← develop

एक अच्छा मर्ज करें (G):

git checkout develop
git merge coworker

जिसके परिणामस्वरूप:

    ,-c--c--c--c-、
o--o--y--y--y--y--G ← develop

अब अतिरिक्त कमानों की रोपाई करें:

git reset --hard X
git rebase --onto G M develop

यह अंतिम परिणाम देता है:

    ,-c--c--c--c-、
o--o--y--y--y--y--G--a--a--X ← develop

विदित हो कि इसके परिणामस्वरूप अधिक विलय संघर्ष हो सकता है। इसके अलावा, आपने अभी-अभी इतिहास बदला है, अर्थात आपके सभी सहकर्मियों को नए इतिहास का क्लोन / रीसेट / रिबास करना चाहिए।

पुनश्च: निश्चित रूप से आपको इसी कमिट आईडी द्वारा प्रतिस्थापित करना चाहिए G, Mऔर Xआपके आदेशों में।


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

यह क्लोन / रीसेट / रिबास वाला हिस्सा था। - यदि कुछ ही डेवलपर हैं, तो उन्हें अपनी रिपॉजिटरी अपडेट करने के लिए कहना एक वैध विकल्प हो सकता है।
माइक्स

1

यह अच्छा है कि आप इस बारे में सोच रहे हैं कि रिपॉजिटरी को कैसे ठीक किया जाए, लेकिन अगर आपके सहकर्मी ने केवल नई फ़ाइलों को हटा दिया है और बहुत सारे अपडेट को अधिलेखित नहीं किया है, तो एक बहुत ही सरल दृष्टिकोण केवल उन फ़ाइलों को पुनर्स्थापित करना होगा जो हटाए गए थे।

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

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

तो अपने सहकर्मी को यह जरूर समझाएं कि यह एक महाकाव्य विफल था, लेकिन प्रमुख सर्जरी के लिए तैयार होने से पहले बैंड-सहायता पर थप्पड़ मारने पर विचार करें।


मैं सहमत हूं, अगर यह पूरी तरह से पूरी फाइलें हैं जो एक चीज है जो आप कर सकते हैं यदि आप पुरानी फाइलों में इतिहास के बारे में परवाह नहीं करते हैं: 1. वर्तमान में गड़बड़ शाखा से एक नई शाखा बनाएं। 2. खराब शाखा पर वापस जाएं और एक और नई शाखा बनाएं जो आपकी बचाव शाखा है। 3. अपनी बचाव शाखा से विफल होने से पहले वापस प्रतिबद्ध हो जाएं। 4. हटाए गए फ़ाइलों को git के बाहर कहीं कॉपी करें 5. अन्य नई शाखा में स्विच करें। 6. हटाए गए फ़ाइलों के नए संस्करणों को नई शाखा में कॉपी करें और कमिट करें। एक और अधिक जटिल तरीका है जो इतिहास को बचाता है जो लिनुस टी। द्वारा प्रसिद्ध पोस्ट है
एलिन

1
वास्तव में यह दिखाता है कि आप चेकआउट jasonrudolph.com/blog/2009/02/25/… का उपयोग कैसे कर सकते हैं । यह बहुत अच्छा है।
एलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.