अलग-अलग शाखा में विशिष्ट प्रतिबद्ध से शाखा कैसे बनाएं


102

मैंने मास्टर शाखा में कई कमिट किए हैं और फिर उन्हें देव शाखा में मिला दिया है।

मैं देव शाखा में एक विशिष्ट प्रतिबद्ध से एक शाखा बनाना चाहता हूं, जो पहले मास्टर शाखा में प्रतिबद्ध थी।

मैंने आदेशों का उपयोग किया:

git checkout dev
git branch  <branch name> <commit id>

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

पुनश्च: मैंने यहाँ github में एक उदाहरण बनाया https://github.com/RolandXu/test_for_branch

मैंने आदेशों का उपयोग किया:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

मुझे उम्मीद है कि परीक्षण शाखा में aa.txt bb.txt cc.txt शामिल है। हालाँकि, परीक्षण शाखा में केवल a.txt और cc.txt शामिल हैं। यह सबसे अधिक संभावना है कि मास्टर शाखा से शाखा बनाई गई है।

जवाबों:


145

यदि आप branchकमांड के इस रूप का उपयोग कर रहे हैं (शुरुआत बिंदु के साथ), तो इससे कोई फर्क नहीं पड़ता कि आपका कहां HEADहै।

तुम क्या कर रहे हो:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8
  • सबसे पहले, आपने अपनी HEADशाखा को सेट किया dev,

  • दूसरा, आप एक नई शाखा शुरू करते हैं 07aeec98। इस कमिट में कोई bb.txt नहीं है (आपके गीथूब रेपो के अनुसार)।

यदि आप उस स्थान पर एक नई शाखा शुरू करना चाहते हैं जिसे आपने अभी-अभी देखा है, तो आप या तो बिना किसी आरंभ बिंदु के शाखा चला सकते हैं:

git branch test

या जैसा कि अन्य ने उत्तर दिया है, एक ऑपरेशन में शाखा और चेकआउट:

git checkout -b test

मुझे लगता है कि आप उस तथ्य से भ्रमित हो सकते हैं 07aeec98जो शाखा का हिस्सा है dev। यह सही है कि यह कमिटमेंट पूर्वजों का है dev, इसके बदलावों को नवीनतम कमिटमेंट तक पहुंचने की जरूरत है dev। हालांकि, वे अन्य कमिट हैं जिन्हें नवीनतम तक पहुंचने की आवश्यकता है dev, और ये जरूरी नहीं कि इतिहास में हैं 07aeec98

8480e8ae(जहाँ आपने bb.txt को जोड़ा है) उदाहरण के लिए नहीं के इतिहास में है 07aeec98। यदि आप से शाखा 07aeec98, आप द्वारा शुरू किए गए परिवर्तन नहीं मिलेगा 8480e8ae

दूसरे शब्दों में: यदि आप शाखा A और शाखा B को C C में मिलाते हैं, तो A की ओर से एक नई शाखा बनाएँ, तो आपको B में शुरू किए गए परिवर्तन नहीं मिलेंगे।

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


यदि आप अपनी सुविधा शाखाओं में मास्टर से नए परिवर्तनों को स्थायी रूप से एकीकृत करना चाहते हैं, तो आपको masterउनमें विलय करना चाहिए और आगे बढ़ना चाहिए । यह आपकी सुविधा शाखाओं में मर्ज कमिट्स बनाएगा, हालाँकि।

यदि आपने अपनी सुविधा शाखाएँ प्रकाशित नहीं की हैं, तो आप उन्हें अपडेट किए गए मास्टर पर भी रिबेस कर सकते हैं git rebase master featureA:। संभव संघर्षों को हल करने के लिए तैयार रहें।

