स्क्वैश गिट पुल अनुरोधों के लिए क्यों करता है?


199

हर गंभीर गितुब रेपो मैं क्यों चाहता हूं कि मैं अपने कमिट्स को एक ही कमिट में स्क्वैश करना चाहता हूं।

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

ऐसा लगता है कि "जल्दी और अक्सर प्रतिबद्ध" मंत्र के खिलाफ जाना है।


1
एक बड़े रेपो के लिए, यह बहुत समय और स्थान बचाता है जब लोग रेपो के साथ कुछ भी करना चाहते हैं।
raptortech97

8
" यह भी लगता है कि" जल्दी कमिट करें और अक्सर कमिट करें "मन्त्र। " और समीक्षक उन्हें देखना नहीं चाहते, यह सुनिश्चित है।
जेन्सजी

7
कथित उत्तर का सारांश बताने के लिए किसी को प्रश्न में एक संपादन करने की आवश्यकता नहीं है। वह स्वीकृत उत्तरों और उत्थान का स्थान है। लोग जवाब पढ़ने से अपने निष्कर्ष निकाल सकते हैं।

5
मुझे अभी भी समझ नहीं आया है कि स्क्वैश करने की इच्छा क्यों होती है। मुझे लगता है कि लगभग कोई पेशेवरों के साथ स्क्वाश करने के लिए बहुत सारे विपक्ष हैं। यह एक डेटा समस्या के रूप में एक प्रस्तुति मुद्दा है।
mkobit

3
लॉग पर कोई भी उपयोगी विश्लेषण स्क्वैश के साथ खो जाता है। तो ऐसा लगता है जैसे एक डेवलपर ने एक कमिट के साथ एक फीचर बनाया है। यह देखना भी कठिन है कि एक विषम कोड क्यों मौजूद है। एक फीचर का इतिहास महत्वपूर्ण हो सकता है, और यह समझाने के लिए एक लंबा रास्ता तय कर सकता है कि कोड ऐसा क्यों है। लॉग का संक्षिप्त दृश्य उपयोगी है, लेकिन क्या इसे दूसरे तरीके से हासिल नहीं किया जा सकता है?
ताजरत

जवाबों:


158

ताकि आपके पास एक स्पष्ट और संक्षिप्त इतिहास हो, जो स्पष्ट रूप से और आसानी से किए गए बदलावों का कारण बनता है और इसका कारण बनता है।

उदाहरण के लिए मेरे लिए एक विशिष्ट 'बिना बिकने वाला' git लॉग निम्न की तरह लग सकता है:

7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
787g8fgf78... hotfix for #5849564648
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test

क्या झंझट है!

जबकि इसके लिए संदेशों पर थोड़ा अतिरिक्त ध्यान देने के साथ एक अधिक सावधानी से प्रबंधित और मर्ज किए गए लॉग को निम्न तरह से देखा जा सकता है:

7hgf8978g9... 8483948393 Added new slideshow feature
787g8fgf78... 5849564648 Hotfix for android display issue
9080gf6567... 6589685988 Implemented pop-up to select language

मुझे लगता है कि आप आम तौर पर स्क्वाश करने के बिंदु को देख सकते हैं और अनुरोध को खींचने के लिए भी यही सिद्धांत लागू होता है - इतिहास की पठनीयता। आप एक ऐसे कम लॉग में भी जुड़ सकते हैं जिसमें पहले से ही सैकड़ों या हजारों कमिट हैं और यह बढ़ते इतिहास को छोटा और संक्षिप्त रखने में मदद करेगा।

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

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

8754390gf87... Implement feature switches

"काम का 1 टुकड़ा" जैसा लगता है। या तो वे मौजूद हैं या वे नहीं हैं! इसे तोड़ने के लिए समझ में नहीं आता है। हालाँकि अनुभव ने मुझे दिखाया है कि (संगठनात्मक आकार और जटिलता के आधार पर) अधिक दानेदार रास्ता हो सकता है:

fgfd7897899... Add field to database, add indexes and a trigger for the dw group
9458947548g... Add 'backend' code in controller for when id is passed in url.
6256ac24426... Add 'backend' code to make field available for views.
402c476edf6... Add feature to UI

