गिटहब में फोर्किंग बनाम ब्रांचिंग


278

मैं एक github परियोजना को बनाने के फायदे और नुकसान के बारे में अधिक जानना चाहता हूं। एक github परियोजना की एक शाखा का निर्माण करना।

Forking परियोजना के मेरे संस्करण को मूल से अलग कर देता है क्योंकि मुझे मूल परियोजना के सहयोगी सूची में नहीं होना चाहिए। चूंकि हम घर में एक परियोजना विकसित कर रहे हैं, इसलिए लोगों को सहयोगी के रूप में जोड़ने में कोई समस्या नहीं है। लेकिन, हम यह समझना चाहते हैं कि क्या एक परियोजना को कांटेक्ट करने से मुख्य परियोजना में विलय के बदलाव वापस हो जाएंगे। यही है, मुझे आश्चर्य है कि अगर ब्रांचिंग दो परियोजनाओं को सिंक में रखना आसान बनाती है। दूसरे शब्दों में, क्या मैं अपने मुख्य प्रोजेक्ट और मुख्य परियोजना के संस्करण के बीच परिवर्तनों को मर्ज और पुश करना आसान है जब मैं शाखा?

जवाबों:


279

आप हमेशा एक शाखा नहीं बना सकते हैं या किसी मौजूदा शाखा को नहीं खींच सकते हैं और उसे वापस धक्का दे सकते हैं, क्योंकि आप उस विशिष्ट परियोजना के लिए सहयोगी के रूप में पंजीकृत नहीं हैं।

Forit GitHub सर्वर साइड पर एक क्लोन से ज्यादा कुछ नहीं है :

  • सीधे वापस धक्का देने की संभावना के बिना
  • साथ कांटा कतार सुविधा मर्ज अनुरोध का प्रबंधन करने के लिए जोड़ा

आप मूल परियोजना के साथ सिंक में कांटा रखते हैं:

  • रिमोट के रूप में मूल परियोजना को जोड़ना
  • उस मूल परियोजना से नियमित रूप से प्राप्त करना
  • उस भ्रूण से आपके द्वारा प्राप्त ब्याज की शाखा के शीर्ष पर अपने वर्तमान विकास को पुनः आरंभ करें।

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

लक्ष्य वास्तव में सहयोग की अनुमति देना है, भले ही प्रत्यक्ष भागीदारी हमेशा संभव न हो।


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

गिटहब पर कांटा

मर्ज का अनुभव उसी के बारे में होगा, लेकिन अप्रत्यक्ष स्तर के एक अतिरिक्त स्तर के साथ (पहले कांटे पर धक्का दें, फिर एक पुल के लिए पूछें, मूल रेपो पर evolutions के जोखिम के साथ आपके फास्ट-फ़ॉर-मर्ज को तेज़ी से आगे नहीं बढ़ाते हुए) ।
इसका मतलब है कि सही वर्कफ़्लो है git pull --rebase upstream(अपस्ट्रीम से नए कमिट्स के शीर्ष पर अपने काम को रिबेट करें), और फिर git push --force origin, इस तरह से इतिहास को फिर से लिखने के लिए, अपने स्वयं के कमिट हमेशा मूल (अपस्ट्रीम) रेपो से कमिट्स के शीर्ष पर होते हैं ।

यह सभी देखें:


3
हम घर में एक परियोजना विकसित कर रहे हैं और लोगों को सहयोगी के रूप में जोड़ने में कोई समस्या नहीं है। लेकिन, हम यह समझना चाहते हैं कि क्या एक परियोजना को कांटेक्ट करने से मुख्य परियोजना में विलय के बदलाव वापस हो जाएंगे।
reprogrammer