यदि आप एक ऐसा वर्कफ़्लो चाहते हैं, जहाँ आप मर्ज किए गए फ़ीचर शाखाओं पर काम कर सकते हैं और फिर भी मास्टर में नए बदलावों के साथ एकीकृत कर सकते हैं, तो मैं निम्नलिखित सलाह देता हूँ:

  • मास्टर की ओर से प्रत्येक नई सुविधा शाखा को आधार बनाएं
  • devमास्टर की ओर से एक शाखा बनाएँ
  • जब आपको यह देखना होगा कि आपकी सुविधा शाखा मास्टर में नए परिवर्तनों के साथ कैसे एकीकृत होती है, तो मास्टर और फीचर शाखा दोनों को मर्ज करें dev

devसीधे तौर पर प्रतिबद्ध न हों , इसका उपयोग केवल अन्य शाखाओं के विलय के लिए करें।

उदाहरण के लिए, यदि आप A और B सुविधा पर काम कर रहे हैं:

a---b---c---d---e---f---g -master
    \       \
     \       \-x -featureB
      \
       \-j---k -featureA

एक devशाखा में शाखाओं को मिलाएं ताकि यह जांच सकें कि वे नए मास्टर के साथ काम करते हैं:

a---b---c---d---e---f---g -master
    \       \            \
     \       \            \--x'---k' -dev
      \       \             /    /   
       \       \-x----------    /    -featureB
        \                      /
         \-j---k--------------- -featureA

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

a---b---c---d---e---f---g---h---i----- -master
    \       \            \            \
     \       \            \--x'---k'---i'---l' -dev
      \       \             /    /         /
       \       \-x----------    /         /  -featureB
        \                      /         /  
         \-j---k-----------------l------ -featureA

जब नई सुविधाओं को एकीकृत करने का समय है, तो devमास्टर में फीचर शाखाओं (नहीं !) को मर्ज करें ।


धन्यवाद। आप मेरे सवाल का जवाब दें। मैं git ब्रांच मोड को समझने में गलत हूं। और क्या मेरी समस्या के लिए आपके पास कोई सुझाव है? मेरे पास मास्टर ब्रांच है, जिसमें दूसरों से समय पर कई काम होते हैं (पेरफोर्स के साथ सिंक)। मेरे पास देव शाखा है मैं व्यक्तिगत काम करता हूं। मुझे एक शाखा चाहिए जिसमें मास्टर शाखा और देव शाखा से सभी कमिट हों, फिर मैं आसानी से इस शाखा पर आधारित शाखा बना सकता हूं, फिर विशिष्ट कार्य शुरू कर सकता हूं।
रोलैंडएक्सयू

मैं एक टिप्पणी में जवाब नहीं दे सकता था, इसलिए मैंने सुझाए गए वर्कफ़्लोज़ के साथ अपने उत्तर को अपडेट किया।
गौथियर

हे - शानदार और गहन उत्तर के लिए धन्यवाद! बस जिज्ञासु: अंत में, एक क्यों होना चाहिए merge the feature branches (not dev!) into master?
cassi.lup

devशाखा में कोई वास्तविक नया विकास नहीं हुआ है । आपको अपनी शाखाओं को विशिष्ट रखना चाहिए। devइसमें केवल मर्ज शामिल हैं यह सभी नई विशेषताओं को सीधे मर्ज करने के लिए और अधिक समझ में आता है master, साथ ही साथ विशेषताओं को मर्ज करने के बाद परिणाम में विलय कर देता है master
Gauthier

@Gauthier आपने प्रश्न का उत्तर क्यों नहीं दिया। मेरे लिए यह devसिर्फ विशेषताओं के साथ विलय करने जैसा लगता है A Bऔर इसमें Cविलीन हो masterजाना व्यक्तिगत रूप से विलय A Bऔर Cमें समान है master। यदि नहीं, तो यह मेरी समझ को चुनौती देता है कि कैसे काम करता है और मैं बहुत उत्सुक हूं कि क्यों!
स्टीवन लू

53

गलत क्रम में आपके पास तर्क हैं:

