2012-11-02 16 views
11

मैंने देखा है कि बहुत से लोग git rebase के बारे में बात करते हैं और यह क्या करता है, उदा। Hg: How to do a rebase like git's rebase और लोग जो प्राप्त करते हैं उसके बारे में बात करते हैं (रैखिक इतिहास देता है), उदा। यहां Git rebase loses history, then why rebase? लेकिन मैं यह नहीं समझ सकता कि आप ऐसा क्यों करना चाहते हैं।मैं गिट रिबेस क्यों करना चाहूंगा?

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

क्या आप लाभ को समझने के लिए एक आसान है, लेकिन गलत, इतिहास ग्राफ है। क्या प्रयास के लायक है?

अग्रिम धन्यवाद। जब धक्का एक भी वादा या के लिए प्रतिबद्ध एक कम समय (घंटे या मिनट) में विकसित एक छोटी संख्या

+0

महान प्रश्न - व्यक्तिगत रूप से मैंने उल्लेख किए गए सटीक कारणों से, मैं व्यक्तिगत रूप से पुन: प्रयास से बचने से बचता हूं। मुझे लगता है कि यह व्यक्तिगत वरीयता का मामला है, लेकिन जब मैं इतिहास ग्राफ दिखाता हूं कि वास्तव में क्या हो रहा था, तो मैं यह भी पसंद करता हूं। –

उत्तर

8

रिबेस सबसे उपयोगी है।

एक साझा सर्वर के लिए जोर दे रहा से पहले, एक पहले इस बीच-नाकाम रहने के ऐसा करने के लिए एक गैर तेजी से आगे धक्का बनाना होगा में मूल के HEAD के लिए किए गए प्रतिबद्ध खींच चाहिए। ऐसा करने में, कोई मर्ज (git pull) या रीबेस (git pull --rebase) ऑपरेशन के बीच चयन कर सकता है। मर्ज विकल्प, जबकि तकनीकी रूप से अधिक आकर्षक, अतिरिक्त विलय प्रतिबद्ध बनाता है। एक छोटी सी के लिए प्रतिबद्ध के लिए, परिवर्तन प्रति दो प्रतिबद्ध की उपस्थिति वास्तव में इतिहास कम पठनीय बनाता है क्योंकि मर्ज आपरेशन के लिए प्रतिबद्ध के संदेश से ध्यान हट जाए।

एक विशिष्ट साझा विकास वृक्ष में, प्रत्येक डेवलपर git pull; <resolve conflicts>; git push की कुछ भिन्नता करके एक साझा शाखा में धक्का दे रहा है। वे --rebase बिना git pull का उपयोग कर रहे हैं, तो क्या होता है लगभग हर प्रतिबद्ध है कि समाप्त होता है किसी मर्ज के साथ किया जा रहा करने, भले ही कोई समानांतर विकास वास्तव में चल रहा था है। यह वास्तविकता में वास्तविकता के एक रैखिक अनुक्रम से एक अंतःस्थापित इतिहास बनाता है। इस कारण से, git pull --rebase छोटे विकास के परिणामस्वरूप छोटे बदलावों के लिए एक बेहतर विकल्प है, जबकि एक विलय लंबी अवधि की फीचर शाखाओं के एकीकरण के लिए आरक्षित है। यह सब

स्थानीय करता रिबेसिंग, या एक अल्पकालिक सुविधा शाखा बारीकी से जुड़े सहकर्मियों (एक ही कमरे में बैठे) द्वारा साझा रिबेसिंग पर लागू होता है। एक बार प्रतिबद्धता को शाखा में नियमित रूप से दूसरों द्वारा पीछा किया जाता है, तो इसे कभी को पुन: विश्राम नहीं किया जाना चाहिए।

+1

पूर्ण सहमत हैं; _my_ दिमाग में रीबेस का एकमात्र उपयोग बिल्कुल वही है। मुझे नहीं पता कि क्यों कुछ परियोजनाएं पूरी तरह से अपने इतिहास में विलय को अस्वीकार करती हैं। –

+2

विलय को अस्वीकार करना जवाब में वर्णित नकली विलय की भीड़ के लिए घुटने-झटके की प्रतिक्रिया की तरह लगता है। यह गलत प्रतिक्रिया है, लेकिन कुछ साल पहले गिट का उपयोग शुरू करने के तुरंत बाद मेरे सहकर्मियों (स्वयं शामिल) के निर्माण के ग्राफ को देखने के बाद मुझे यह समझ में आया - यह एक प्रिंटेड सर्किट बोर्ड की तरह काम करता है जैसे कि इतिहास के इतिहास की तरह। – user4815162342

+0

जो कोई प्रतिबंध लगा दिया है विलीन हो जाती है शायद 'के बारे में सीखा नहीं किया है Git लॉग --no-merges' – jbowes

3

एक रिबेस प्रदर्शन आम तौर पर एक मर्ज से अधिक नहीं संघर्ष समाधान शामिल है, इसलिए खर्च की तुलना में कम है (बस समय यह आपके प्रतिबद्ध पुनः चलाने के लिए ले जाता है, वास्तव में)।

Git से संबंधित सबसे चीजों के साथ के रूप में, आप केवल यदि आप जानते हैं क्या आप कर रहे हैं, और क्यों आप इसे कर रहे हैं rebase चाहिए। यहां रिबेसिंग के कुछ कारण यहां दिए गए हैं:

  • मैंने पैच श्रृंखला पर काम किया है जिसने इस दौरान अपस्ट्रीम को बदलने वाले किसी भी घटक को छुआ नहीं है। एक विलय प्रतिबद्धता में इस मामले में कोई उपयोगी जानकारी नहीं होगी।
  • मैं के बारे में GitHub पर एक पुल का अनुरोध सबमिट करना चाहता हूँ, और मर्ज बहुत काम किया जाएगा आवश्यक कर।पहले रिबेस करके, मैं अपस्ट्रीम मालिक को संभालने के लिए पुल अनुरोध को आसान बनाता हूं। निश्चित रूप से मैं इसके बजाय विलय कर सकता हूं, लेकिन जैसा कि उन्होंने पहले कभी अपना कोड नहीं देखा है, जो पैच श्रृंखला को पढ़ने के लिए कठिन बना देगा।
  • मैं अपस्ट्रीम से परिवर्तन विलय कर रहा हूं, और बड़ी संख्या में संघर्ष हैं। git rebase मुझे इन संघर्षों को एक समय में प्रतिबद्ध करने की अनुमति देता है, जिससे इसे समझना आसान हो जाता है, और जैसे ही मैं जाता हूं परीक्षण करता हूं। यदि मैं विलय प्रतिबद्धता को बनाए रखने की परवाह करता हूं, तो मैं बाद में शाखा के एक गैर-पुनर्वित्तित संस्करण पर वापस जा सकता हूं, इसे अपस्ट्रीम के साथ विलय कर सकता हूं, फिर विद्रोही संस्करण के विरूद्ध विवाद का उपयोग विवाद के रूप में विवाद के रूप में कर सकता हूं।
संबंधित मुद्दे