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

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

साझा इतिहास में परिवर्तन पूर्ववत करें

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

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

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

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

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

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

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

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

आप पाठ 18 के परिणाम एम से एक शाखा, shared/dark-regression पर हैं। इसकी अंतिम प्रतिबद्धता, "शैली: रिहर्सल कंट्रास्ट रिग्रेशन का परिचय दें", styles.css, body { color: #f7f8fa; } में एक नियम जोड़ता है, जो पृष्ठ पाठ को पृष्ठभूमि के समान हल्के रंग में बदल देता है। वह कमिट पहले से ही आपके द्वारा इस पाठ के लिए सेट किए गए स्थानीय सर्वर पर है, इसलिए किसी टीम के साथी के पास यह हो सकता है। आप चाहते हैं कि पाठ को बिना कुछ दोबारा लिखे दोबारा पढ़ने योग्य बनाया जाए जो दूसरों के पास पहले से मौजूद है।

Everything is local and on the Free plan (GitTree asks you to sign in): no hosting account, no provider, no internet. The server is a local bare repository, not GitHub. 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 पर नहीं चलाए गए।

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

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

यहां नई कमिट का पैरेंट ख़राब कमिट है, और फ़ाइल बिल्कुल वैसी ही समाप्त होती है जैसी पहले थी। शाखा एक प्रतिबद्धता से आगे बढ़ती है और सर्वर इसे एक साधारण धक्का के साथ स्वीकार करता है, क्योंकि यह केवल वही जोड़ता है जो वहां है।

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

केवल वर्तमान शाखा को ही प्रतिबद्धता मिलती है। जब तक आप धक्का नहीं देते तब तक कुछ भी नहीं हिलता।

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

पाठ 18 के परिणाम एम की एक अलग सामान्य प्रति से प्रारंभ करें और अपनी मूल प्रति को अछूता छोड़ दें। शाखा बनाएं, DOC_DARK_BAD को styles.css पर सहेजें और इसे प्रतिबद्ध करें, कॉपी के बगल में एक नया खाली खाली भंडार बनाएं, इसे rehearsal नामक रिमोट के रूप में जोड़ें और शाखा को इसके अपस्ट्रीम से पुश करें। CSS_RESTORED वही है जो फ़ाइल को रिवर्ट के बाद दिखनी चाहिए।

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

केवल नीचे नामित चरण पर ही सहेजें। ये अंतिम नई लाइन के साथ पूर्ण UTF-8/LF निकाय हैं; कभी भी मार्कडाउन बाड़ चिपकाएँ नहीं। अपरिवर्तित चलने योग्य फ़ाइलें नामित इनपुट प्राप्त करती हैं। अलग-अलग संस्करणों में मूल को अधिलेखित नहीं किया जाना चाहिए।

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

फ़ाइल अंश · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --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;
}

body { color: #f7f8fa; }

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

फ़ाइल अंश · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --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;
}

GitTree में

पैलेट को Command+Shift+P (Ctrl+Shift+P पर Ubuntu) से खोलें। कमिट पर कार्रवाई उस कमिट के राइट-क्लिक मेनू का उपयोग करती है।

  1. जैसा कि अगले भाग में दिखाया गया है, शाखा, कमिट और स्थानीय सर्वर बनाएं। shared/dark-regression को चेक आउट रखें और कार्य वृक्ष को साफ रखें।
  2. ग्राफ़ में ख़राब कमिट का चयन करें और उसका विवरण पढ़ें: एक बदला हुआ पथ, styles.css, और एक जोड़ी गई पंक्ति।
  3. इसे राइट-क्लिक करें और Revert Commit चुनें। यह उस शाखा पर तुरंत लागू होता है जिस पर आप हैं; कोई संदेश संपादक नहीं है. नोटिस में लिखा है, "वापस कर दिया गया।" यदि इसके बजाय यह बंद हो जाता है, तो बैनर "रिवर्टिंग... ऑन शेयर्ड/डार्क-रिग्रेशन" ऑफर करता है Resolve, Continue और Abort…।
  4. नई प्रतिबद्धता का चयन करें. इसका विषय Revert "style: introduce the rehearsal contrast regression" है और इसका जनक खराब प्रतिबद्धता है। ख़राब प्रतिबद्धता अभी भी ग्राफ़ में है।
  5. styles.css खोलें: यह CSS_RESTORED है, बिना किसी अतिरिक्त नियम के।
  6. टूलबार Push पर क्लिक करें. यह शाखा का उसके ऊपर की ओर एक सामान्य धक्का है; फ़ोर्स पुश (लीज़ के साथ) न चुनें... नोटिस में कहा गया है, "पुश शेयर्ड/डार्क-रिग्रेशन टू रिहर्सल/शेयर्ड/डार्क-रिग्रेशन।"
  7. परिणाम की जाँच करें: कार्य वृक्ष साफ़ है, दोनों कमिट ग्राफ़ में हैं और सर्वर शाखा नई कमिट पर है।

