इसका मतलब क्या है कि स्क्वाश करना क्या है?


117

स्क्वाशिंग का मतलब क्या होता है मैं गितुब में कैसे स्क्वैश करता हूं?

मैं Git में नया हूं और मैंने कोअला-एनालाइजर में एक नवागंतुक बग को सौंपा जाना है। मैंने बग को ठीक कर दिया, और अब मुझे अपने कमिट्स को स्क्वैश करने के लिए कहा गया। मैं यह कैसे करुं?


अरे @ लक्ष्मण सबसे ज्यादा मत वाले जवाब को स्वीकार करने के लिए स्वतंत्र महसूस करते हैं। यह आपके प्रश्न का ठीक से उत्तर देता है।
मुस्तफ़िज़ रहमान

जवाबों:


180

आप Git को अपनी वर्किंग डायरेक्टरी (ies) के स्नैपशॉट के एक उन्नत डेटाबेस के रूप में सोच सकते हैं।

Git की एक बहुत अच्छी विशेषता है, कमिट्स के इतिहास को फिर से लिखने की क्षमता।
ऐसा करने का प्रमुख कारण यह है कि इस तरह का बहुत सारा इतिहास केवल उस डेवलपर के लिए प्रासंगिक है, जिसने इसे उत्पन्न किया है, इसलिए इसे एक साझा भंडार में जमा करने से पहले इसे सरल, या अधिक अच्छा बनाया जाना चाहिए।

एक प्रतिबद्ध कुचलने मतलब है, देखने का एक मुहावरेदार बिंदु से, परिवर्तन में पेश स्थानांतरित करने के लिए कहा अपनी मूल में प्रतिबद्ध है, ताकि आप अंत के साथ एक दो (या अधिक) के बजाय प्रतिबद्ध।
यदि आप इस प्रक्रिया को कई बार दोहराते हैं, तो आप किसी एक के लिए n कम कर सकते हैं ।

नेत्रहीन, यदि आपने कमिट स्टार्ट स्टार्ट में अपना काम शुरू किया है , तो आप यही चाहते हैं

गिट स्क्वैश करता है

आप देख सकते हैं कि नई प्रतिबद्ध में नीले रंग की थोड़ी गहरा छाया है। यह जानबूझकर किया गया है।

गेट स्क्वाशिंग में रिबेस के साथ एक विशेष रूप से प्राप्त किया जाता है , जिसे इंटरएक्टिव रिबेस कहा जाता है ।
सरल करते समय जब आप एक शाखा B में कमिट्स का एक सेट रिबेट करते हैं , तो आप उन सभी परिवर्तनों को लागू करते हैं जैसे वे किए गए थे, अपने मूल पूर्वज के बजाय B से शुरू करते हैं।

एक दृश्य सुराग

यहां छवि विवरण दर्ज करें

फिर से नीले रंग के विभिन्न रंगों पर ध्यान दें।

एक इंटरैक्टिव रिबेस आपको यह चुनने देता है कि कैसे कमिट किया जाना चाहिए। यदि आप यह आदेश चलाते हैं:

 git rebase -i branch

आप एक फाइल के साथ समाप्त होंगे जो उन कमिट्स को सूचीबद्ध करता है जो कि रिबेड होंगे

 pick ae3...
 pick ef6...
 pick 1e0...
 pick 341...

मैंने कमिट्स का नाम नहीं दिया था, लेकिन इन चार लोगों को शुरू से हेड तक कमिट करने का इरादा है

इस सूची की अच्छी बात यह है कि यह संपादन योग्य है
आप कमिट कर सकते हैं, या आप उन्हें स्क्वैश कर सकते हैं
आपको बस इतना करना है कि पहले शब्द को स्क्वैश में बदलना है ।

 pick ae3...
 squash ef6...
 squash 1e0...
 squash 341...