छोटे टुकड़ों का मतलब आसान कोड रिव्यू, आसान यूनिट टेस्टिंग, क्यूए को बेहतर अवसर, सिंगल रिस्पॉन्सिबिलिटी प्रिंसिपल को बेहतर अलाइनमेंट आदि।

वास्तव में ऐसे स्क्वैश को कब करना है, इसकी व्यावहारिकता के लिए, मूल रूप से दो अलग-अलग चरण होते हैं जिनके अपने वर्कफ़्लो होते हैं

  • आपके विकास, जैसे अनुरोधों को खींचते हैं
  • आपके काम को मुख्य शाखा में जोड़ा जाता है, जैसे मास्टर

अपने विकास के दौरान आप 'जल्दी और अक्सर' और त्वरित 'डिस्पोजेबल' संदेशों के साथ। आप कभी-कभी यहां स्क्वैश करना चाहते हैं, जैसे कि wip और todo मैसेज में स्क्वैश करना। यह ठीक है, शाखा के भीतर, कई कमिटों को बनाए रखने के लिए जो विकास में आपके द्वारा किए गए अलग-अलग चरणों का प्रतिनिधित्व करते हैं। आपके द्वारा चुने जाने वाले अधिकांश स्क्वैश इन फीचर शाखाओं के भीतर होने चाहिए, जबकि उन्हें विकसित किया जा रहा है और मास्टर में विलय करने से पहले।
जब आप मेनलाइन ब्रांच में शामिल होते हैं, तो आप चाहते हैं कि संक्षिप्त हो और मौजूदा मेनलाइन हिस्ट्री के अनुसार सही ढंग से फॉर्मेट की गई हो। इसमें टिकट ट्रैकर सिस्टम आईडी शामिल हो सकती है, उदाहरण के तौर पर JIRA। स्क्वैशिंग वास्तव में यहां लागू नहीं होती है जब तक आप मास्टर पर कई अलग-अलग कमिटिंग रोल-अप नहीं करना चाहते। आम तौर पर आप नहीं करते।

--no-ffजब मर्ज करने के लिए मास्टर का उपयोग करना मर्ज के लिए एक प्रतिबद्ध का उपयोग करेगा और इतिहास को संरक्षित करेगा (शाखा में)। कुछ संगठन इसे एक सर्वोत्तम अभ्यास मानते हैं। Https://stackoverflow.com/q/9069061/631619 पर और देखें आप HEAD के शीर्ष पर (जहां अभी किया गया है) git logएक --no-ffकमिटमेंट का व्यवहारिक प्रभाव दिखाई देगा, जहां एक कमेटी नवीनतम प्रतिबद्ध --no-ffहोगी। इतिहास में आगे, तारीखों और अन्य कमिट के आधार पर।


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

6
दिलचस्प। दिन के अंत में मैंने अपने 'दर्शन' को आधार बनाया जो मैंने देखा है। स्पष्ट होने के लिए - परिवर्तन पर काम करते समय छोटे हिस्सों में काम करना और प्रत्येक को प्रतिबद्ध करना महान है। मेरा अनुभव यह रहा है कि एक बार जब यह काम मास्टर में विलय हो जाता है, तो मुख्य बात यह है कि इसकी जांच होती है 'क्या है, इसकी पूरी तरह से यह मर्ज क्या है (आमतौर पर) मुद्दों का कारण बनता है x ...
माइकल ड्यूरेंट

6
मैं भी विरोधी स्क्वैश हूँ। आपको पहली बार मूर्खतापूर्ण संदेश नहीं लिखना चाहिए। और उदाहरण में (85493g2458 ... फिक्स्ड स्लाइड शो डिस्प्ले इश्यू इन द यानि) अगर मैं इससे जुड़े कोड को डीबग करना चाहता हूं तो यह बहुत अधिक उपयोगी होगा।
थॉमस डेविस

5
यह दुर्भाग्यपूर्ण है कि SCM प्रथा में इस तरह की लापरवाह और गलत ढंग से हठधर्मिता सामने आई है। फ़िल्टरिंग टूल का उपयोग इतिहास की पठनीयता का प्रबंधन करने के लिए नहीं व्यवहार के लिए किया जाना चाहिए।
ctpenrose

4
परेशान करने वाले रुझान और हठधर्मिता। yow। मैं अधिक सहमत तरीके से प्रस्तुत एक अधिक तथ्य आधारित तर्क को पसंद करूंगा। एक अलग राय पोस्ट / वोट करने के लिए आपका स्वागत है। यह समुदाय के मतदान की बात है
माइकल ड्यूरेंट

