2012-10-17 15 views
5

कहें कि मेरे पास feature नाम की एक शाखा है जिसे master से ब्रांच किया गया है। दोनों, डेवलपर 1 और डेवलपर 2 चेकआउट feature। डेवलपर 1 feature में बदलाव करता है और इसे धक्का देता है। फिर developer3 master पर कुछ धक्का देता है। इस बिंदु पर master और feature अलग हो जाएं, प्रत्येक में एक अलग प्रतिबद्धता है।साझा फीचर शाखाओं के साथ सही गिट वर्कफ़्लो क्या है?

master से feature में नवीनतम होने के बारे में क्या सही तरीका है, यदि संघर्ष हैं? क्या मुझे master को feature में रीबेज करना चाहिए, या इसे मर्ज करना चाहिए?

संपादित करें:

मैं उल्लेख करना चाहिए कि इस मामले में मैं developer2 पर इतिहास के पुनर्लेखन के लिए नहीं करना चाहते। क्योंकि यह बुरा होगा। सही?

उत्तर

3

को ध्यान में रखते feature शाखा पहले से ही साझा किया जाता है, यह master पर रिबेस नहीं किया जाना चाहिए (- साझा - इतिहास के रूप में वह अपने में परिवर्तन): मैं यहाँ सुविधा प्रति शाखा के बारे में एक लंबे पोस्ट में लिखा है।

masterfeature करने से एक साधारण मर्ज पर्याप्त होगी (क्यों dev3 पहली जगह में master को धक्का दे के रूप में अटकलें के बिना)।


Adam Dymitrukcomments के रूप में, यह एक "वापस मर्ज" कहा जाता है, और, भूमिका आप master से जोड़कर देखते हैं पर निर्भर करता है, यह संदेहास्पद है: अगर master स्थिर उत्पादन राज्य का प्रतिनिधित्व करता है, तो आप को मर्ज करना चाहिए master, master से नहीं।

लेकिन फिर से, मेरे जवाब ने कहा भूमिका पर कोई धारणा नहीं की।


यही कारण है कि प्रसिद्ध git-flow (, से, उदाहरण के लिए, एक hotfix शाखा के रूप में मैं commented earlier) ने अपने blog post मर्ज के जो गुरु के आ रहे हैं में दिखाता है

git flow

+0

बैक-विलय अच्छे नहीं हैं। कोई फर्क नहीं पड़ता कि क्यों दूसरे देव गुरु के लिए प्रतिबद्ध है। –

1

तीसरा डेवलपर मास्टर पर एक फीचर नहीं लिखना चाहिए। दुर्लभ अपवाद एक हॉटफिक्स है। लेकिन फिर भी, यह अपनी शाखा होनी चाहिए और फिर मास्टर पर --no-ff के साथ विलय होनी चाहिए। http://dymitruk.com/blog/2012/02/05/branch-per-feature/

2

git एक शानदार उपकरण है; लेकिन, यह डेवलपर्स के बीच अच्छे संचार की जगह नहीं ले सकता है।

आपको यह पूछना है कि masterमें परिवर्तन को भी feature में शामिल किया जाना चाहिए। आदर्श रूप से, सुविधा शाखा में कोड की सबसे छोटी मात्रा संभव होनी चाहिए।

यदि परिवर्तन पूरी तरह से feature में शामिल किया जाना चाहिए, तो आपके पास मूल रूप से दो विकल्प हैं: git rebase; और, git cherry-pick।मुझे लगता है कि आप master से feature में पिछड़ा विलय कर सकते हैं; लेकिन, इससे खराब परिस्थितियां हो सकती हैं ...

cherry-pick आपको टिप्पणी और लेखक की जानकारी रखने, वर्तमान HEAD पर एक विशिष्ट प्रतिबद्धता या एकाधिक प्रतिबद्धताओं को लागू करने की अनुमति देता है। सफलतापूर्वक cherry-pick एड होने के बाद, गिट यह जानकर काफी समझदार है कि feature को master में विलय करते समय दोनों काम समान होते हैं। अगर यह केवल कुछ काम करता है जिसके बारे में हम बात कर रहे हैं, तो cherry-pick पर्याप्त होना चाहिए।

rebase आपको इतिहास में एक अलग बिंदु से शुरू होने वाली वर्तमान शाखा (काम की रेखा) लागू करने की अनुमति देता है। जैसा कि आपने बताया है, यह डेवलपर 1 और डेवलपर 2 के लिए परेशानी हो सकती है, जिनके पास पहले से ही feature की प्रतियां हैं। उन्हें को नईfeature शाखा पर उनके स्थानीय विकास की भी आवश्यकता होगी।

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

# Ensure clean working directory 
$ git stash 

# Create new branch at master 
$ git branch some-descriptive-name master 

# Move master back one commit 
$ git checkout master 
$ git reset --hard HEAD^ 

# Merge the new branch into master 
$ git merge --no-ff some-descriptive-name 

# Forcibly update master 
# YOU SHOULD COMMUNICATE WITH OTHER DEVS BEFORE DOING THIS 
$ git push -f origin master 

# Merge the new branch into feature 
$ git checkout feature 
$ git merge --no-ff some-descriptive-name 

मैं पर्याप्त नहीं बता सकता कि कितना मूल्यवान अच्छा संचार होता है क्योंकि "oops" चीजों के इन प्रकार के और होता है सकते हैं सब पहर।

शुभकामनाएं!

संपादित करें:

cherry-pick आईएनजी के बारे में हिस्सा धारणा master के लिए केवल कुछ करता है (या सिर्फ एक) था के साथ लिखा गया था और वे सब cherry-pick एड होंगे।

x -- y (master) 
\ 
    a -- b -- c (feature) 
+0

मुझे इसकी सीमा के कारण चेरी-पिकिंग पसंद नहीं है (http://stackoverflow.com/questions/881092/how-to-merge-a-specific-commit-in-git/881112#881112), dev3 प्रतिबद्ध डुप्लिकेट करना । मैं यहाँ एक विलय पसंद करेंगे। – VonC

+0

मैं समझता हूं, लेकिन चेरी-पिक ने कहा कि क्यों 'फीचर' शाखा पर डुप्लिकेट करना और संभावित रूप से अधिक समस्याग्रस्त होने के लिए 'फीचर' का भविष्य मर्ज करना है? – VonC

+0

यदि आप मास्टर (रिवर्स विलय) से विलय करते हैं, तो आप * सभी * प्रतिबद्धताओं को शामिल करते हैं। इससे बहुत लंबा 'बिसेक्ट' होता है और फीचर शाखा अब सुविधा नहीं है। चेरी-पिकिंग के बारे में आपका मुद्दा बहुत मान्य है। लेकिन, मुझे लगता है कि 'मास्टर' पर सर्जरी करना स्थिति को संभालने का सबसे अच्छा तरीका है। – execjosh

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