यदि आप संपादक को बंद करते हैं और कोई मर्ज विरोध नहीं पाया जाता है, तो आप इस इतिहास को समाप्त करते हैं:

यहां छवि विवरण दर्ज करें

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

git rebase -i HEAD~4

पहले वाले के अलावा सभी कमिट्स को स्क्वैश करने के लिए "कमांड्स" को बदलें , और फिर अपने एडिटर को बंद करें।


इतिहास बदलने के बारे में ध्यान दें

Git में, कमिट्स कभी संपादित नहीं होते हैं। उन्हें छंटनी की जा सकती है, पहुंच योग्य नहीं बनाया जाता, क्लोन किया जाता है लेकिन बदला नहीं जाता है।
जब आप रिबेस करते हैं, तो आप वास्तव में नए कमिट बना रहे होते हैं।
पुराने किसी भी रेफरी द्वारा अब उपलब्ध नहीं हैं, इसलिए इतिहास में नहीं दिखाया गया है लेकिन वे अभी भी वहां हैं!

यह वही है जो आपको वास्तव में रिबास के लिए मिलता है:

यहां छवि विवरण दर्ज करें

यदि आपने पहले ही उन्हें कहीं धकेल दिया है, तो इतिहास को फिर से लिखना वास्तव में एक शाखा बना देगा!


अच्छा - हालांकि मूल प्रतिबद्ध टिप्पणियों का क्या होता है - क्या वे एक बड़ी टिप्पणी में संयुक्त हो जाते हैं या वे खो जाते हैं?
पॉल आर

प्रेषक man git rebase: मुड़ा हुआ प्रतिबद्ध के लिए सुझाया गया संदेश, पहले स्क्वैश और "स्क्वैश" कमांड के कमिट मैसेज का
मार्गरेट ब्लूम

1
यह सबसे अच्छा स्पष्टीकरण है जिसे मैंने रिबासिंग के लिए देखा है, धन्यवाद।
केरी जोन्स

अपनी पहली छवि में स्क्वैशिंग करने के बारे में: क्या आप एक उदाहरण बना सकते हैं, जिसमें स्क्वाडिंग से पहले (लाइट ब्लू) और उसके बाद (डार्क ब्लू) HEAD की एक अलग वर्किंग डायरेक्टरी है? सभी उदाहरणों में मैंने स्क्वाशिंग की कोशिश की जैसे कि उसने START और HEAD के बीच के तीन आवागमन हटा दिए।
वास्तविक_पंडा

@actual_panda मुझे यकीन नहीं है कि मैं अनुसरण करता हूं। HEAD एक कमिट के लिए एक रेफरी है। कमिट स्टोर डेल्टास। वर्किंग डायर सम्पूर्ण के रूप में भंडार का एक गुण है, यह इस बात पर निर्भर करता है कि आपने कौन सा कमिट किया। सामान्य तौर पर, दो रेफ (जैसे HEAD और START) हमेशा चेक आउट करने पर दो अलग-अलग वर्कडायर देते हैं। यदि आप एक ही शाखा पर स्क्वैश को रिबेट करते हैं, तो प्रभाव मध्यवर्ती को "ढीला" करने के लिए है, लेकिन वास्तव में, गिट ने सभी डेल्टाओं के साथ एक नया बना दिया। git diffजो हुआ उसे दिखाने में आप मदद कर सकते हैं।
मार्गरेट ब्लूम

22

रिबेस कमांड में इसके --interactive(या -i) मोड में कुछ भयानक विकल्प उपलब्ध हैं , और व्यापक रूप से उपयोग किए जाने वाले स्क्वैश में से एक है। यह क्या करता है छोटे कमिट करें और उन्हें बड़े लोगों में संयोजित करें, जो उपयोगी हो सकता है यदि आप दिन के काम को लपेट रहे हैं या यदि आप बस अपने परिवर्तनों को अलग तरीके से पैकेज करना चाहते हैं। हम इस पर जाने वाले हैं कि आप इसे आसानी से कैसे कर सकते हैं।