26

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

अगर आपको लगता है कि आपके 16 कमिट्स 1 "एडेड फीचर एक्स, री-फैक्टरेड जेड टू यू एक्स" के बजाय 2 कमिट्स का सबसे अच्छा प्रतिनिधित्व करते हैं, तो वह शायद 2 कॉम के साथ एक प्रपोज करने के लिए ठीक है, लेकिन फिर प्रपोज करना सबसे अच्छा हो सकता है उस मामले में 2 अलग-अलग पीआर हैं (यदि रेपो अभी भी एकल प्रतिबद्ध पीआर पर जोर देता है)

यह आपके रेपो के अनुसार, "जल्दी और बार-बार प्रतिबद्ध" मंत्र के खिलाफ नहीं जाता है, जबकि आप विकसित कर रहे हैं तब भी आपके पास बारीक विवरण हैं, इसलिए आपके पास काम खोने का कम से कम मौका है, और अन्य लोग समीक्षा / प्रस्ताव / प्रस्ताव कर सकते हैं। अपने काम के खिलाफ जनसंपर्क जबकि नए जनसंपर्क विकसित किया जा रहा है।


4
लेकिन जब आप स्क्वैश करते हैं तो आप उस इतिहास को अपने कांटे में खो देते हैं? आप उस इतिहास को क्यों फेंकना चाहेंगे?
हम्सटर

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

@AndrewHill क्या एक महान अवधारणा! मैं इस वर्कफ़्लो को अपनी टीम से मिलवाना चाहता हूं, इसने आपके लिए कैसे काम किया है? मैंने इसके बारे में एक ब्लॉग पोस्ट लिखा , और इस पर शोध करते हुए यह टिप्पणी आई।
Droogans

19

जो मैं देख सकता हूं उसका मुख्य कारण इस प्रकार है:

  • वर्तमान में (अक्टूबर 2015) के विलय के अनुरोध के लिए GitHub UI आपको प्रतिबद्ध संदेश की पहली पंक्ति को संपादित करने की अनुमति नहीं देता है, यह होने के लिए मजबूर करता है Merge pull request #123 from joebloggs/fix-snafoo
  • प्रतिबद्ध ब्राउज़िंग इतिहास के लिए GitHub यूआई वर्तमान में आपको शाखा के इतिहास को देखने की अनुमति नहीं है --first-parentदृष्टि
  • किसी फ़ाइल पर दोष देखने के लिए GitHub UI वर्तमान में आपको फ़ाइल के दोष को देखने की दृष्टि से अनुमति नहीं देता है --first-parent(ध्यान दें कि यह केवल Git 2.6.2 में तय किया गया था, इसलिए हम GitHub को उसके बिना होने के लिए क्षमा कर सकते हैं उपलब्ध)

इसलिए जब आप इन तीनों स्थितियों को ऊपर से जोड़ते हैं, तो आपको एक ऐसी स्थिति मिलती है, जिसमें अनचाहे कमिट्स को GitHub UI से बदसूरत रूप में मिला दिया जाता है।

स्क्वैश किए गए कमिट्स के साथ आपका इतिहास कुछ ऐसा दिखाई देगा

1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... Hotfix for android display issue
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... Implemented pop-up to select language

जबकि बिना स्क्वैश किए इतिहास में कुछ ऐसा दिखेगा

1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... hotfix for #5849564648
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test

जब आप एक पीआर अनुरेखण में बहुत कमिट करते हैं, जहां एक बदलाव आया है, तो एक बुरा सपना बन सकता है यदि आप खुद को GitHub UI का उपयोग करने के लिए प्रतिबंधित करते हैं