git branch <branch-name> <commit>

और उसके लिए, इससे कोई फर्क नहीं पड़ता कि किस शाखा की जाँच की जाती है; यह वही करेगा जो आप कहते हैं। (यदि आप प्रतिबद्ध तर्क को छोड़ देते हैं, तो यह मौजूदा एक के रूप में एक ही स्थान पर एक शाखा बनाने में चूक करता है।)

यदि आप इसे बनाते समय नई शाखा की जाँच करना चाहते हैं:

git checkout -b <branch> <commit>

एक ही व्यवहार के साथ यदि आप प्रतिबद्ध तर्क को छोड़ देते हैं।


22

आप इसे स्थानीय रूप से कर सकते हैं जैसा कि सभी ने उल्लेख किया है

git checkout -b <branch-name> <sha1-of-commit>

वैकल्पिक रूप से, आप इसे गीथब में ही कर सकते हैं, चरणों का पालन करें:

1- रिपॉजिटरी में, पर क्लिक करें Commits

2- जिस ब्रांच से आप ब्रांच करना चाहते हैं, उस पर क्लिक <>करके हिस्ट्री में इस प्वाइंट पर रिपॉजिटरी ब्राउज करें।

इतिहास से रूबरू होता है

3- tree: xxxxxxऊपरी बाईं ओर क्लिक करें । बस एक नए शाखा नाम में टाइप करें Create branch xxxजैसा कि नीचे दिखाया गया है।

नई शाखा बनाएँ

अब आप स्थानीय स्तर पर उस शाखा से परिवर्तन ला सकते हैं और वहाँ से जारी रख सकते हैं।


यह वही है जो मुझे चाहिए .. वेब साइट में कैसे करना है
eharo2

मैं यह कभी नहीं जानता था। यह बात है। जीयूआई बात सिर्फ महान है और मैं सीएलआई से दूर होना चाहता था।
रोहित गुप्ता

10

प्रयत्न

git checkout <commit hash>
git checkout -b new_branch

प्रतिबद्ध केवल एक बार आपके पेड़ में मौजूद होना चाहिए, दो अलग शाखाओं में नहीं।

यह आपको उस विशिष्ट प्रतिबद्ध की जांच करने और उसे नाम देने की अनुमति देता है कि आप क्या करेंगे।


नमस्ते, मैं git लॉग देव और git लॉग मास्टर की कोशिश करता हूं, मैंने पाया कि प्रतिबद्ध हैश आईडी इस प्रतिबद्ध के लिए समान है कि मैं मास्टर शाखा से देव शाखा में विलीन हो जाता हूं
रोलैंडएक्सयू

gitkअपने लॉग की कल्पना करने के लिए कुछ का उपयोग करने में मदद मिल सकती है
ZMorek

मैं नव github में एक उदाहरण जोड़ते हैं। और गौथियर ने पहले से ही मेरे सवाल का जवाब दिया कि मैं गिट शाखा मोड को गलत समझता हूं। धन्यवाद :)
रोलैंडएक्सयू

मुझे लगता है कि यह तीखा जवाब है। धन्यवाद
virusss8

9

आप को करना पड़ेगा:

git branch <branch_name> <commit>

(आप शाखा का नाम और वचन दे रहे थे)

या आप कर सकते हैं:

git checkout -b <branch_name> <commit>

यदि आप शाखा नाम का उपयोग करते हैं, तो आपको शाखा की नोक से एक शाखा मिलती है।


इसका HEADमतलब यह नहीं है। आप कह सकते हैं "शाखा की नोक" या "इसके बदले में शाखा बिंदुओं को प्रतिबद्ध करें"।
कास्कैबेल

@ जेफ्रोमी - शुद्धतावादी होने के लिए, हम केवल शाखा कह सकते हैं, क्योंकि शाखा खुद ही सूचक है, ठीक है, शाखा की नोक।
मनोजसंघ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.