सतर्कता का एक शब्द: केवल यह उन कमिट्स पर करें जो बाहरी रिपॉजिटरी को धक्का नहीं देते हैं। यदि दूसरों ने उन कमिट्स पर आधारित काम किया है, जिन्हें आप हटाने जा रहे हैं, तो बहुत सारे संघर्ष हो सकते हैं। यदि यह दूसरों के साथ साझा किया गया है तो बस अपने इतिहास को फिर से न लिखें।

तो मान लीजिए कि आपने अभी कुछ छोटे-छोटे काम किए हैं, और आप उनमें से एक बड़ा कमिटमेंट करना चाहते हैं। वर्तमान में हमारे भंडार का इतिहास इस तरह दिखता है:

यहां छवि विवरण दर्ज करें

यदि वे एक साथ लिपटे हुए थे, तो पिछले 4 कम्यून्स बहुत अधिक खुश होंगे, तो चलिए इंटरएक्टिव रिबासिंग के माध्यम से करते हैं:

$ git rebase -i HEAD~4

pick 01d1124 Adding license
pick 6340aaa Moving license into its own file
pick ebfd367 Jekyll has become self-aware.
pick 30e0ccb Changed the tagline in the binary, too.

# Rebase 60709da..30e0ccb onto 60709da
#
# 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.
#

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

pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.

मूल रूप से यह Git को सूची में पहली बार आने वाले सभी कमिट को संयोजित करने के लिए कहता है। एक बार ऐसा करने और सहेज लेने के बाद, एक और संपादक निम्नलिखित के साथ पॉप अप करता है:

# This is a combination of 4 commits.
# The first commit's message is:
Adding license

# This is the 2nd commit message:

Moving license into its own file

# This is the 3rd commit message:

Jekyll has become self-aware.

# This is the 4th commit message:

Changed the tagline in the binary, too.

    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # Explicit paths specified without -i nor -o; assuming --only paths...
    # Not currently on any branch.
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #   new file:   LICENSE
    #   modified:   README.textile
    #   modified:   Rakefile
    #   modified:   bin/jekyll
    #

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

Created commit 0fc4eea: Creating license file, and making jekyll self-aware.
 4 files changed, 27 insertions(+), 30 deletions(-)
  create mode 100644 LICENSE
    Successfully rebased and updated refs/heads/master.

और अगर हम इतिहास को फिर से देखें ... यहां छवि विवरण दर्ज करें

तो, यह अब तक एक अपेक्षाकृत दर्द रहित रहा है। यदि आप रिबास के दौरान संघर्षों में भाग लेते हैं, तो वे आमतौर पर हल करने में काफी आसान होते हैं और जीआईटी आपको जितना संभव हो उतना संभव बनाता है। इस की मूल बातें सवाल, git addफ़ाइल में संघर्ष को ठीक करती है , और फिर git rebase --continueप्रक्रिया को फिर से शुरू करेगी। git rebase --abortयदि आप चाहें, तो निश्चित रूप से, आपको अपनी पिछली स्थिति में वापस लाना होगा। यदि किसी कारण से आपने रिबास में एक कमिट खो दिया है, तो आप इसे वापस पाने के लिए रिफ्लॉग का उपयोग कर सकते हैं।

विवरण इस लिंक पर पाया जा सकता है ।


3
धन्यवाद! किसी को भी VIM से असहज होना जितना कि मैं हूं ... जब आप उस बिंदु पर पहुंचते हैं जहां आप संपादित करने के लिए कार्रवाई करते हैं, तो संपादन मोड में प्रवेश करने के लिए 'i' को हिट करें। जब आप बदलावों के साथ काम करते हैं, तो बच निकलते हैं, फिर टाइप करें ": wq" और यह आपको आगे बढ़ाएगा। (मैक)
फ़रासी

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

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