पाठ 22 · इतिहास और एकीकरण
स्थानीय प्रतिबद्धताओं को पुनः व्यवस्थित करें, स्क्वैश करें, पुनः लिखें और छोड़ें
पाँच रफ प्राइवेट कमिट्स को दो साफ़ कमिट्स में बदलें: एक आश्रित फिक्स को स्थानांतरित करें, एक संदेश को दोबारा लिखें, चरणों को मोड़ें और स्क्वैश करें, केवल शोर छोड़ें, और जांचें कि परिणाम में वही फ़ाइलें हैं जो आप चाहते थे।
- स्तर: उन्नत
- 13 मिनट पढ़ा
- 7 मिनट का वीडियो
- अद्यतन किया गया
- इस पाठ से पहले: अप्रकाशित कार्य को नए आधार पर पुनः आधार बनाएँ
प्रगति इस ब्राउज़र में सहेजी गई.
चलाने से YouTube से वीडियो लोड होता है (गोपनीयता-उन्नत मोड)।
आप क्या सीखेंगे
- रीप्ले योजना पढ़ें: सबसे पुराना चरण पहला, ऊपर से नीचे तक लागू।
- सही क्रिया चुनें: रीवर्ड, स्क्वैश, फिक्सअप या ड्रॉप।
- जिस कदम पर वह निर्भर है उसे तोड़े बिना एक कदम आगे बढ़ें।
- बाद में नए कमिट, फ़ाइलें और बचाव शाखा को सत्यापित करें।
शुरू करने से पहले
आपकी शाखा private/signup-polish में पाँच कमिट हैं जो केवल आपके कंप्यूटर पर मौजूद हैं, कमिट एम के शीर्ष पर। कार्य वृक्ष साफ़ है और पाँचवीं कमिट पर rescue/before-polish अंक हैं। क्रम में, सबसे पुराना पहले:
| कदम | प्रतिबद्ध | यह क्या करता है |
|---|---|---|
| सी1 | करतब: साइनअप ड्राफ्ट जोड़ें | साइनअप फॉर्म जोड़ता है |
| सी2 | दस्तावेज़: साइनअप समीक्षा समझाएँ | docs/replay-a.md जोड़ता है |
| सी3 | दस्तावेज़: सत्यापन समझाएँ | docs/replay-b.md जोड़ता है |
| सी4 | फिक्सअप! करतब: साइनअप ड्राफ्ट जोड़ें | प्रपत्र का लेबल ठीक करता है |
| सी5 | घर का काम: अस्थायी नोट | docs/temporary-review.md जोड़ता है |
Everything is local and on the Free plan (GitTree asks you to sign in): no hosting account, no provider, no internet. Every identity is fictional (example.com). Never run this lesson in a real project, and never rewrite commits that other people already have.
परिवर्तन GitTree या मूल Git कमांड के साथ करें, दोनों एक ही प्रतिलिपि पर नहीं। परिणाम पढ़ना हमेशा सुरक्षित होता है. मेनू लेबल 2.0 के स्वयं के स्ट्रिंग्स से आते हैं और मूल कमांड डिस्पोजेबल प्रतियों में Git 2.43 के साथ चलाए गए थे। GitTree चरण macOS, Windows या Linux पर नहीं चलाए गए।
अवधारणा और राज्य प्रभाव
इंटरैक्टिव रीबेस एक योजना है, कोई सॉर्टिंग गेम नहीं। Git सूची के शीर्ष से नीचे तक सूचीबद्ध प्रतिबद्धताओं को आधार पर एक-एक करके दोहराता है, इसलिए सबसे पुराना चरण पहले आता है। प्रत्येक क्रिया Git को बताती है कि एक चरण में क्या करना है:
- Pick प्रतिबद्धता को वैसे ही रखता है।
- Reword अपनी सामग्री रखता है और आपको एक नया संदेश लिखने देता है।
- Squash कमिट को उसके ऊपर रखे कमिट में मोड़ देता है और आपको एक संयुक्त संदेश लिखने देता है।
- Fixup इसे भी मोड़ देता है, लेकिन अपना संदेश दूर फेंक देता है।
- Drop कमिट के बदलाव को पूरी तरह से छोड़ देता है।
आदेश मायने रखता है. एक चरण जो दूसरे पर निर्भर करता है (यहां लेबल फिक्स को C1 से फॉर्म की आवश्यकता होती है) को इसके नीचे रहना चाहिए। संपादक आपको इसे ऊपर ले जाने देगा, और फिर विरोध के साथ रीप्ले रुक जाएगा। GitTree उन योजनाओं को भी अस्वीकार कर देता है जिन्हें Git नहीं चला सकता: एक योजना जो हर प्रतिबद्धता को छोड़ देती है, एक स्क्वैश जिसके ऊपर मोड़ने के लिए कुछ भी नहीं है, और एक खाली संदेश।
प्रत्येक पुनः चलाए गए कमिट को एक नई आईडी मिलती है, क्योंकि उसका मूल बदल जाता है। केवल इस शाखा को फिर से लिखा गया है; बचाव शाखा पुराने पाँच रखती है। जो कमिट पहले से ही रिमोट पर हैं उन्हें "रिमोट पर" के रूप में चिह्नित किया जाता है, और उन्हें दोबारा लिखने के लिए स्पष्ट पुष्टि की आवश्यकता होती है। यह पाठ कभी इसकी पुष्टि नहीं करता.
आप जो योजना बनाएंगे वह पाँच प्रतिबद्धताओं को दो में बदल देगी:
| कदम | प्रतिबद्ध | कार्रवाई | नतीजा |
|---|---|---|---|
| 1 | सी1 | पुनःशब्द | उपलब्धि: स्थानीय साइनअप फॉर्म पूरा करें |
| 2 | सी4 | फिक्सअप | चरण 1 में जोड़ दिया गया |
| 3 | सी3 | उठाओ | रखा हुआ; स्क्वैश लक्ष्य |
| 4 | सी2 | स्क्वैश | दस्तावेज़: साइनअप समीक्षा और सत्यापन समझाएँ |
| 5 | सी5 | गिराओ | चला गया |
सटीक प्रोजेक्ट स्थिति तैयार करें
प्रोजेक्ट की एक अलग सामान्य प्रति से प्रारंभ करें क्योंकि पाठ 18 ने इसे छोड़ दिया है। अपने मूल gittree-features को अछूता छोड़ें। एक नई शाखा पर, एक समय में एक फ़ाइल पर नीचे दिए गए पांच कमिट बनाएं और प्रत्येक पूर्ण बॉडी को केवल उसके नामित चरण पर सहेजें।
पूर्ण फ़ाइल इनपुट
केवल नीचे नामित चरण पर ही सहेजें। ये अंतिम नई लाइन के साथ पूर्ण UTF-8/LF निकाय हैं; कभी भी मार्कडाउन बाड़ चिपकाएँ नहीं। अपरिवर्तित चलने योग्य फ़ाइलें नामित इनपुट प्राप्त करती हैं। अलग-अलग संस्करणों में मूल को अधिलेखित नहीं किया जाना चाहिए।
Index.html - साइन अप करें
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
<section aria-labelledby="signup-title">
<h2 id="signup-title">Try the demo form</h2>
<form id="signup-form" novalidate>
<label for="demo-email">Demo email</label>
<input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
<p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
<button type="submit">Check the address locally</button>
<p id="signup-result" role="status"></p>
</form>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>डॉक्स/रीप्ले-ए.एमडी - DOC_A
# Local signup review
Review the label and hint together.डॉक्स/रीप्ले-b.md - DOC_B
# Local validation review
No address leaves this demonstration.Index.html - SIGNUP_LABEL
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
<section aria-labelledby="signup-title">
<h2 id="signup-title">Try the demo form</h2>
<form id="signup-form" novalidate>
<label for="demo-email">Fictional email address</label>
<input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
<p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
<button type="submit">Check the address locally</button>
<p id="signup-result" role="status"></p>
</form>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>docs/temporary-review.md - DOC_NOISE
Temporary rehearsal note, deliberately dropped.GitTree में
पैलेट को Command+Shift+P (Ctrl+Shift+P पर Ubuntu) से खोलें। कमिट पर कार्रवाई उस कमिट के राइट-क्लिक मेनू का उपयोग करती है।
- जैसा कि अगले भाग में दिखाया गया है, पांच कमिट और बचाव शाखा का निर्माण करें,
private/signup-polishकी जाँच करें और साफ़ करें। नोट एम और पांच विषय। - पांच के ठीक नीचे कमिट एम पर राइट-क्लिक करें और Edit History → Interactive Rebase of the Commits Above… चुनें। संपादक पाँच निजी चरणों के साथ खुलता है, सबसे पुराना पहला।
- Options for this rebase के अंतर्गत Arrange fixup!, squash! and amend! commits सहित सभी तीन विकल्प छोड़ दें। आप फिक्सअप को स्वयं स्थानांतरित कर देंगे.
- C4 पंक्ति पर फ़ोकस करें और Alt+↑ को दो बार दबाएँ, फिर C3 पर फ़ोकस करें और Alt+↑ को एक बार दबाएँ। ऑर्डर अब C1, C4, C3, C2, C5 है। किसी केंद्रित पंक्ति पर p, r, e, s, f या d दबाने पर पिक, रीवर्ड, एडिट, स्क्वैश, फिक्सअप या ड्रॉप सेट हो जाता है।
- C1 को Reword पर सेट करें और इसके संदेश फ़ील्ड में
feat: complete the local signup formटाइप करें। C4 को Fixup पर सेट करें. - C3 को Pick रखें और C2 को Squash पर सेट करें। Squashed commits के अंतर्गत समूह "2 कमिट्स इन डॉक्स: एक्सप्लेन वैलिडेशन" एक संयुक्त संदेश दिखाता है। इसे
docs: explain signup review and validationसे बदलें. - C5 को Drop पर सेट करें. प्रत्येक पंक्ति और संयुक्त संदेश को एक बार फिर पढ़ें। "रिमोट पर" कुछ भी अंकित नहीं है, इसलिए किसी पुष्टि की आवश्यकता नहीं है।
- एक बार Start Rebase चुनें और प्रतीक्षा करें। यदि यह रुक जाता है, तो जारी रखने के लिए बैनर का उपयोग करें; पूरी योजना दोबारा शुरू न करें.
- दो नए कमिट सत्यापित करें, पेज में लेबल फिक्स, दोनों दस्तावेज़ और कोई अस्थायी नोट नहीं।
rescue/before-polishरखें, और कार्य वृक्ष को साफ छोड़ दें।
पाठ्यक्रम में प्रत्येक सामान्य प्रतिबद्धता के लिए: Summary बताया गया विषय है, Description खाली है और विकल्प Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit और Allow Empty Commit बंद रहते हैं।
टर्मिनल में
प्रत्येक पूर्ण निकाय को उसके चरण में सहेजते हुए, एक नई शाखा पर पांच कमिट बनाएं:
git switch --create private/signup-polishSIGNUP को index.html के रूप में सहेजें, फिर:
git add -- index.html
git commit --quiet -m "feat: add signup draft"DOC_A को docs/replay-a.md के रूप में सहेजें, फिर:
git add -- docs/replay-a.md
git commit --quiet -m "docs: explain signup review"DOC_B को docs/replay-b.md के रूप में सहेजें, फिर:
git add -- docs/replay-b.md
git commit --quiet -m "docs: explain validation"SIGNUP_LABEL को index.html के रूप में सहेजें, फिर:
git add -- index.html
git commit --quiet -m "fixup! feat: add signup draft"DOC_NOISE को docs/temporary-review.md के रूप में सहेजें, फिर:
git add -- docs/temporary-review.md
git commit --quiet -m "chore: temporary note"पुराने टिप को सुरक्षित रखें और श्रेणी को सूचीबद्ध करें, सबसे पहले:
git branch rescue/before-polish
BASE_SHA="$(git rev-parse HEAD~5)"
git log --reverse --format=%s "$BASE_SHA"..HEADअब इंटरैक्टिव रीबेस शुरू करें (-i --interactive का संक्षिप्त रूप है)। Git आपके संपादक को कार्य सूची के साथ खोलता है (आपकी आईडी अलग-अलग होंगी):
git rebase --interactive --no-autosquash --no-update-refs --no-autostash "$BASE_SHA"pick 1a2b3c4 feat: add signup draft
pick 2b3c4d5 docs: explain signup review
pick 3c4d5e6 docs: explain validation
pick 4d5e6f7 fixup! feat: add signup draft
pick 5e6f708 chore: temporary noteप्रत्येक पंक्ति की अपनी आईडी रखते हुए, योजना में पाँच पंक्तियों को फिर से लिखें और सहेजें:
reword 1a2b3c4 feat: add signup draft
fixup 4d5e6f7 fixup! feat: add signup draft
pick 3c4d5e6 docs: explain validation
squash 2b3c4d5 docs: explain signup review
drop 5e6f708 chore: temporary noteइसके बाद Git संपादक को दो बार और खोलता है। पुन:शब्द के लिए, संदेश को feat: complete the local signup form से बदलें। स्क्वैश के लिए, यह दोनों संदेश दिखाता है; उन्हें एक पंक्ति, docs: explain signup review and validation से बदलें। परिणाम जांचें:
git rev-list --count "$BASE_SHA"..HEAD
git log --reverse --format=%s "$BASE_SHA"..HEAD
git status --short2
feat: complete the local signup form
docs: explain signup review and validationस्थिति रिक्त है. index.html SIGNUP_LABEL है, दोनों दस्तावेज़ मौजूद हैं और docs/temporary-review.md नहीं हैं।
यदि आप पहली पंक्ति में स्क्वैश डालते हैं, तो Git तुरंत error: cannot 'squash' without a previous commit पर रुक जाता है। सूची को git rebase --edit-todo और git rebase --continue के साथ ठीक करें, या git rebase --abort के साथ छोड़ दें। --autosquash के साथ Git चाल चलता है और fixup! के लिए कार्रवाई आपके लिए प्रतिबद्ध है; यह पाठ योजना दिखाने के लिए इसे बंद कर देता है।
नतीजा
Where you end: एम के ऊपर दो पुनः लिखित प्रतिबद्धताएं, "फीचर: स्थानीय साइनअप फॉर्म को पूरा करें" और "दस्तावेज़: साइनअप समीक्षा और सत्यापन की व्याख्या करें"। पृष्ठ पर लेबल ठीक है, दोनों दस्तावेज़ वहां हैं और अस्थायी नोट नहीं है। पुरानी पाँच प्रतिबद्धताएँ बचाव शाखा द्वारा रखी गई हैं, और कार्य वृक्ष साफ़ है।
सामान्य गलतियाँ
- किसी प्रतिबद्धता को छिपाने के लिए ड्रॉप का उपयोग करना जिसकी आपको आवश्यकता हो सकती है। नये इतिहास में बदलाव बिल्कुल नहीं है.
- किसी फिक्स को उस कमिट के ऊपर ले जाना जिसे वह ठीक करता है।
- पहले चरण को कुचलना, जिसके ऊपर मोड़ने के लिए कुछ भी नहीं है।
- योजना ख़त्म होने के बाद उसे दोबारा शुरू करना, न कि पहले परिणाम की जाँच करना।
अगर कुछ गलत होता है
शुरू करने से पहले, Cancel शाखा को वैसे ही छोड़ दें। यदि GitTree कहता है कि संपादक खुलने के बाद से शाखा बदल गई है, तो संपादक को बंद करें और इसे फिर से खोलें। यदि रिबेस बंद हो जाता है, तो विरोध या संदेश को ठीक करें और बैनर से जारी रखें, या जानबूझकर इसे निरस्त करें। इसके ख़त्म होने के बाद, कुछ भी पुनर्स्थापित करने का प्रयास करने से पहले rescue/before-polish से तुलना करें।
अपनी समझ की जाँच करें
प्रत्येक प्रश्न का उत्तर दें, फिर क्यों पढ़ें। "आवश्यक" चिह्नित प्रश्न पाठ को पूरा करने में गिने जाते हैं।
6 में से 0 सही
पाठ को पूरा करने के लिए आवश्यक प्रश्नों के सही उत्तर दें।
इस ब्राउज़र में चेक किया गया.
अभ्यास करें
योजना C1, C4, C3, C2, C5 और बचे हुए दो संदेशों की व्याख्या करें। पुरानी श्रेणी 5, नई श्रेणी 2, अपेक्षित फ़ाइलें और कोई नोट नहीं जाँचें। फिर अनुमान लगाएं, इसे चलाए बिना, C4 को C1 से ऊपर ले जाना या चरण 1 को कुचलना क्यों काम नहीं कर सकता।
आपकी अपनी पुष्टि: साइट आपका कंप्यूटर नहीं देख सकती।
पाठ को पूरा करने के लिए आवश्यक प्रश्नों के सही उत्तर दें और व्यावहारिक अभ्यास की पुष्टि करें।
पुनर्कथन
- रीप्ले योजना में एक क्रम और निर्भरताएँ होती हैं।
- स्क्वैश आपके संयोजन के लिए दोनों संदेश रखता है; फिक्सअप स्वयं को त्याग देता है।
- ड्रॉप परिवर्तन को स्वयं हटा देता है, इसलिए केवल वास्तविक शोर ही ड्रॉप करें।
संबंधित
शब्दावली शब्द प्रस्तुत किये गये
रिवॉर्ड - إعادة صياغة; स्क्वैश - ضمّ; फिक्सअप - ضمّ مع تجاهل الرسالة; ड्रॉप - إسقاط; पुन:प्ले योजना — अतिरिक्त विवरण.
वीडियो प्रतिलेख
वीडियो का वर्णन, संकेत दर संकेत।
प्रतिलिपि दिखाएँ
- पांच कच्चे कमिट दो साफ कमिट बन जाते हैं, सुरक्षित रूप से.
- इंटरएक्टिव रिबेस एक योजना है: की एक सूची चरण, सबसे पुराना पहला।
- Git सूची को ऊपर से नीचे तक दोबारा चलाता है एक आधार.
- प्रत्येक चरण को एक क्रिया मिलती है: चुनें, पुनः लिखें, स्क्वैश, फिक्सअप या ड्रॉप।
- सबसे पहले, पाँच निजी कमिट बनाएँ और a बचाव शाखा.
- तीन असली काम हैं. एक ठीक है, और एक अस्थायी शोर है.
- उनके नीचे कमिट पर राइट-क्लिक करें, और इतिहास संपादित करें खोलें.
- कमिट्स का इंटरैक्टिव रिबेस चुनें ऊपर.
- संपादक पाँच चरणों को सूचीबद्ध करता है, सबसे पुराने प्रथम.
- तीनों विकल्प छोड़ दें. हम चलेंगे फिक्सअप स्वयं।
- फिक्सअप कमिट के ठीक बाद का है यह ठीक हो जाता है. इसे दो बार ऊपर ले जाएं.
- अब वैलिडेशन नोट को ऊपर ले जाएं समीक्षा नोट.
- अब क्रम है एक, चार, तीन, दो, पांच.
- पहला चरण रीवर्ड पर सेट करें और लिखें नया संदेश.
- फिक्सअप चरण को फिक्सअप पर सेट करें। इसका संदेश फेंक दिया जाता है.
- सत्यापन नोट रखें, और स्क्वैश करें इसमें समीक्षा नोट.
- स्क्वैश दोनों संदेश दिखाता है. एक लिखें जोड़ी के लिए संदेश.
- अस्थायी नोट छोड़ें. इसका परिवर्तन होगा जीवित नहीं रहना.
- प्रत्येक पंक्ति को एक बार फिर से पढ़ें. पर कुछ भी नहीं है दूरस्थ.
- एक बार Start Rebase चुनें, और इसके लिए प्रतीक्षा करें ख़त्म करना.
- ग्राफ़ के ऊपर अब दो कमिट हैं आधार.
- दोनों के पास नई आईडी हैं। पुराने पांच पर हैं बचाव शाखा.
- पेज खोलें: लेबल फिक्स वहां है। द शोर ख़त्म हो गया है.
- अब टर्मिनल में भी यही योजना है गिट रिबेस -आई।
- Git कार्य सूची खोलता है। सबसे पुराना, सबसे पहले चुनने के लिए सेट करें.
- हमारी योजना में पंक्तियों को फिर से लिखें: दोबारा लिखें, फिक्सअप, पिक, स्क्वैश, ड्रॉप।
- Git दो संदेश मांगता है। एक लिखें प्रत्येक के लिए लाइन.
- आधार के ऊपर कमिट की गणना करें: दो।
- विषयों की सूची बनाएं. ये हम दोनों हैं लिखा.
- स्थिति खाली है, और अस्थायी नोट है चला गया.
- इनपुट बदलें: स्क्वैश को पर रखें पहला कदम.
- इसके ऊपर मोड़ने लायक कुछ भी नहीं है, इसलिए गिट ने मना कर दिया.
- या फ़िक्सअप को उसकी प्रतिबद्धता से ऊपर ले जाएँ: किसी विरोध के कारण दोबारा खेलना बंद हो जाता है।
- यदि यह रुक जाए तो इसे ठीक करें और जारी रखें। या निरस्त करें, और कुछ भी नहीं बदलेगा।
- बचाव शाखा अभी भी आपके पास है मूल पाँच प्रतिबद्धताएँ।
- कभी भी ऐसा दोबारा न लिखें जो कोई और करता हो पहले से ही है.
- अभ्यास करें: योजना समझाएं, और कदम क्यों उठाएं कोई स्क्वैश नहीं हो सकता.
- इसके बाद, विलय या ए होने पर विवादों को हल करें रीबेस रुक जाता है.