7
@reprogrammer: यदि आप सहयोगी जोड़ सकते हैं, तो फोर्किंग की आवश्यकता नहीं है। वे स्थानीय रूप से फिर से लक्ष्य शाखा में विलय कर सकते हैं, और फिर दो केंद्रीय रेपो (मूल एक और कांटा) का प्रबंधन करने के बजाय सीधे एक केंद्रीय रेपो में धकेल सकते हैं । रिबास उसी के बारे में होगा, लेकिन जब एक कांटा शामिल होता है तो एक अतिरिक्त अप्रत्यक्षता के साथ। फिर से: यहाँ की जरूरत नहीं है। मैंने अपना उत्तर अपडेट कर दिया है।
VonC

14
ईमानदारी से, भले ही आपके पास न हो, यह हमेशा एक अच्छा विचार है कि एक पवित्र रेपो है जो केवल वरिष्ठ डेवलपर्स के लिए उपयुक्त है, टीम लीड या अन्य "विश्वसनीय" लोग हैं । अन्य सभी टीम के सदस्यों को अपने कांटे (~ सैंडबॉक्स) में काम करना चाहिए और पुल अनुरोध के रूप में अपने परिवर्तनों में योगदान करना चाहिए। चूंकि DVCS इसे संभव बनाता है, इसलिए हमने इसे "सर्वश्रेष्ठ अभ्यास" के रूप में अनुकूलित किया और छोटी परियोजनाओं में भी इसका सफलतापूर्वक उपयोग किया ...
intland

1
@intland इसलिए आप एक "एकीकरण-प्रबंधक वर्कफ़्लो" के पक्ष में हैं जैसा कि stackoverflow.com/users/6309/vonc?tab=responses में वर्णित है ? Git को एक बड़ी कॉर्प में पेश करने के लिए, मैं एक "एकीकरण-प्रबंधक" को शिफ्ट करने से पहले पहले एक केंद्रीकृत वर्कफ़्लो (हर किसी के लिए अधिक परिचित) को अपनाने की प्रवृत्ति रखता हूं।
VonC

15
हमें कांटे को "टहनियाँ" कहना चाहिए क्योंकि वे एक शाखा से टूट गए हैं और एक नया पेड़ शुरू करने के लिए उपयोग किया जाता है। बस मेरे दो सेंट - मुझे आर्बरियल मुहावरा पसंद है।
एरिक

66

यहाँ उच्च-स्तरीय अंतर हैं:

forking

पेशेवरों

  • उपयोगकर्ता द्वारा शाखाओं को अलग रखता है
  • प्राथमिक भंडार में अव्यवस्था को कम करता है
  • आपकी टीम प्रक्रिया बाहरी योगदानकर्ता प्रक्रिया को दर्शाती है

विपक्ष

  • उन सभी शाखाओं को देखना अधिक कठिन बनाता है जो सक्रिय हैं (या उस मामले के लिए निष्क्रिय)
  • एक शाखा पर सहयोग करना मुश्किल है (कांटा मालिक को एक सहयोगी के रूप में व्यक्ति को जोड़ने की जरूरत है)
  • आपको Git में कई रीमेक की अवधारणा को समझने की आवश्यकता है
    • अतिरिक्त मानसिक बहीखाता की आवश्यकता है
    • यह उन लोगों के लिए वर्कफ़्लो को अधिक कठिन बना देगा जो Git के साथ सुपर आरामदायक नहीं हैं

शाखाओं में

पेशेवरों

  • एक परियोजना के चारों ओर किए जा रहे सभी कार्यों को एक स्थान पर रखता है
  • सभी सहयोगी उस पर सहयोग करने के लिए एक ही शाखा को धक्का दे सकते हैं
  • इससे निपटने के लिए केवल एक Git रिमोट है

विपक्ष

  • जिन शाखाओं को छोड़ दिया जाता है वे अधिक आसानी से ढेर कर सकते हैं
  • आपकी टीम योगदान प्रक्रिया बाहरी योगदानकर्ता प्रक्रिया से मेल नहीं खाती है
  • शाखा में शामिल होने से पहले आपको टीम के सदस्यों को योगदानकर्ताओं के रूप में जोड़ना होगा

"बाहरी योगदानकर्ता प्रक्रिया" से क्या अभिप्राय है?
कार्स बारेंड्रेच

