2013-07-09 8 views
11

से अस्थायी रूप से सुविधा हटाएं हम अपने ऐप के कोड भंडार को प्रबंधित करने के लिए गिट का उपयोग करते हैं, और ऐसी स्थिति है जिसे मैंने अभी तक सामना नहीं किया है, लेकिन मुझे कल्पना है कि यह बहुत आम है।एक गिट शाखा

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

क्या कोई मुझे इस स्थिति को संभालने के मामले में सही दिशा में इंगित कर सकता है?

+0

की [मैं गुरु से एक अलग शाखा के लिए प्रतिबद्ध का एक सेट ले जा सकते हैं कैसे?] संभव डुप्लिकेट (http://stackoverflow.com/questions/1178553/how-can-i-move-a-set-of-commits-from-master-to-a-separate-branch) – RyPeck

+0

कोई उत्तर नहीं, लेकिन ... मैं काम कर रहा हूं दो साल के लिए गिट के साथ और ऐसी स्थिति नहीं देखी। फ़ीचर शाखाओं को केवल 100% तैयार होने पर 'विकासशील'/'मास्टर '/ जो भी अन्य' मुख्य 'शाखा में विलय किया जाना चाहिए। मास्टर में आपका फीचर कोड होने पर कोई मामला नहीं होना चाहिए, लेकिन यह तैयार नहीं है या परीक्षण नहीं किया गया है। – madhead

+0

आप कोड हटाने को ट्रैक कर सकते हैं। आपका काम कितना दानेदार है? क्या आप लोगों को भरोसा है कि आप सुविधा के माध्यम से सुविधा को हटा सकते हैं? रणनीति पर निर्णय लेने के लिए यह महत्वपूर्ण है। – usumoio

उत्तर

8

एक तरीका है कि आप अपनी सुविधा को अस्थायी रूप से हटा सकते हैं जो आपके गिट रेपो इतिहास को पूर्ववत करता है वह सुविधा को हटा देता है जो सुविधा को हटा देता है। फिर जब आप सुविधा को वापस जोड़ना चाहते हैं, तो बस revert the commit जो इसे बाहर ले गया। यह एक रिवर्स पैच करना होगा, जिसका अर्थ यह रिवर्स में परिवर्तन, जो प्रभावी रूप से सुविधा पुनः नहीं जोड़ेगा लागू होंगे:

git revert <sha of commit that removed the feature> 

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

तो मूल रूप से, आप (यह ज्यादा बात आप एक GitHub Flow या एक Git Flow का उपयोग नहीं होगा, तो कर रहे हैं रणनीति शाखाओं में इस तरह कुछ करने के लिए चाहते हो जाएगा, दोनों सुविधा शाखाओं की अवधारणा है कि अंततः एक main- में विलय हो का उपयोग । मान लिया जाये कि आप बार-बार master (या develop के साथ सिंक में saved-feature रखा है,)

# On master branch 
git commit -m "Remove feature X" # Creates commit 1234567... 

# Now make feature branch 
git checkout -b saved-feature 

# Immediately put the feature back in the feature branch 
git revert 1234567 

# When you want to sync branch with master, just use rebase. 
# Rebase allows you to sync frequently, since it doesn't 
# leave behind a bunch of merge commits. 
# 
# From the feature branch: 
git rebase master # Resolve any conflicts as needed. 

# N commits later, you decide it's time to merge the feature 
# back in. You can use fast-forward or non-fast-forward merge, 
# it's up to you. 
# 
# Using fast-forward merge with master checked out (assuming 
# feature branch was just rebased onto master): 
git merge saved-feature 

# Or forcing a merge commit, if that's what you want: 
git merge --no-ff saved-feature 

हैं कि आप क्या उपयोग है, के रूप में संघर्ष को हल करने: विकास की लाइन सादगी के लिए, मैं GitHub प्रवाह इस उदाहरण में इस्तेमाल करेंगे) आप जाते हैं, आपको फीचर को वापस विलय करने में कोई समस्या नहीं होनी चाहिए।

संदर्भ के लिए

प्रलेखन:

2

यह एक रणनीति है जो काम करना चाहिए। ऐसा लगता है जैसे आपका काम आपकी परियोजना में बहुत बेक्ड है, इसलिए मैं यही करूँगा। सबसे पहले अपने शुरुआती बिंदु का चयन करें, मेरे लिए आमतौर पर dev शाखा (माना जाता है कि master branch भी है)। नई शाखा कि सुविधा अपनी परियोजना

git checkout -b dev_feature_removed 
एक शाखा है कि उस सुविधा परियोजना में बनाए रखा होगा की एक ही समय स्पिन पर

इसके अलावा से निकाल दिया जाएगा बंद स्पिन।

git checkout -b dev_feature_sustained 

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

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

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

0

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

एक विन्यास फाइल में कुछ के रूप में सरल रूप में:

<?php 
$features = array(
    'news' => true, 
    'events' => true, 
    'shop' => false 
); 

और फिर अपने इसी नियंत्रक में:

<?php 
class ShopController extends AbstractController { 

    public function __construct() { 
     // $features array would be passed in somehow; 
     // maybe via a dependency injection container 
     if (!$features['shop']) { 
      // feature is disabled, so just send 404 page for now 
      throw new ResourceNotFoundException(); 
     } 
    } 
} 

नोट: ऊपर अर्द्ध छद्म कोड है।

+0

मुझे इस विचार को पसंद है, बस सुविधा के लिए स्विच करें। ऐसा लगता है कि कुछ मामलों में यह कम प्रयास हो सकता है। –

+0

यह निश्चित रूप से है, जैसा कि मैंने कहा है, सुविधा के लिए ज़िम्मेदार वास्तविक कोड को हटाकर बाद में इसे फिर से जोड़ना है। –

2

यहाँ John Galt's answer में एक ठोस रणनीति दिखा उदाहरण है:

$ git log --graph --decorate --oneline 
* d1d201b (HEAD, restore-b) Merge branch 'prod' into restore-b 
|\ 
| * 18d759f (prod) add feature e in prod 
* | 191037e Merge branch 'prod' into restore-b 
|\ \ 
| |/ 
| * e0de1be add feature d in production 
* | a122936 Revert "remove feature b in production" 
|/ 
* d3e2c42 remove feature b in production 
* 5369ecf existing three features 

असल में, restore-b हमेशा prod में सब कुछ के साथ साथ सुविधा की बहाली (प्रतिबद्ध a122936) शामिल हैं।जैसे ही आप prod पर नए काम करते हैं, उन्हें restore-b में विलय कर दिया जाता है, ताकि जब भी आप सुविधा को पुनर्स्थापित करने के लिए तैयार हों, तो यह एक आसान फास्ट-फॉरवर्ड विलय है।

a112936 प्रतिबद्धता और restore-b शाखा बनाने से बचने के लिए एक आसान तरीका होगा जब आप सुविधा को पुनर्जीवित करने के लिए तैयार हों। restore-b शाखा को बनाने और बनाए रखने का लाभ यह है कि अन्य परिवर्तनों के साथ किसी भी विवाद को समय-समय पर हल किया जाता है (उम्मीद है कि जिस देव ने इसे लिखने के तुरंत बाद विवादित कोड लिखा था)। यह फीचर "ताजा" और "ऑन-डेक" रखता है, जो बिना किसी अतिरिक्त विकास कार्य के उत्पादन उत्पादन में शामिल होने के लिए तैयार है।

संबंधित मुद्दे