2009-05-19 3 views
80

मैं निम्नलिखित शाखाएं हैं करने के लिए निर्दिष्ट करता धक्का:खींचो सब एक शाखा से करता है, एक और

  • master
  • production

और निम्नलिखित दूरस्थ शाखाओं:

  • origin/master
  • origin/production

मैं एक स्क्रिप्ट है कि origin/master शाखा को हासिल करेगा और क्या मेरा आखिरी से बदल लाने (log -p master..origin/master) का अंतर हो जाता है की है। फिर मैं origin/master विलय करता हूं।

पाया करता है एक कोड की समीक्षा उपकरण को धक्का दे रहे हैं।

मैं सफल कामों को धक्का देना चाहता हूं - और केवल उन्हें - उत्पादन शाखा में, और फिर निश्चित रूप से origin/production पर।

मैं ऐसा कैसे कर सकता हूं?

इसके अलावा, मेरे पास 2 स्क्रिप्ट चल रही हैं: origin/master से प्राप्त करने वाला एक, धक्का डेटाबेस को विवरण देता है, और विलय करता है, और दूसरा जो मैं वर्तमान में लिख रहा हूं उसे सफल काम करना होगा।

मैं दौड़ की स्थिति से बचने/विवाद विलय से बचने के दौरान उन 2 स्क्रिप्ट चलाना चाहता हूं। चूंकि मैं केवल निर्दिष्ट प्रतिबद्धताओं के साथ काम करना चाहता हूं, हो सकता है कि उन कामों से छुटकारा पाने का कोई तरीका हो जो मैं नहीं चाहता हूं?

+0

'सफल काम' से आपका क्या मतलब है? – bdonlan

+0

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

उत्तर

259

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

A-----B------C 
\ 
    \ 
    D 

हो जाता है

A-----B------C 
\ 
    \ 
    D-----C' 

यह, ज़ाहिर है, Git चेरी ले कमांड के साथ किया जा सकता है।

इस के साथ समस्या यह करता है कि Git प्रतिबद्ध मानता है उन्हें पहले सभी इतिहास शामिल करने के लिए है - है, इस प्रकार आपके पास तीन करता तो तरह यदि:

A-----B-----C 

और बी से छुटकारा पाने के लिए प्रयास करें, तो आप बनाने के लिए एक पूरी तरह से नई प्रतिबद्धता:

A-----------C' 

जहां सी के पास एक अलग SHA-1 आईडी है। इसी प्रकार, चेरी एक शाखा से दूसरे में एक प्रतिबद्धता लेने के लिए मूल रूप से एक पैच उत्पन्न करना, फिर इसे लागू करना, इस तरह इतिहास को खोना भी शामिल है।

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

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

आप पैच के स्तर पर चीजों के साथ काम करने का आग्रह करते पर अच्छा है, आप darcs को देखने के लिए चाहते हो सकता है - यह एक भंडार मानता है एक सेट होने के लिए पैच के, और इस प्रकार चेरी पिकिंग मौलिक ऑपरेशन बन जाता है। हालांकि इसमें समस्याएं हैं, जैसे धीमी गति से :)

संपादित करें: साथ ही, मुझे यकीन नहीं है कि मैं दो स्क्रिप्ट के बारे में आपका दूसरा प्रश्न समझता हूं। शायद आप इसे अधिक विस्तार से वर्णित कर सकते हैं, संभवतः चीजों को भ्रमित करने से रोकने के लिए एक अलग प्रश्न के रूप में?

+0

मेरे दूसरे प्रश्न के बारे में, मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि परिवर्तन लाने की प्रक्रिया (पहली स्क्रिप्ट) और दूसरी शाखाओं के साथ काम करने के दौरान दिए गए कार्यों को दूसरी स्थिति (दूसरी स्क्रिप्ट) को धक्का देकर काम कर सकते हैं, अलग-अलग शाखाओं के साथ काम करते समय दौड़ की स्थिति/विलय विवाद के बिना काम कर सकते हैं। लेकिन अंत में मुझे लगता है कि इससे कोई फर्क नहीं पड़ता क्योंकि मैं 2 स्क्रिप्ट को एक में विलय कर सकता हूं ताकि 2 स्क्रिप्ट एक साथ काम न करें :) – Sylvain

+20

चेरी-पिक परिणामों का अच्छा विवरण। +1 – VonC

+8

* "प्रतिबद्ध आईडी के यह परिवर्तन अन्य चीजों के बीच गिट की विलय कार्यक्षमता को तोड़ता है" * ** @ bdonlan कृपया बताएं कि विलय की कार्यक्षमता कैसे ब्रैक की गई है। इसका क्या अर्थ है? ** – Narek

1

मुझे पता है यह एक पुराने सवाल है, लेकिन यहाँ संदर्भित है: How to merge a specific commit in Git

इसलिए, एक नए जवाब: उपयोग सुविधा शाखाओं और अनुरोध खींच।

यह क्या लग रहा है, जैसे जहां एफए एक सुविधा एक साथ प्रतिबद्ध है, और अमेरिकन प्लान एक विशेषता बी के साथ प्रतिबद्ध है:

  fA fC (bad commit, don't merge) 
     /\/
master ----A----B----C 
       \/
       fB 

पुल अनुरोध GitHub की कार्यक्षमता के साथ जुड़े रहे हैं, लेकिन वास्तव में सभी मेरा मतलब है कि है कोई फीचर शाखाओं को मास्टर में विलय करने की ज़िम्मेदारी है।