कमिट लॉग में एक्स्ट्रसस "मर्ज ब्रांच" संदेशों में परिणाम खींचें


110

मैं एक प्रोजेक्ट पर दूसरे डेवलपर के साथ काम कर रहा हूं, और हम Github को हमारे रिमोट रेपो के रूप में उपयोग कर रहे हैं। मैं एक पर हूँ git 1.7.7.3 का उपयोग कर, वह Windows पर git 1.7.6 का उपयोग कर रहा है।

यह क्या हो रहा है

  1. हम में से एक (चलो उसे डेवलपर ए कहते हैं, लेकिन इससे कोई फर्क नहीं पड़ता कि कौन सा) गिटहब के लिए आवागमन का एक सेट धक्का देता है।
  2. अन्य (डेवलपर बी) कुछ स्थानीय कमिट करता है।
  3. बी ए करता है git pull
  4. बी ए करता है git push
  5. प्रतिबद्ध इतिहास लॉग को देखते हुए, मुझे github.com:foo/bar की मर्ज शाखा 'मास्टर' दिखाई देती है

प्रतिबद्ध लॉग समय के साथ "मर्ज शाखा" संदेशों से अटे पड़े हो जाते हैं, और डेवलपर बी को उस बदलाव के रूप में भी दिखाता है जो डेवलपर ए ने बनाया था। इस मुद्दे को रोकने के लिए हमने एकमात्र तरीका git pull --rebaseचरण 3 पर किया है, लेकिन मुझे नहीं पता कि रिबासिंग क्या दुष्प्रभाव पेश करेगा। यह मेरी पहली बार एक मल्टी-डेवलपर गिट रेपो पर काम कर रहा है, तो क्या यह सिर्फ सामान्य व्यवहार है? इस मुद्दे को हल करने के बारे में कोई विचार?


2
आप लॉग को बिना विलय के देख सकते हैंgit log --no-merges
wjandrea 20

जवाबों:


88

आप जो कमिटमेंट देख रहे हैं वह पूरी तरह से ठीक है। एक pullप्रभावी रूप से चलता है git fetchऔर फिर git mergeएक मर्ज आमतौर पर तब होता है जब आप दौड़ते हैं git pull

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

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

तो, लंबी कहानी छोटी है: हाँ, मर्ज होने के कारण पूरी तरह से ठीक है और आपको उनके बारे में चिंता नहीं करनी चाहिए।


2
बहुत अच्छा जवाब। मैंने स्वयं रिबास शैली की कोशिश की क्योंकि यह कुछ खुले स्रोत परियोजनाओं के योगदान दिशानिर्देशों में अनुशंसित था, और इससे मुझे परेशानी हुई। टीम में एक नए सदस्य का भी यही हाल था। मुझे लगता है कि रिबास विकल्प पूरे दिन एक साथ काम करने वाली टीमों के लिए नहीं है, लेकिन उन परियोजनाओं के लिए सही है जिनमें मुख्य योगदानकर्ता और अन्य योगदानकर्ता हैं जो सिर्फ पैच जमा करते हैं। उन लोगों को मुख्य रेपो लाने के लिए तैयार होना चाहिए और अपने अनुरोध को खींचने के अनुरोध से ठीक पहले अपने परिवर्तनों को पुन: पेश करना चाहिए।
मेलिगी

2
@sTodorov यदि कोई नया बदलाव नहीं हुआ है, तो पुल का लाने वाला हिस्सा कुछ नहीं करेगा, लेकिन मर्ज को अभी भी निष्पादित किया जा रहा है। इसलिए यदि आपकी वर्तमान स्थानीय शाखा अद्यतित नहीं है, तो यह आपकी शाखा में नए परिवर्तनों का विलय कर देगी। और अगर यह एक फास्ट-फॉरवर्ड मर्ज नहीं कर सकता (यदि आपके पास कमिटिंग कम है), तो यह मर्ज कमिट बनाएगा।
पोक

28
यह उत्तर यह बताता है कि यह रिबेस का उपयोग कर रहा है जैसा कि ओपी ने बताया है कि यह खतरनाक है, लेकिन ऐसा नहीं है। चरण 3 पर रिबासिंग पूरे इतिहास को फिर से नहीं लिखती है। केवल जिन स्थानीय कमिटों को धक्का नहीं दिया गया है, उन्हें नए HEAD के शीर्ष पर फिर से लागू किया जा रहा है (उस शाखा को धक्का दिया गया नवीनतम कमिट)। यह बाहर निकलने वाले मर्ज को रोकता है और इसका कोई अन्य दुष्प्रभाव नहीं है।
बॉब एस्पोनाजा

