सामग्री पर जाएं
GitTree

पाठ 32 · पुनर्प्राप्ति

धक्का देने के बाद गलतियों को सुधारें

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

प्रगति इस ब्राउज़र में सहेजी गई.

चलाने से YouTube से वीडियो लोड होता है (गोपनीयता-उन्नत मोड)।

अंग्रेजी कथन · English and Arabic कैप्शन

वीडियो पेज खोलेंयूट्यूब पर देखें

आप क्या सीखेंगे

  • किसी धकेली गई गलती के लिए अतिरिक्त मरम्मत और पुनर्लेखन के बीच चयन करें।
  • बताएं कि पट्टा क्या जांचता है और अपेक्षित प्रतिबद्धता क्यों मायने रखती है।
  • बासी-पट्टा अस्वीकृति की भविष्यवाणी करें और एक टीम के साथी का काम जारी रखें।
  • जानें कि बलपूर्वक धक्का देने से पहले GitTree क्या रखता है।

शुरू करने से पहले

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

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.

परिवर्तन GitTree या मूल Git कमांड के साथ करें, दोनों एक ही प्रतिलिपि में नहीं। परिणाम पढ़ना हमेशा सुरक्षित होता है. मेनू लेबल 2.0 के स्वयं के स्ट्रिंग्स से आते हैं और मूल कमांड डिस्पोजेबल प्रतियों में Git 2.43 के साथ चलाए गए थे। GitTree चरण macOS, Windows या Linux पर नहीं चलाए गए।

अवधारणा और राज्य प्रभाव

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

ए lease बल पुश को सशर्त बनाता है: Git दूरस्थ शाखा को केवल तभी प्रतिस्थापित करता है जब यह अभी भी वहीं इंगित करता है जहाँ आप अपेक्षा करते हैं। --force-with-lease=<ref>:<commit> अपेक्षित प्रतिबद्धता का नाम बताता है। एक बेयर --force-with-lease आपके रिमोट-ट्रैकिंग रेफरी का उपयोग करता है, और एक git fetch उस रेफरी को स्थानांतरित करता है, इसलिए लाने और फिर पुश करने से जो आपने अभी डाउनलोड किया है वह ओवरराइट हो सकता है। GitTree अंतिम बार लाए गए कमिट को पिन करता है, इसे अपने डायलॉग में दिखाता है और बदले गए टिप को refs/ogt/trash के अंतर्गत रखता है।

पट्टा यह तय नहीं करता है कि आप किसी टीम के साथी के काम को अधिलेखित कर सकते हैं या नहीं। यह आपको केवल उस चीज़ को ओवरराइट करने से बचाता है जिसे आपने नहीं देखा है।

सटीक प्रोजेक्ट स्थिति तैयार करें

पाठ 18 के परिणाम की एक अलग सामान्य प्रति से प्रारंभ करें और इसके एकमात्र रिमोट के रूप में एक नया स्थानीय भंडार रखें। RECOVERY_BAD ख़राब स्टाइलशीट है; LEASE_A, LEASE_B और LEASE_REWRITE एक नोट के तीन संस्करण हैं।

पूर्ण फ़ाइल इनपुट

नीचे दी गई प्रत्येक फ़ाइल को ठीक वैसे ही सहेजें जैसा दिखाया गया है: यूटीएफ-8, एलएफ लाइन के अंत और एक अंतिम नई लाइन, मार्कडाउन फेंस लाइनों के बिना। सूचीबद्ध नहीं की गई फ़ाइलें अपनी सामग्री एम से रखती हैं।

शैलियाँ.सीएसएस - RECOVERY_BAD

फ़ाइल अंश · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #f7f8fa;
  --link: #154ab5;
  --line: #bac4d0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font: 1rem/1.6 system-ui, sans-serif;
}

a {
  color: var(--link);
}

.site-header,
main,
footer {
  width: min(68rem, 100% - 2rem);
  margin-inline: auto;
}