1
@KarsBarendrecht "बाहरी योगदानकर्ता" शब्द का उपयोग करने के लिए अपडेट किया गया। कोई जिनके पास writeरिपॉजिटरी की अनुमति नहीं है ।
एड्डन फेल्डमैन

45

यह Git के सामान्य वर्कफ़्लो के साथ करना है। आप मुख्य परियोजना के भंडार में सीधे धक्का देने में सक्षम होने की संभावना नहीं है। मुझे यकीन नहीं है कि अगर GitHub प्रोजेक्ट का रिपॉजिटरी सपोर्ट ब्रांच-आधारित एक्सेस कंट्रोल है, तो आप उदाहरण के लिए किसी को भी मास्टर ब्रांच में जाने की अनुमति नहीं देना चाहेंगे।

सामान्य पैटर्न निम्नानुसार है:

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

इसके बिना, सार्वजनिक परियोजनाओं के लिए यह बहुत ही असामान्य है कि किसी को भी अपने स्वयं के कमिट को सीधे धक्का दें।


@RecoJohnson, ठीक है ... मैंने अपने उत्तर में "पुल" शब्द का इस्तेमाल नहीं किया है (लेकिन "पुल" प्रभावी रूप से "लिट" + "मर्ज" के रूप में है)। आपको लगता है कि "धक्का" का कौन सा उपयोग गलत है?
ब्रूनो

2
@RecoJohnson आप एक योगदानकर्ता के रूप में अपने GitHub कांटा के लिए धक्का; परियोजना के रखवाले आपके कांटे से आपके योगदान को खींचते हैं।
mljrg

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

8

फोर्किंग मौजूदा रिपॉजिटरी से पूरी तरह से नया रिपॉजिटरी बनाता है (बस गिटहब / बिटबकेट पर गिट क्लोन काम करता है)

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

शाखा रणनीति मौजूदा / काम करने वाले भंडार पर एक नई शाखा बनाती है

शाखाओं का सबसे अच्छा उपयोग किया जाता है: जब उन्हें एक विशेषता के माध्यम से काम करने के लिए अस्थायी स्थानों के रूप में बनाया जाता है, तो मूल के साथ शाखा को मर्ज करने के इरादे से।

अधिक विशिष्ट: - ओपन सोर्स प्रोजेक्ट्स में यह रिपॉजिटरी का मालिक होता है जो यह तय करता है कि रिपॉजिटरी को कौन धक्का दे सकता है। हालांकि, ओपन सोर्स का विचार यह है कि हर कोई परियोजना में योगदान दे सकता है।

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

इसके मूल में फोर्किंग फीचर ब्रांचिंग के समान है, लेकिन शाखाओं को बनाने के बजाय रिपॉजिटरी का कांटा बनाया जाता है, और मर्ज अनुरोध करने के बजाय आप एक पुल अनुरोध बनाते हैं।

नीचे दिए गए लिंक एक सुविचारित तरीके से अंतर प्रदान करते हैं:

https://blog.gitprime.com/the-definitive-guide-to-forks-and-branches-in-git/

https://buddy.works/blog/5-types-of-git-workflows

http://www.continuousagile.com/unblock/branching.html


इस उत्तर में "सबसे अच्छा उपयोग किया गया" कथन कई मुद्दों की अनदेखी करता है जो कि ओपन-सोर्स प्रोजेक्ट्स जैसी चीजों के लिए काम करने से रोकता है, साथ ही वास्तविक दुनिया में कांटे का उपयोग कैसे किया जाता है, इस बात की वास्तविकता है। लोगों द्वारा किसी प्रोजेक्ट पर सहयोग करने की अनुमति देने के लिए पुल अनुरोधों के साथ संयोजन में उपयोग किए जाने वाले कांटे देखना बेहद आम है, जो सभी को सीधे दिए गए भंडार को संशोधित करने की अनुमति नहीं है।
स्ट्रिपलिंगवर्यर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.