1
@bobesponja सभी संचार जो खींची गई दूरस्थ शाखा पर नहीं हैं, उन्हें फिर से लिखा जाता है। इसमें अन्य शाखाओं से प्रकाशित कमिट शामिल हो सकते हैं, जैसे कि सुविधा शाखाएं, जिन्हें अन्य पहले ही एक्सेस कर सकते हैं। जैसे, हां, आप जो रिबास करते हैं, उसके बारे में बिना सोचे-समझे पुनरावृत्ति करना कुछ खतरनाक है।
प्रहार

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

48

इस उत्तर को संशोधित किया गया है, क्योंकि मेरी समझ, आरेख और निष्कर्ष गलत थे।


git pullमर्ज का कारण बनता है क्योंकि गिट विलय है। मर्ज के बजाय रिबास का उपयोग करने के लिए अपनी शाखाओं को सेट करके इसे बदला जा सकता है। एक पुल पर मर्ज के बजाय रिबास का उपयोग साझा भंडार को अधिक रैखिक इतिहास प्रदान करता है। दूसरी ओर, मर्ज कमिट शाखा पर समानांतर विकास के प्रयासों को दर्शाता है।

उदाहरण के लिए, दो लोग एक ही शाखा में काम कर रहे हैं। शाखा के रूप में शुरू होता है:

...->C1

पहला व्यक्ति अपना काम पूरा करता है और शाखा को धक्का देता है:

...->C1->C2

दूसरा व्यक्ति अपना काम खत्म करता है और धक्का देना चाहता है, लेकिन इसलिए नहीं कर सकता क्योंकि उन्हें अपडेट करने की जरूरत है। दूसरे व्यक्ति के लिए स्थानीय भंडार ऐसा दिखता है:

...->C1->C3

यदि पुल को विलय करने के लिए सेट किया गया है, तो दूसरा व्यक्ति रिपॉजिटरी दिखेगा।

...->C1->C3->M1
      \      /
       ->C2->

जहां M1 एक मर्ज कमेटी है। यह नया शाखा इतिहास रेपो को धकेल दिया जाएगा। यदि इसके बजाय, स्थानीय रेपो को पुन: प्रदर्शित करने के लिए पुल सेट किया जाता है:

...->C1->C2->C3

कोई मर्ज कमिट नहीं है। इतिहास को और अधिक रैखिक बना दिया गया है।

दोनों विकल्प शाखा के इतिहास को दर्शाते हैं। git आपको यह चुनने की अनुमति देता है कि आप कौन सा इतिहास पसंद करते हैं।

वास्तव में ऐसे स्थान हैं जहां रिबास दूरस्थ शाखाओं के साथ समस्या पैदा कर सकता है। यह उन मामलों में से एक नहीं है। हम रिबेस का उपयोग करना पसंद करते हैं क्योंकि यह पहले से ही जटिल शाखा इतिहास को सरल बनाता है और साथ ही साझा रिपॉजिटरी के सापेक्ष इतिहास का एक संस्करण दिखाता है।

आप ब्रांच सेट कर सकते हैं ।autosetuprebase = हमेशा अपने आप को मास्टर के बजाय रिबेट के रूप में अपनी दूरस्थ शाखाओं को स्थापित करने के लिए।

git config --global branch.autosetuprebase always

यह सेटिंग प्रत्येक दूरस्थ शाखा के लिए स्वचालित रूप से कॉन्फ़िगरेशन सेटिंग बनाने का कारण बनता है:

branch.<branchname>.rebase=true

आप इसे अपनी दूरस्थ शाखाओं के लिए स्वयं सेट कर सकते हैं जो पहले से सेटअप हैं।

git config branch.<branchname>.rebase true

मैं अपने पिछले बयानों पर सवाल उठाने और उनका पीछा करने के लिए @LaurensHolst को धन्यवाद देना चाहूंगा। मैंने निश्चित रूप से इस बारे में अधिक जानकारी प्राप्त की है कि कैसे पुल पुल और मर्ज के साथ काम करता है।

मर्ज के बारे में अधिक जानकारी के लिए आप प्रॉजेक्ट-बुक में एक परियोजना में योगदान पढ़ सकते हैं । निजी छोटे टीम अनुभाग शो करता मर्ज करें।