.site-header {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 1rem;
}

.hero {
  max-width: 48rem;
  padding-block: 3rem;
}

h1 {
  font-size: clamp(2rem, 5vw, 3.5rem);
  line-height: 1.2;
}

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: 1rem;
}

.feature-card {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: 0.75rem;
  background: var(--surface);
}

section {
  margin-block-end: 2rem;
}

button,
input {
  font: inherit;
}

button,
input {
  padding: 0.5rem 0.75rem;
}

:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

form {
  display: grid;
  max-width: 28rem;
  gap: 0.5rem;
}

डॉक्स/लीज़-नोट.एमडी - LEASE_A

आउटपुट
# Private release rehearsal

The reviewed draft is still private.

डॉक्स/लीज़-नोट.एमडी - LEASE_B

आउटपुट
# Private release rehearsal

Leo added a review that must not be overwritten.

डॉक्स/लीज़-नोट.एमडी - LEASE_REWRITE

आउटपुट
# Private release rehearsal

This alternative draft has not seen Leo's review.

GitTree में

पैलेट को Command+Shift+P (Ctrl+Shift+P पर Ubuntu) से खोलें।

  1. जैसा कि अगले भाग में दिखाया गया है, रिहर्सल बनाएं: ख़राब कमिट को shared पर धकेल दिया गया, और सर्वर पर लियो की नई कमिट वाली शाखा को lease कर दिया गया।
  2. Additive repair. shared पर, खराब कमिट पर राइट-क्लिक करें और Revert Commit चुनें, फिर Push पर क्लिक करें। यह एक सामान्य धक्का है; फ़ोर्स पुश (लीज़ के साथ) न चुनें...
  3. Stale lease. private/lease पर, ड्राफ्ट को स्थानीय रूप से फिर से लिखें ताकि शाखा में अब पुश किए गए कमिट शामिल न हों, और इसे टूलबार Push से पुश करने का प्रयास करें। GitTree पहले पूछता है कि कहां धकेलना है, क्योंकि private/lease किसी अन्य नाम से origin/lease ट्रैक करता है: Push to origin/lease चुनें। "रिमोट ने निजी/लीज से इनकार कर दिया" शीर्षक वाला एक संवाद फिर Fetch Only, Rebase and Push, Merge and Push और Force Push… पेश करता है।
  4. पहले Fetch Only चुनें और ग्राफ़ पढ़ें: दूरस्थ शाखा में अब लियो की प्रतिबद्धता है, जो आपके पुनर्लेखन में शामिल नहीं है। वह टीम के साथी का काम है.
  5. Force Push… खोलें. संवाद "निजी/पट्टे को मूल/पट्टे की ओर धकेलने के लिए बाध्य करें?" यह कहता है कि आपकी शाखा की कमी को रिमोट से दूर कर दिया जाएगा, कि पुश केवल तभी आगे बढ़ता है जब रिमोट अभी भी दिखाए गए कमिट पर है, और प्रतिस्थापित टिप को refs/ogt/trash के अंतर्गत रखा गया है। रद्द करना; सिंह का काम आपकी जगह लेने के लिए नहीं है।
  6. इसके बजाय समाधान करें: Rebase and Push आपके ड्राफ्ट को लियो के ऊपर रखता है, या पहले उससे पूछें। यदि कोई वास्तविक बल धक्का चलता है, तो नोटिस कहता है "बलपूर्वक धक्का दिया गया। प्रतिस्थापित रिमोट टिप को ..." पर रखा गया है, और Undo एक बल धक्का को रिमोट में बदलाव के रूप में मानता है जिसे आप वापस बदलने के लिए फिर से दबाते हैं।

टर्मिनल में

वापसी के बाद, shared पर:

Command · bash
git revert --no-edit "$BAD_SHA"
git push origin HEAD:shared
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?