उदाहरण के लिए, आप एक अशक्त सूचक को किसी फ़ाइल में कहीं डि-रेफर किया जा रहा है ... तो आप कहते हैं "यह किसने किया, और कब? क्या रिलीज़ संस्करण प्रभावित हुए?"। फिर आप गिटहब यूआई में दोष देखने के लिए घूमते हैं और आप देखते हैं कि लाइन को बदल दिया गया था789fdfffdf... "ओह, लेकिन एक सेकंड रुको, यह लाइन बस अपने इंडेंट को बाकी कोड के साथ फिट करने के लिए बदल गई थी", इसलिए अब आपको पेरेंट कमिट में उस फाइल के लिए ट्री स्टेट पर नेविगेट करना होगा और री-विजिट करना होगा दोष पृष्ठ ... अंतत: आपको कमिटमेंट मिल जाता है ... यह 6 महीने पहले का एक कमिटमेंट है ... "ओह **** यह 6 महीने के लिए यूजर्स को प्रभावित कर सकता है" आप कहते हैं ... आह लेकिन रुको, वह कमिट वास्तव में एक पुल अनुरोध में था और केवल कल विलय कर दिया गया था और किसी ने भी अभी तक कोई कटौती नहीं की है ... "धिक्कार है कि आप लोगों को इतिहास को बिना बताए विलय करने के लिए" यह रोना है जो आमतौर पर लगभग 2 या 3 कोड पुरातत्व अभियानों के माध्यम से सुना जा सकता है GitHub UI

अब हम विचार करें कि यदि आप Git कमांड लाइन का उपयोग कैसे करते हैं (और सुपर-भयानक 2.6.2 जिसके लिए फिक्स है git blame --first-parent)

  • यदि आप Git कमांड लाइन का उपयोग कर रहे हैं, तो आप मर्ज कमिट मैसेज को पूरी तरह से नियंत्रित करने में सक्षम होंगे और इस प्रकार मर्ज कमिट अच्छी सारांश रेखा हो सकती है।

तो हमारा प्रतिबद्ध इतिहास जैसा दिखेगा

$ git log
1256556316... #423 Added new slideshow feature
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... #324 Hotfix for android display issue
787g8fgf78... hotfix for #5849564648
f56556316e... #28 Implemented pop-up to select language
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test

लेकिन हम भी कर सकते हैं

$ git log --first-parent
1256556316... #423 Added new slideshow feature
56556316ad... #324 Hotfix for android display issue
f56556316e... #28 Implemented pop-up to select language

(दूसरे शब्दों में: Git CLI से आप अपना केक बना सकते हैं और इसे खा भी सकते हैं)

अब जब हम अशक्त पॉइंटर मुद्दे को हिट करते हैं ... अच्छी तरह से हम सिर्फ उपयोग करते हैं git blame --first-parent -w dodgy-file.cऔर हमें तुरंत सटीक प्रतिबद्ध दिया जाता है जहां सरल व्हाट्सएप परिवर्तनों को नजरअंदाज करते हुए मास्टर शाखा को अशक्त सूचक डी-संदर्भ पेश किया गया था।

बेशक अगर आप GitHub UI का उपयोग करके मर्ज कर रहे हैं तो GitHub के git log --first-parentलिए वास्तव में भद्दा धन्यवाद है जो मर्ज कमिट मैसेज की पहली पंक्ति को मजबूर करता है:

1256556316... Merge pull request #423 from jrandom/add-slideshows
56556316ad... Merge pull request #324 from ahacker/fix-android-display
f56556316e... Merge pull request #28 from somwhere/select-lang-popup

तो एक लंबी कहानी को छोटा करने के लिए:

गीथहब यूआई (अक्टूबर 2015) में कई कमियां हैं कि यह कैसे अनुरोधों को मर्ज करता है, यह प्रतिबद्ध इतिहास को कैसे प्रस्तुत करता है और यह कैसे जानकारी को दोष देता है। GitHub UI में इन दोषों के आसपास हैक करने का वर्तमान सबसे अच्छा तरीका है कि लोग विलय से पहले अपने कमिट्स को स्क्वैश करने का अनुरोध करें।

Git CLI में ये समस्याएँ नहीं हैं और आप आसानी से यह चुन सकते हैं कि आप कौन सा दृश्य देखना चाहते हैं ताकि आप दोनों इस कारण का पता लगा सकें कि इस तरह से एक विशेष परिवर्तन क्यों किया गया था (निर्विवाद कमिट के इतिहास को देखते हुए) प्रभावी ढंग से स्क्वैस्ड कमिट देखें।

परिशिष्ट भाग

अंतिम कारण अक्सर स्क्वाशिंग के लिए उद्धृत किया जाता है, बैकपोर्टिंग को आसान बनाने के लिए ... यदि आपके पास केवल एक पोर्ट टू बैक पोर्ट (यानी स्क्वैस्ड कमिट) है तो चेरी पिक करना आसान है ...