यदि आप किसी मर्ज कमिट पर राइट-क्लिक करते हैं, तो Revert Commit First parent (the branch merged into) और Second parent (the branch merged in) के साथ "रिवर्ट मर्ज ..." खोलता है। इसे यहाँ मत चलाओ.

पाठ्यक्रम में प्रत्येक सामान्य प्रतिबद्धता के लिए: Summary बताया गया विषय है, Description खाली है और विकल्प Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit और Allow Empty Commit बंद रहते हैं।

टर्मिनल में

पाठ 18 के परिणाम की एक अलग प्रति में:

Command · bash
git switch --create shared/dark-regression

DOC_DARK_BAD को styles.css के रूप में सहेजें, फिर:

Command · bash
git add -- styles.css
git commit --quiet -m "style: introduce the rehearsal contrast regression"
BAD_SHA="$(git rev-parse HEAD)"
git init --quiet --bare --initial-branch=main ../gittree-revert-origin.git
git remote add rehearsal ../gittree-revert-origin.git
git push --quiet --set-upstream rehearsal shared/dark-regression

अब परिणाम वापस करें, प्रकाशित करें और पढ़ें:

Command · bash
git revert --no-edit "$BAD_SHA"
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?
git log -1 --format=%s
git push --quiet rehearsal shared/dark-regression
git status --short
git ls-remote --heads rehearsal refs/heads/shared/dark-regression
git rev-parse HEAD
आउटपुट
0
Revert "style: introduce the rehearsal contrast regression"

पूर्वज चेक 0 प्रिंट करता है: ख़राब कमिट अभी भी HEAD के पीछे है। styles.css CSS_RESTORED है, स्थिति खाली है, और ls-remote और rev-parse से दो आईडी बराबर हैं। कोई बल विकल्प शामिल नहीं था. एक अलग प्रतिलिपि में जहां बाद में एक ही पंक्ति को संपादित किया जाता है, git revert "CONFLICT (सामग्री)" और संकेत git revert --continue और git revert --abort के साथ रुकता है। और git revert मर्ज कमिट पर "एक मर्ज है लेकिन कोई -एम विकल्प नहीं दिया गया था" कहकर मना कर देता है; -m 1 पहले माता-पिता को चुनता है।

नतीजा

Where you end: shared/dark-regression के पास एक नया कमिट है जो खराब कमिट को रद्द कर देता है। पृष्ठ CSS_RESTORED का उपयोग करता है, ख़राब कमिट अभी भी इतिहास में है, सर्वर शाखा नई कमिट पर है, कार्य वृक्ष साफ़ है और कुछ भी बाध्य नहीं किया गया है।

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

  • दूसरों के पास पहले से मौजूद प्रतिबद्धता को "हटाने" के लिए रीसेट और फ़ोर्स पुश का उपयोग करना।
  • लॉग से ख़राब प्रतिबद्धता गायब होने की उम्मीद करना।
  • जानबूझ कर किसी मर्ज को उसके पैरेंट को चुने बिना वापस करना।
  • इससे पहले कि आप फ़ाइल को देखें, पुश करने पर रिवर्ट बाईं ओर आ गया।

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