उत्तर है 0: गलती इतिहास में बनी हुई है और किसी को भी क्लोन की मरम्मत के लिए मजबूर नहीं किया गया।

private/lease पर, लियो की प्रतिबद्धता पहले से ही सर्वर पर है, आपके द्वारा समीक्षा की गई प्रतिबद्धता के साथ पिन किए गए पट्टे का परीक्षण करें:

Command · bash
git push --force-with-lease=refs/heads/lease:"$EXPECTED_SHA" origin HEAD:lease; echo $?
git ls-remote origin refs/heads/lease
git status --short
आउटपुट
 ! [rejected]        HEAD -> lease (stale info)
error: failed to push some refs to '../origin.git'
1

Git ने मना कर दिया ("बासी जानकारी"), सर्वर अभी भी लियो की प्रतिबद्धता का नाम देता है और स्थिति खाली है। जब आपका रिमोट-ट्रैकिंग रेफ पुराना हो तो एक नंगे git push --force-with-lease origin HEAD:lease को भी अस्वीकार कर दिया जाता है, लेकिन git fetch origin lease के बाद वही कमांड लियो की प्रतिबद्धता को बदल देता है, क्योंकि फ़ेच ने उस रेफ को स्थानांतरित कर दिया है जिसकी वह तुलना करता है। आपके द्वारा समीक्षा की गई प्रतिबद्धता का नाम बताएं, या रिबेस के साथ सामंजस्य स्थापित करें।

नतीजा

Where you end: ख़राब कमिट अभी भी shared के इतिहास में है और इसके शीर्ष पर एक रिवर्ट सामान्य रूप से धकेल दिया गया है। lease पर पिन किए गए पुश को अस्वीकार कर दिया गया था, सर्वर अभी भी लियो की प्रतिबद्धता रखता है, और आपका स्थानीय पुनर्लेखन बरकरार है। कोई जोर जबरदस्ती नहीं की गई.

सामान्य गलतियाँ

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

अगर कुछ गलत होता है

यदि किसी बल के धक्के ने गलत टिप को प्रतिस्थापित कर दिया है, तो प्रतिस्थापित कमिट को refs/ogt/trash के अंतर्गत रखा जाता है (और, मूल धक्का के लिए, आपके रीफ्लॉग और टीम के साथी के क्लोन में)। टीम के साथी को बताएं, टिप को एक शाखा के रूप में पुनर्स्थापित करें और अपनी सहमति से इसे फिर से आगे बढ़ाएं। एक अस्वीकृत धक्का से कुछ नहीं बदला।

अपनी समझ की जाँच करें

प्रत्येक प्रश्न का उत्तर दें, फिर क्यों पढ़ें। "आवश्यक" चिह्नित प्रश्न पाठ को पूरा करने में गिने जाते हैं।

  1. प्रश्न 1 में से 6

    साझा शाखा पर पहले से ही एक ख़राब प्रतिबद्धता मौजूद है। सबसे सुरक्षित मरम्मत कौन सी है?

    एक उत्तर चुनें.

  2. प्रश्न 2 में से 6

    इनमें से कौन सा --force-with-lease के बारे में सत्य है? (बहुविकल्पी)

    लागू होने वाला प्रत्येक उत्तर चुनें.

  3. प्रश्न 3 में से 6
    आवश्यक

    आपने समीक्षा की गई प्रतिबद्धता पर पट्टे को पिन करके धक्का दिया, लेकिन लियो ने उसके बाद धक्का दिया। क्या होता है?

    एक उत्तर चुनें.

  4. प्रश्न 4 में से 6

    इनपुट बदलें: आप git fetch origin lease चलाते हैं और फिर एक खाली git push --force-with-lease origin HEAD:lease चलाते हैं। क्या होता है?

    एक उत्तर चुनें.

  5. प्रश्न 5 में से 6
    आवश्यक

    एक सहकर्मी का कहना है, "फोर्स-विद-लीज फोर्स पुशिंग को सभी के लिए सुरक्षित बनाता है"। सही उत्तर क्या है?

    एक उत्तर चुनें.

  6. प्रश्न 6 में से 6
    आवश्यक

    पिन किए गए पुश के बाद, कौन से रीडबैक दिखाते हैं कि कुछ भी नहीं खोया गया? (बहुविकल्पी)

    लागू होने वाला प्रत्येक उत्तर चुनें.