वैसे अगर आप git के इतिहास को देख रहे हैं, git log --first-parentतो आप केवल मर्ज कमिट्स को चुन सकते हैं। अधिकांश लोग भ्रमित हो जाते हैं चेरी लेने मर्ज शुरू हो जाता है क्योंकि आपको -m Nविकल्प निर्दिष्ट करना पड़ता है लेकिन अगर आपको यह कमिट मिला है git log --first-parentतो आप जानते हैं कि यह पहला अभिभावक है जिसे आप अनुसरण करना चाहते हैं।git cherry-pick -m 1 ...


1
अच्छा जवाब! लेकिन चेरी-रेंज को चुनना काफी आसान है, सुनिश्चित नहीं है कि मैं इसे एक कारण के रूप में खरीदूं।
स्टिग्लर

1
@stiggler मैं व्यक्तिगत रूप से इसे एक कारण के रूप में नहीं खरीदता, लेकिन मैंने इसे दूसरों द्वारा एक कारण के रूप में उद्धृत किया है। IMHO Git टूलींग आप क्या चाहते हैं और प्रतिबद्ध कुचलने बुराई है ... लेकिन मैं कहूँगा कि की फिक्सिंग संचालित होने है --first-parentआदेश ;-) कुचलने प्रतिबद्ध के खिलाफ एक तर्क जीतने के लिए अपने आप को
स्टीफन कोनोली

1
यह स्वीकृत उत्तर होना चाहिए। कम हठधर्मिता और यह दिखाता है कि इतिहास को छानने के लिए "अपने केक को खाने और इसे भी खाने के लिए" इस्तेमाल किया जा सकता है। इतिहास के अन्वेषणों के लिए स्पष्टता लाने के लिए आपको इतिहास का सत्यानाश करने की आवश्यकता नहीं है।
ctpenrose

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

2

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


कड़ाई से बोलते हुए, Git आपको इतिहास बदलने की अनुमति नहीं देता है। प्रतिबद्ध वस्तुएं अपरिवर्तनीय हैं। यह केवल ब्रांच पॉइंटर्स हैं जो परस्पर हैं, और केवल एक "मजबूर अपडेट" के साथ, जिसे आमतौर पर कुछ ऐसा माना जाता है जो आप केवल विकास के उद्देश्यों के लिए करते हैं, न कि मास्टर शाखा पर। जब तक git gcअप्राप्त वस्तुओं को त्यागने के लिए नहीं चलाया गया है , तब तक आप हमेशा एक पिछली स्थिति में वापस आ सकते हैं।
जॉन प्यार्डी

आप सही हैं, और मुझे शायद इसका उल्लेख ऊपर करना चाहिए था। हालाँकि मैं कुछ के लिए तर्क दूंगा जैसे कि एक बल धक्का या फिर से शुरू करना जो पहले से ही एक दूरस्थ रेपो में धकेल दिया गया है, को फिर से लिखना इतिहास के रूप में योग्य होगा, क्योंकि कमिट का क्रम और व्यवस्था उतनी ही महत्वपूर्ण है जितनी खुद को कमिट करती है।
फ्रेड थॉमसन 4

यह किसी दिए गए वचन के लिए सही है। बड़ी तस्वीर में मुझे लगता है कि इसकी संरचना को बदलकर इतिहास को फिर से लिखने के रूप में इंटरएक्टिव रिबासिंग और फिल्टर-ब्रांच।
माइकल डुरंट

1
निष्पक्ष होने के लिए, एसवीएन "हर प्रतिबद्ध पवित्र है" दृष्टिकोण रखता है, लेकिन जब विलय उस विलय के साथ एक ही प्रतिबद्ध बनाता है और उस योगदान को छुपाता है, जिससे यह प्रतीत होता है कि सभी एसवीएन विलय "विद्रोह" हैं। वे नहीं हैं, आपको केवल विलय किए गए घटकों को दिखाने के लिए इतिहास कमांड को बताना होगा। मुझे यह तरीका सबसे अच्छा लगता है।
gbjbaanb

1

परिप्रेक्ष्य के कारण ... <<issue-management-system>>यदि संभव हो तो सबसे अच्छा अभ्यास प्रति एकल मुद्दे पर एक प्रतिबद्ध होना है।