यदि विरोध के कारण वापसी बंद हो जाती है, तो बैनर पढ़ें। Resolve और Continue इसे पाठ 23 के अनुसार समाप्त करें; Abort… शाखा को वहीं लौटा देता है जहां वह थी। यदि समाप्त होने के बाद रिवर्ट स्वयं एक गलती थी, तो रिवर्ट को वापस लाएँ: यह सिर्फ एक और प्रतिबद्धता है।

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

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

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

    खराब प्रतिबद्धता पर रिवर्ट क्या करता है?

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

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

    वापसी के बाद, इनमें से कौन सा सत्य है?

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

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

    आप खराब प्रतिबद्धता को वापस लाते हैं और सामान्य रूप से आगे बढ़ते हैं। उसके बाद सर्वर शाखा कहाँ है?

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

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

    इनपुट बदलें: बाद वाला कमिट उसी पंक्ति को संपादित करता है जिसे ख़राब कमिट ने जोड़ा था, और फिर आप ख़राब कमिट को वापस कर देते हैं। क्या होता है?

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

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

    आप मर्ज कमिट को पूर्ववत करने का प्रयास करते हैं और Git कहता है "एक मर्ज है लेकिन कोई -m विकल्प नहीं दिया गया"। क्या चल रहा है, और आप क्या करते हैं?

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

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

    रिवर्ट और पुश के बाद, कौन से रीडबैक दिखाते हैं कि उसने वही किया जो पाठ कहता है?

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

6 में से 0 सही

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

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

अभ्यास करें

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

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

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

पुनर्कथन

  • रिवर्ट एक कमिट जोड़ता है जो दूसरे को रद्द कर देता है।
  • इतिहास रहता है; फ़ाइल वापस चली जाती है.
  • एक सामान्य धक्का ही काफी है.

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

वापसी - عكس; उलटा परिवर्तन - تغيير معاكس; मेनलाइन पेरेंट - الأب الرئيسي।

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

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

प्रतिलिपि दिखाएँ
  1. उस परिवर्तन को पूर्ववत करें जो अन्य लोग पहले ही कर चुके हैं है.
  2. रीसेट शाखा को पीछे ले जाता है। रिवर्ट एक जोड़ता है इसके बजाय नई प्रतिबद्धता।
  3. दूसरों के पास पहले से ही पुरानी प्रतिबद्धता है। वापस करें उनकी प्रति को वैध छोड़ देता है।
  4. ख़राब प्रतिबद्धता के साथ साझा शाखा बनाएँ, और एक स्थानीय सर्वर जिसके पास यह है।
  5. ग्राफ़ एम दिखाता है, और खराब प्रतिबद्धता दिखाता है शीर्ष.
  6. ख़राब कमिट एक पंक्ति और पाठ जोड़ता है पीला पड़ जाता है.
  7. इसकी आईडी लिखिए.
  8. इसे राइट-क्लिक करें, और रिवर्ट कमिट चुनें।
  9. यह तुरंत लागू होता है. कोई संदेश नहीं है संपादक.
  10. नोटिस में कहा गया है कि वापस कर दिया गया।
  11. नई कमिट का नाम पुरानी कमिट के नाम पर रखा गया है।
  12. इसका जनक बुरी प्रतिबद्धता है. कुछ भी नहीं था हटा दिया गया.
  13. फ़ाइल वैसी ही वापस आ गई है जैसी वह थी। पीला नियम चला गया.
  14. और ग्राफ़ दोनों प्रतिबद्धताओं को दर्शाता है। द इतिहास केवल बढ़ता गया।
  15. केवल यही शाखा हिली। कुछ भी नहीं है अभी तक प्रकाशित.
  16. शाखा एक प्रतिबद्ध से आगे है सर्वर.
  17. पुश पर क्लिक करें. यह एक सामान्य धक्का है.
  18. नोटिस में शाखा और का नाम दिया गया है सर्वर.
  19. किसी बल की आवश्यकता नहीं थी. पुश ने केवल एक जोड़ा प्रतिबद्ध.
  20. टर्मिनल में, बिना किसी संपादन के git रिवर्ट वैसा ही करता है.
  21. ख़राब प्रतिबद्धता अभी भी पूर्वज है. द उत्तर शून्य है.
  22. और विषय की शुरुआत रिवर्ट से होती है.
  23. पुश करें, फिर सर्वर की आईडी की तुलना करें सिर. वे समान हैं.
  24. इनपुट बदलें: किसी ने इसे संपादित किया है लाइन बाद में.
  25. विरोध के साथ वापसी रुक जाती है। समाधान करें और जारी रखें, या निरस्त करें।
  26. किसी मर्ज को वापस करने के लिए अभिभावक की आवश्यकता होती है। आमतौर पर यह पहला होता है.
  27. किसी मर्ज को वापस लाने के बाद उसे मर्ज करना शाखा फिर कुछ नहीं कर सकती.
  28. अभ्यास: विषय की रिपोर्ट करें, माता-पिता, पूर्वजों की जांच और सर्वर आईडी।
  29. इसके बाद, रीफ्लॉग के साथ खोई हुई कमिट ढूंढें।