6 में से 0 सही

पाठ को पूरा करने के लिए आवश्यक प्रश्नों के सही उत्तर दें।

इस ब्राउज़र में चेक किया गया.

अभ्यास करें

shared पर पूर्वजों की जांच, पिन किए गए पुश के निकास कोड और संदेश, lease के लिए कमिट ls-remote दिखाता है, और क्या एक नंगे पट्टे को लाने से पहले और बाद में अस्वीकार कर दिया गया होगा, इसकी रिपोर्ट करें।

आपकी अपनी पुष्टि: साइट आपका कंप्यूटर नहीं देख सकती।

पाठ को पूरा करने के लिए आवश्यक प्रश्नों के सही उत्तर दें और व्यावहारिक अभ्यास की पुष्टि करें।

पुनर्कथन

  • दूसरों की किसी भी चीज़ के लिए नई प्रतिबद्धता को प्राथमिकता दें।
  • आपके द्वारा समीक्षा की गई प्रतिबद्धता पर पट्टे को पिन करें।
  • पट्टा आपकी रक्षा करता है, आपके साथी के इरादे की नहीं।

शब्दावली शब्द प्रस्तुत किये गये

पट्टा - قفل; बासी जानकारी - معلومات قديمة; प्रतिस्थापित टिप - الرأس المستبدَل.

वीडियो प्रतिलेख

वीडियो का वर्णन, संकेत दर संकेत।

प्रतिलिपि दिखाएँ
  1. आपने गलती कर दी. अब क्या?
  2. यदि दूसरों की प्रतिबद्धता हो, तो उसे सुधारें एक कमिट जोड़कर.
  3. एक पट्टा कहता है: रिमोट को केवल तभी बदलें यह अभी भी वहीं है जहां मैं उम्मीद करता हूं।
  4. लेकिन एक भ्रूण क्या नंगे पट्टे पर चलता है उम्मीद है.
  5. एक स्थानीय सर्वर पर दो शाखाएँ: साझा, और पट्टा.
  6. साझा करने पर, ख़राब प्रतिबद्धता वापस करें।
  7. सामान्य रूप से धक्का दें. कोई बल नहीं.
  8. गलती इतिहास में रहती है, किसी में नहीं एक क्लोन की मरम्मत करनी होगी.
  9. पट्टे पर, एक पुनः लिखित शाखा से इनकार कर दिया जाता है।
  10. केवल लाओ, और देखो. लियो की प्रतिबद्धता है वहाँ.
  11. यह तभी आगे बढ़ता है जब रिमोट चालू होता है यह प्रतिबद्ध है, और पुरानी टिप रखता है।
  12. सिंह का काम आपकी जगह लेने के लिए नहीं है। पुनः आधार उस पर, या उससे पूछें।
  13. टर्मिनल में, पूर्वज की जाँच करें साझा शून्य है.
  14. आपके द्वारा समीक्षा की गई प्रतिबद्धता का नाम बताएं। गिट कहते हैं बासी जानकारी.
  15. सर्वर अभी भी लियो की प्रतिबद्धता का नाम देता है।
  16. एक लाने के बाद एक नंगे पट्टे होगा इसे बदल दिया.
  17. पूर्ववत करने से a पर बल का धक्का उलट नहीं जाता है सर्वर.
  18. अभ्यास: निकास कोड, सर्वर की रिपोर्ट करें प्रतिबद्ध, और स्थिति।
  19. इसके बाद, एक साथ दो शाखाओं पर काम करें कार्यवृक्ष.