आप अपनी स्वयं की सुविधा शाखा / रेपो में जितने चाहें उतने कमिट कर सकते हैं, लेकिन यह आपका इतिहास है कि आप अपने दृष्टिकोण के लिए अब क्या कर रहे हैं ... यह पूरी टीम / परियोजना या उनके लिए आवेदन के लिए संकेत नहीं है। कई महीनों से रखा जा रहा है परिप्रेक्ष्य ...

इसलिए जब भी आप एक सामान्य रेपो के लिए एक बग फिक्स या फीचर करना चाहते हैं (यह उदाहरण विकसित शाखा के साथ है) तो आप इसके बाद क्या कर सकते हैं:

कैसे-जल्दी से अपनी सुविधा शाखा को फिर से विकसित करने के लिए

    # set your current branch , make a backup of it , caveat minute precision
    curr_branch=$(git rev-parse --abbrev-ref HEAD); git branch "$curr_branch"--$(date "+%Y%m%d_%H%M"); git branch -a | grep $curr_branch | sort -nr

    # squash all your changes at once 
    git reset $(git merge-base develop $curr_branch)

    # check the modified files to add 
    git status

    # add the modified files dir by dir, or file by file or all as shown
    git add --all 

    # check once again 
    git log --format='%h %ai %an %m%m %s'  | less

    # add the single message of your commit for the stuff you did 
    git commit -m "<<MY-ISSUE-ID>>: add my very important feature"

    # check once again 
    git log --format='%h %ai %an %m%m %s'  | less

    # make a backup once again , use seconds precision if you were too fast ... 
    curr_branch=$(git rev-parse --abbrev-ref HEAD); git branch "$curr_branch"--$(date "+%Y%m%d_%H%M"); git branch -a | grep $curr_branch | sort -nr

    # compare the old backup with the new backup , should not have any differences 
    git diff <<old-backup>>..<<new-backup-branch>>


    # you would have to git push force to your feature branch 
    git push --force 

यह पूछे जाने वाले प्रश्न को संबोधित करने का प्रयास भी नहीं करता है, स्क्वैश गिट पुल अनुरोधों के लिए क्यों करता है? देखें कैसे जवाब दें
gnat

स्पष्टीकरण के प्रयास के बाद इसे करना चाहिए ...
यॉर्डन जॉर्जीव

मैं किसी भी तरह से यह देखने में असफल रहा कि कैसे जोड़ा गया स्पष्टीकरण कुछ बिंदुओं पर पर्याप्त मात्रा में कुछ भी प्रदान करता है और कई वर्षों पहले पोस्ट किए गए शीर्ष मतदान उत्तरों में समझाया गया था (पहले संशोधन में सुधार की सराहना हालांकि की गई है)
gnat

कीवर्ड "परिप्रेक्ष्य" है, परिप्रेक्ष्य अवधारणा इस प्रकार की समस्याओं को आईटी में अधिक आसान तरीके से समझाती है, उदाहरण के लिए - इस प्रश्न के उत्तर के लिए आपका परिप्रेक्ष्य पहले से ही प्रदान किया जा रहा है, मेरा परिप्रेक्ष्य "परिप्रेक्ष्य" कीवर्ड का उपयोग कर रहा है और अलग-अलग दृष्टिकोणों के माध्यम से बताए गए एक ही सर्वोत्तम अभ्यास को लागू करने का एक व्यावहारिक उदाहरण प्रदान करता है ...
योर्डन जॉर्जीव

1

मैं देखूंगा कि कोड सार्वजनिक हो रहा है या नहीं।

जब परियोजनाएं निजी रहती हैं:

मैं स्क्वैश नहीं करने और सॉसेज बनाने की सलाह दूंगा। यदि आप अच्छे और छोटे कमिट का उपयोग करते हैं, तो गिट बायसेक्ट जैसे उपकरण सुपर आसान हैं और लोग जल्दी से प्रतिगमन कमिट कर सकते हैं, और देखें कि आपने ऐसा क्यों किया (प्रतिबद्ध संदेश के कारण)।

जब परियोजनाएं सार्वजनिक हो जाती हैं:

सब कुछ स्क्वैश करें क्योंकि कुछ कमिट में सुरक्षा लीक हो सकते हैं। उदाहरण के लिए एक पासवर्ड जो फिर से शुरू और हटा दिया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.