क्या एक बार में कई बगों पर काम करना नितांत आवश्यक है? और "एक ही बार में," मेरा मतलब है "एक ही समय में कई बगों के लिए संपादित की गई फाइलें।" क्योंकि जब तक आपको इसकी बिल्कुल आवश्यकता नहीं होती, मैं आपके वातावरण में केवल एक बग पर काम करूंगा। इस तरह से आप स्थानीय शाखाओं और रिबास का उपयोग कर सकते हैं, जो मुझे एक जटिल गति / चरण के प्रबंधन की तुलना में बहुत आसान लगता है।
मान लें कि मास्टर प्रतिबद्ध बी पर है। अब बग # 1 पर काम करें।
git checkout -b bug1
अब आप शाखा बग 1 पर हैं। कुछ बदलाव करें, प्रतिबद्ध करें, कोड समीक्षा की प्रतीक्षा करें। यह स्थानीय है, इसलिए आप किसी और को प्रभावित नहीं कर रहे हैं, और यह आसान होना चाहिए कि गिट भिन्न से एक पैच बनाने के लिए पर्याप्त हो।
A-B < master
\
C < bug1
अब आप बग 2 पर काम कर रहे हैं। के साथ मास्टर करने के लिए वापस जाओ git checkout master
। एक नई शाखा बनाओ git checkout -b bug2
,। परिवर्तन करें, प्रतिबद्ध करें, कोड समीक्षा की प्रतीक्षा करें।
D < bug2
/
A-B < master
\
C < bug1
आइए दिखाते हैं कि जब आप समीक्षा का इंतजार कर रहे हों तो कोई और मास्टर पर ई एंड एफ करता है।
D < bug2
/
A-B-E-F < master
\
C < bug1
जब आपका कोड स्वीकृत हो गया है, तो आप इसे निम्न चरणों के साथ मास्टर करने के लिए रिबेस कर सकते हैं:
git checkout bug1
git rebase master
git checkout master
git merge bug1
यह निम्नलिखित में परिणाम देगा:
D < bug2
/
A-B-E-F-C' < master, bug1
फिर आप अपनी स्थानीय बग 1 शाखा को हटा सकते हैं, और आप जा सकते हैं। आपके कार्यक्षेत्र में एक समय पर एक बग, लेकिन स्थानीय शाखाओं के उपयोग से आपकी रिपॉजिटरी कई बगों को संभाल सकती है। और यह एक जटिल चरण / नृत्य से बचता है।
टिप्पणियों में ctote के प्रश्न का उत्तर दें:
ठीक है, आप प्रत्येक बग के लिए स्टैशिंग पर वापस जा सकते हैं, और एक बार में केवल एक बग के साथ काम कर सकते हैं। कम से कम मंचन समस्या से आपको बचाता है। लेकिन यह कोशिश करने के बाद, मैं व्यक्तिगत रूप से इसे परेशान करने वाला हूं। जीआईटी लॉग ग्राफ में स्टैट्स थोड़ा गड़बड़ हैं। और अधिक महत्वपूर्ण बात, यदि आप कुछ पेंच करते हैं तो आप वापस नहीं ला सकते हैं। यदि आपके पास एक गंदा वर्किंग डायरेक्टरी है और आप स्टैश पॉप करते हैं, तो आप उस पॉप को "पूर्ववत" नहीं कर सकते। पहले से मौजूद कमिट्स पर शिकंजा कसना ज्यादा मुश्किल है।
तो git rebase -i
।
जब आप एक शाखा को दूसरे पर वापस करते हैं, तो आप इसे अंतःक्रियात्मक रूप से (-i ध्वज) कर सकते हैं। जब आप ऐसा करते हैं, तो आपके पास यह विकल्प होता है कि आप प्रत्येक कमिटमेंट के साथ क्या करना चाहते हैं। Pro Git एक भयानक पुस्तक है जो HTML प्रारूप में ऑनलाइन भी है, और इसमें रिबासिंग और स्क्वैशिंग पर एक अच्छा खंड है:
http://git-scm.com/book/ch6-4.html
मैं सुविधा के लिए उनके उदाहरण शब्दशः चुराता हूँ। आप निम्नलिखित प्रतिबद्ध इतिहास का वर्णन करें, और आप मास्टर पर बग 1 को रिबास और स्क्वैश करना चाहते हैं:
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
जब आप टाइप करेंगे तो यहां आपको दिखाई देगा git rebase -i master bug1
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
एक शाखा के सभी कमिट्स को एक एकल कमिट में स्क्वैश करने के लिए, पहले कमिट को "पिक" के रूप में रखें और बाद की सभी "पिक" प्रविष्टियों को "स्क्वैश" या "एस" के साथ बदलें। आपको प्रतिबद्ध संदेश बदलने का अवसर भी मिलेगा।
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
तो हाँ, स्क्वाशिंग थोड़ा दर्द है, लेकिन मैं अभी भी इसे भारी मात्रा में उपयोग करने की सलाह दूंगा।