7
“एक पुल पर मर्ज के बजाय रिबेट का उपयोग करना साझा भंडार को सही इतिहास प्रदान करता है। मर्ज का उपयोग करने से एक गलत इतिहास मिलता है। ” - क्या औचित्य है बल्कि इस बोल्ड बयान का समर्थन? मर्ज के साथ एक इतिहास नहीं है 'गलत इतिहास'। यह उस क्रम का सटीक चित्रण है जिसमें चीजें हुईं। आप रिबासिंग करके जो कर रहे हैं , वह वास्तव में इतिहास को बदल रहा है, इसका थोड़ा और रैखिक संस्करण बनाने के लिए। आप सौंदर्यशास्त्र के लिए सटीकता का त्याग करते हैं। हो सकता है कि कुछ आप करना पसंद करते हैं, लेकिन किसी भी तरह से अधिक सच्चा नहीं।
लॉरेन्स होल्स्ट

2
मर्ज के बजाय रिबास का उपयोग सौंदर्यशास्त्र के लिए सटीकता का बलिदान नहीं करता है। हम विलय के लिए -no-ff का उपयोग करते हैं, इसलिए सौंदर्यशास्त्र एक आवश्यकता नहीं है। सटीकता एक इच्छा है। रिबेस उस सटीकता को प्रदान करता है।
बिल डोर

2
विद्रोही इतिहास अधिक सटीक कैसे है? आप इसे स्पष्ट नहीं करते हैं, और मैं नहीं देखता कि यह कैसा होगा।
लॉरेन्स होल्स्ट

1
इतिहास उस समय का प्रतिबिंब है जिस पर साझा रेपो में कमिट होता है । एक दिन, साझा रेपो ने C2 को देखा। दिन 2 पर, साझा रेपो कमिट सी 3 देखता है। यदि C3 C2 से पहले आता है तो समय का प्रतिबिंब सही नहीं होगा। C3 C2 से पहले नहीं आया था। सभी जो रिबास करता है, वह स्थानीय रिपॉजिटरी पर किए गए कमिट को फिर से संगठित करता है ताकि साझा रिपॉजिटरी द्वारा दिखाए गए इतिहास को ठीक से दर्शाया जा सके।
बिल डोर

6
आपके प्रश्नों ने मुझे मर्ज किए जाने की मेरी समझ की समीक्षा करने के लिए प्रेरित किया। मेरा डायग्राम गलत है। मैं चर्चा को संशोधित कर रहा हूं। मेरे निष्कर्ष भी गलत हैं। रिबेस और मर्ज के लिए इतिहास समान रूप से सही हैं। आप अपनी पसंद खुद बना सकते हैं।
बिल डोर

11

तुम कर सकते हो:

git pull --rebase

हालाँकि, यह आपके बदलावों को हमेशा आपके सहयोगियों के ऊपर रखेगा। ' लेकिन आपको कोई प्रदूषित मर्ज संदेश नहीं मिलेगा।


9

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

git stash
git pull
git stash pop

तो आप किसी भी मर्ज संघर्ष को हल कर सकते हैं यदि कोई हो।


ज्यादातर कष्टप्रद और चिंतित करने वाले संघर्ष बिल्कुल विलीन हो जाते हैं। मैं इससे बचता हूं
ग्रीन

1
@Green यदि आप मर्ज संघर्ष के बारे में चिंतित हैं, तो भी पुल अलग नहीं है।
जोसो

उस एक समय को छोड़कर जब आप अपने stashसामने भूल जाते हैं pull। ऊग गिट मुझे हर समय अपने खेल के शीर्ष पर रहने की आवश्यकता है।
linuxNoob

git pull --rebaseस्थानीय लोगों के सामने दूरस्थ परिवर्तनों को एकीकृत करने की आवश्यकता है, भले ही।
वॉनब्रांड

7

गिट पुलिंग करने से "मर्ज शाखा" संदेश सम्मिलित होंगे, बस यही करता है। गिट पुल करके, आपने दूरस्थ शाखा को अपनी स्थानीय शाखा में विलय कर दिया है।

जब आप गिट पुल करते हैं और संघर्ष होते हैं, तो गिट लॉग विवादित फाइलों के अपडेट को उपयोगकर्ता से आने वाले समय के रूप में दिखाएगा जो संघर्षों को हल करता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि संघर्ष को ठीक करने वाला व्यक्ति फ़ाइल को फिर से शुरू करता है।

जहाँ तक मुझे पता है कि यह कैसे काम करता है, और इसके आसपास कोई रास्ता नहीं है।

रीबासिंग, गिट इतिहास को उड़ा देगा, जिससे आप मर्ज होने पर देख नहीं पाएंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.