तेजी से आगे बढ़ना वी.एस. कोई तेजी से आगे विलय नहीं


247

Git मर्ज हमें तेज़ी से प्रदर्शन करने की अनुमति देता है और कोई तेज़ तेज़ फ़ॉरवर्ड ब्रांच विलय नहीं करता है। किसी भी विचार जब तेजी से आगे मर्ज का उपयोग करें और कब तेजी से आगे मर्ज का उपयोग करने के लिए?


12
क्या stackoverflow.com/questions/2850369/… मदद करेगा?
VonC

2
मुझे लगता है कि एक और वास्तव में अच्छा परिप्रेक्ष्य यहां पाया जा सकता है endoflineblog.com/gitflow-considered-harmful
दिमित्री मिनकोवस्की

वही प्रश्न? stackoverflow.com/questions/9069061
Yousha Aleayoub

जवाबों:


290

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

यदि आप ऐसी किसी चीज की परवाह नहीं करते हैं - तो आप जब भी संभव हो, एफएफ के साथ भाग सकते हैं। इस प्रकार आपके पास वर्कफ़्लो की तरह अधिक svn जैसी भावना होगी।

उदाहरण के लिए, इस लेख के लेखक का मानना ​​है कि --no-ffविकल्प डिफ़ॉल्ट होना चाहिए और उसका तर्क इस बात के करीब है कि मैंने ऊपर उल्लिखित किया है:

उस स्थिति पर विचार करें जहां "फ़ीचर" शाखा पर छोटी सी एक श्रृंखला सामूहिक रूप से एक नई सुविधा बनाती है: यदि आप बिना "git मर्ज feature_branch" करते हैं --no-ff, तो "Git इतिहास से यह देखना असंभव है कि कौन से कमिटमेंट एक साथ हैं एक सुविधा लागू की - आपको मैन्युअल रूप से सभी लॉग संदेशों को पढ़ना होगा। एक पूरी सुविधा (यानी एक कमिट्स का समूह) को बदलना, एक सच्चा सिरदर्द है [अगर --no-ffइसका उपयोग नहीं किया गया है], जबकि यह आसानी से किया जाता है अगर --no-ffझंडा का उपयोग किया गया था [क्योंकि यह सिर्फ एक प्रतिबद्धता है] "।

ग्राफिक दिखा रहा है कि कैसे - ff समूहों को एक साथ सभी शाखा शाखा से मास्टर शाखा में प्रतिबद्ध किया गया है


3
और जब आप निकट-संबंधित शाखाओं का संग्रह प्राप्त कर चुके होते हैं, तो इसके लिए बहुत तेजी से आगे बढ़ते हैं और तब आप बस एक साथ चलना चाहते हैं। सभी मर्ज वास्तविक इतिहास की घटनाएँ नहीं हैं।
कैस्केबेल

3
फिर कई शाखाओं को बनाए रखना क्यों? यदि वे निकट-संबंधी हैं - तो एकल शाखा पर सब कुछ करने के लिए क्यों नहीं?
इवान डेनिलोव

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

2
पहले उत्तर के रूप में, मेरी समझ यह है कि ओपी सर्वोत्तम प्रथाओं को जानना चाहता है। चीजें होती हैं और सब कुछ आदर्श नहीं होता है लेकिन ऐसा लगता है कि कुछ मजबूर समझौता है।
इवान डेनिलोव

1
यह ध्यान देने योग्य है कि --no-ffबुनियादी उपकरणों का उपयोग करते समय आपके प्रतिबद्ध इतिहास के लाभों को तुरंत स्पष्ट नहीं किया जा सकता है git log, जो कि उन सभी शाखाओं से सभी हिट दिखाना जारी रखेगा जिन्हें आपकी वर्तमान शाखा में विलय कर दिया गया है। कहा कि, जैसे git log --first-parentएकीकरण शाखा पर developया जैसे का उपयोग करते समय लाभ स्पष्ट हो जाते हैं master। यदि आप धार्मिक रूप से उपयोग करते हैं --no-ffतो वह विशेष रूप से मर्ज अनुरोध प्रदर्शित git logकरेगा , जबकि अभी भी एक (अधिक) व्यापक इतिहास प्रदान करेगा। यही कारण है कि विंसेंट ने GitFlow के साथ उपयोग के लिए इसकी सिफारिश की है ।
जेरेमी कैन

12

मैं आमतौर पर परियोजना में देखा गया एक उदाहरण दे सकता हूं।

यहां, विकल्प --no-ff(यानी सही मर्ज ) कई माता-पिता के साथ एक नई प्रतिबद्धता बनाता है, और एक बेहतर इतिहास ट्रैकिंग प्रदान करता है। अन्यथा, --ff(यानी फास्ट-फॉरवर्ड मर्ज ) डिफ़ॉल्ट रूप से है।

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*) ध्यान दें कि यदि newFeatureनई शाखा बनाने के बजाय, शाखा का फिर से उपयोग किया जाता है, तो गिट को --no-ffवैसे भी मर्ज करना होगा । इसका मतलब है कि फास्ट फॉरवर्ड मर्ज हमेशा योग्य नहीं है।


6

जब हम विकास के वातावरण पर काम करते हैं और हमारे कोड को मचान / उत्पादन शाखा में विलय करते हैं तो आगे कोई तेजी से नहीं निकलना बेहतर विकल्प हो सकता है। आमतौर पर जब हम एक ही सुविधा के लिए विकास शाखा में काम करते हैं तो हम कई तरह के कमिट करते हैं। कई कमिट के साथ ट्रैकिंग परिवर्तन बाद में असुविधाजनक हो सकते हैं। अगर हम Git का उपयोग करते हुए स्टेजिंग / प्रोडक्शन ब्रांच के साथ विलय नहीं करते हैं तो यह केवल 1 कमिट होगा। अब कभी भी हम फीचर को वापस करना चाहते हैं, बस उस कमिट को वापस कर दें। जीवन आसान है।


0

यह भी संभव है कि कोई व्यक्ति वैयक्तिकृत सुविधा शाखाएँ रखना चाहे जहाँ कोड को दिन के अंत में रखा गया हो। यह बारीक विस्तार से विकास को ट्रैक करने की अनुमति देता है।

मैं गैर-कामकाजी कोड के साथ मास्टर विकास को प्रदूषित नहीं करना चाहूंगा, इस तरह से - कोई भी ऐसा नहीं हो सकता है।

एक साइड नोट के रूप में, व्यक्तिगत शाखा पर काम करने वाले कोड को करने के लिए आवश्यक नहीं हो सकता है, क्योंकि इतिहास को फिर से लिखा जा सकता है git rebase -iऔर सर्वर पर तब तक मजबूर किया जा सकता है जब तक कि कोई और उसी शाखा पर काम नहीं कर रहा हो।

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