पाठ 31 · पुनर्प्राप्ति
अलग काम रखें और एक अनाथ इतिहास शुरू करें
अलग किए गए HEAD को छोड़ने से पहले उस पर किए गए कमिट को नाम दें, फिर एक अलग कॉपी में एक अनाथ शाखा शुरू करें और देखें कि यह क्या हटाता है और क्या रखता है।
- स्तर: इंटरमीडिएट
- 12 मिनट पढ़ा
- 5 मिनट का वीडियो
- अद्यतन किया गया
- इस पाठ से पहले: एक फीचर शाखा बनाएं और केवल डिस्पोजेबल रेफरी को रिटायर करें, रीफ्लॉग के साथ खोई हुई कमिट ढूंढें
प्रगति इस ब्राउज़र में सहेजी गई.
चलाने से YouTube से वीडियो लोड होता है (गोपनीयता-उन्नत मोड)।
आप क्या सीखेंगे
- संलग्न, अनासक्त और अजन्मे सिर को अलग बताओ।
- एक शाखा को एक अलग कमिट पर रखें ताकि वह पहुंच योग्य बनी रहे।
- भविष्यवाणी करें कि एक अनाथ शाखा ट्रैक की गई फ़ाइलों, अनट्रैक की गई फ़ाइलों और पुरानी शाखा के साथ क्या करती है।
- स्थानीय परिवर्तनों के कारण चेकआउट से इनकार पढ़ें।
शुरू करने से पहले
पाठ 18 के परिणाम एम की दो डिस्पोजेबल प्रतियां। पहले में, आप शाखा के बजाय स्वयं कमिट एम की जांच करते हैं, वहां एक छोटा स्टाइलशीट परिवर्तन करते हैं, और इसे रखना चाहते हैं। दूसरे में, आप main को छुए बिना केवल दस्तावेज़ीकरण शाखा के लिए एक बिल्कुल नया, असंबंधित इतिहास चाहते हैं।
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 पर नहीं चलाए गए।
अवधारणा और राज्य प्रभाव
HEAD आम तौर पर एक शाखा का नाम देता है, और कमिटिंग उस शाखा को आगे बढ़ाती है। जब HEAD किसी कमिट को सीधे नाम देता है तो यह detached होता है: एक नया कमिट वास्तविक होता है, लेकिन कोई भी इसे नाम नहीं देता है, इसलिए स्विच करने से यह केवल रीफ्लॉग के माध्यम से पहुंच योग्य हो जाता है। उस पर एक शाखा लगाने से वह ठीक हो जाता है। जब तक आप नहीं चुनते, एक शाखा बनाने से उस पर स्विच नहीं होता।
एक orphan शाखा भिन्न है. HEAD एक ऐसी शाखा का नाम देता है जिसकी अभी तक कोई प्रतिबद्धता नहीं है (एक अजन्मी शाखा)। इसकी पहली प्रतिबद्धता का कोई अभिभावक नहीं है, इसलिए यह main के साथ कोई इतिहास साझा नहीं करता है। Git ट्रैक की गई फ़ाइलों को कार्यशील फ़ोल्डर से हटा देता है; ट्रैक न की गई और उपेक्षित फ़ाइलें बनी रहती हैं। यदि पुराने .gitignore को ट्रैक किया गया था, तो उसके नियम उसके साथ चलते हैं, और जिन फ़ाइलों को उसने अनदेखा किया था, वे अब ट्रैक न किए गए के रूप में दिखाई दे सकती हैं। आपकी पुरानी शाखा हर प्रतिबद्धता रखती है।
दोनों स्थितियाँ सामान्य हैं, क्षति नहीं। चेकआउट तब अस्वीकार कर दिया जाता है जब वह स्थानीय परिवर्तनों को अधिलेखित कर देता है; कुछ भी नहीं खोया है.
सटीक प्रोजेक्ट स्थिति तैयार करें
पाठ 18 के परिणाम की दो अलग-अलग सामान्य प्रतियों से प्रारंभ करें और अपनी मूल प्रति को अछूता छोड़ दें। नीचे दिए गए निकाय बेसलाइन स्टाइलशीट (BASE_CSS), चौड़ा एक (LAYOUT), एक गंदा संपादन (DIRTY_LAYOUT), अनाथ का रीडमी (ORPHAN_README), एक स्थानीय नोट (LOCAL_NOTE) और एक अनदेखा नोट (IGNORED_NOTE) हैं।
पूर्ण फ़ाइल इनपुट
प्रत्येक पूर्ण UTF-8/LF बॉडी को केवल उसके बताए गए चरण में, अंतिम न्यूलाइन के साथ और मार्कडाउन बाड़ के बिना सहेजें। BASE_CSS विरासत में मिला 48rem संदर्भ है; लेआउट 52रेम कमिट है; DIRTY_LAYOUT एक अलग अनस्टेज्ड 56रेम रीप्ले है। दो नोट फ़ाइलें केवल उत्तरजीवी संस्करण की हैं। अपरिवर्तित मुख्य फ़ाइलें संपूर्ण L018/M इनपुट प्राप्त करती हैं।
शैलियाँ.सीएसएस - BASE_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;
}स्टाइल्स.सीएसएस - लेआउट
: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: 52rem;
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;
}शैलियाँ.सीएसएस - DIRTY_LAYOUT
: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: 56rem;
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;
}README.md - ORPHAN_README
# GitTree Features documentation
This branch contains a documentation-only history for the fictional course project.
The landing page remains on main; no form submits information to a server.
Keep useful detached experiments under a branch name before switching away.local-review.txt — LOCAL_NOTE
Local rehearsal note; preserve this file.रिपोर्ट/पूर्वावलोकन.txt — IGNORED_NOTE
Ignored rehearsal preview; preserve these bytes.GitTree में
पैलेट को Command+Shift+P (Ctrl+Shift+P पर Ubuntu) से खोलें।
- पहली प्रति में, ग्राफ़ में कमिट एम पर राइट-क्लिक करें और Check Out This Commit चुनें। शाखा पिकर पर लिखा है "डिटैच्ड एट..." और ग्राफ़ HEAD, detached दिखाता है।
- LAYOUT को
styles.cssके रूप में सहेजें, उस फ़ाइल को चरणबद्ध करें और इसे सारांशstyle: widen the hero reading measureके साथ प्रतिबद्ध करें। जब आप काम करते हैं तो पैनल "एक अलग सिर पर" परिवर्तन की गणना करता है। - नई कमिट पर राइट-क्लिक करें और Create Branch Here… चुनें। इसे नाम दें
experiment/layout, इसे जांचने का विकल्प बंद छोड़ दें और Create Branch चुनें। नोटिस में लिखा है, "प्रयोग/लेआउट बनाया गया।" और HEAD अभी भी अलग है। experiment/layoutलेबल पर राइट-क्लिक करें और Check Out Branch चुनें। HEAD फिर से जुड़ा हुआ है,styles.cssलेआउट है औरmainअभी भी M पर इंगित करता है।- Dirty checkout. दूसरी प्रतिलिपि में,
experiment/layoutपर अलग करें, बिना कमिट किएstyles.cssको DIRTY_LAYOUT में संपादित करें औरmainको जांचने का प्रयास करें। संवाद "स्थानीय परिवर्तन मुख्य के रास्ते में हैं" फ़ाइल को सूचीबद्ध करता है और Commit First, Stash and Switch और Discard and Switch प्रदान करता है। रद्द करें चुनें; त्यागने से एक प्रतिrefs/ogt/trashके अंतर्गत रहती है लेकिन यहां इसकी आवश्यकता नहीं है। - Orphan. दूसरी प्रति में, एक साफ़ वर्क ट्री के साथ, पैलेट से Create Orphan Branch… चलाएँ। "में एक अनाथ शाखा बनाएँ...?"
orphan-docsटाइप करें. संवाद बताता है कि कितनी ट्रैक की गई फ़ाइलें कार्यशील फ़ोल्डर को छोड़ देती हैं, कि ट्रैक न की गई और अनदेखा की गई फ़ाइलें बनी रहती हैं, और पुरानी प्रतिबद्धता कोrefs/ogt/trashके अंतर्गत रखा जाता है। कैंसल पर फोकस है। Create Orphan Branch चुनें. - नोटिस में कहा गया है, "नई अनाथ शाखा अनाथ-डॉक्स पर स्विच किया गया। पूर्ववत करें वापस स्विच करता है।" फ़ोल्डर में कोई ट्रैक की गई फ़ाइलें नहीं हैं और ग्राफ़ नई शाखा पर कोई प्रतिबद्धता नहीं दिखाता है। ORPHAN_README से
README.mdबनाएं, इसे चरणबद्ध करें और सारांशdocs: start the separate project guideके साथ इसे प्रतिबद्ध करें। नई प्रतिबद्धता का कोई अभिभावक नहीं है। - तुलना करें:
mainके पास अभी भी हर प्रतिबद्धता है; अनाथ शाखा एक अलग जड़ है. किसी भी कॉपी को आगे न बढ़ाएं.
पाठ्यक्रम में प्रत्येक सामान्य प्रतिबद्धता के लिए: Summary बताया गया विषय है, Description खाली है और विकल्प Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit और Allow Empty Commit बंद रहते हैं।
टर्मिनल में
पहली प्रति में:
BASE_SHA="$(git rev-parse main)"
git switch --detach "$BASE_SHA"
git symbolic-ref --quiet --short HEAD; echo $?अंतिम कमांड प्रिंट करता है 1: HEAD कोई शाखा नहीं है। लेआउट को styles.css के रूप में सहेजें, फिर:
git commit --quiet -am "style: widen the hero reading measure"
git branch experiment/layout
git symbolic-ref --quiet --short HEAD; echo $?
git rev-parse HEAD^ main
git switch --quiet experiment/layout
git symbolic-ref --short HEAD
git status --short1
experiment/layoutक्रिएटिंग कमांड HEAD संलग्न नहीं करता है (दूसरी क्वेरी अभी भी 1 प्रिंट करती है), rev-parse से दो आईडी बराबर (एम) हैं, और स्थिति खाली है। experiment/layout पर अलग की गई एक अन्य प्रति में, styles.css संपादित करें और git switch main चलाएँ: Git "निम्न फ़ाइलों में आपके स्थानीय परिवर्तन चेकआउट द्वारा अधिलेखित कर दिए जाएंगे" कहकर मना कर देता है और फ़ाइल अछूती रहती है।
दूसरी प्रति में, एक साफ़ पेड़ के साथ:
git switch --orphan orphan-docs
git symbolic-ref --short HEAD
git rev-parse --verify --quiet HEAD; echo $?
git ls-filesorphan-docs
1शाखा मौजूद है लेकिन इसमें कोई प्रतिबद्धता नहीं है (rev-parse निकास 1) और ls-files कुछ भी प्रिंट नहीं करता है। ट्रैक की गई फ़ाइलें फ़ोल्डर से चली गई हैं, जबकि local-review.txt और reports/ वहीं रहती हैं और अब अनट्रैक के रूप में दिखाई देती हैं। README.md बनाएं, फिर:
git add -- README.md
git commit --quiet -m "docs: start the separate project guide"
git ls-tree -r --name-only HEAD
git rev-list --max-parents=0 --count HEAD
git merge-base --all main orphan-docs; echo $?README.md
1
1नई शाखा में एक रूट कमिट है और कोई सामान्य पूर्वज नहीं है, main (merge-base कुछ भी प्रिंट नहीं करता है और 1 से बाहर निकलता है)।
नतीजा
Where you end: अलग किए गए कमिट को नाम दिया गया है experiment/layout और चेक आउट किया गया, main अभी भी एम पर इंगित करता है और पेड़ साफ है। ऑर्फ़न कॉपी में एक रूट कमिट के साथ orphan-docs है जिसका कोई पैरेंट नहीं है, पुरानी ट्रैक की गई फ़ाइलें फ़ोल्डर से चली गई हैं लेकिन main द्वारा रखी गई हैं, और कुछ भी पुश नहीं किया गया है।
सामान्य गलतियाँ
- एक अलग HEAD पर प्रतिबद्ध होना और बिना किसी शाखा के स्विच करना, जिससे कमिट केवल रीफ्लॉग के माध्यम से पहुंच योग्य हो जाती है।
Create Branch Here…के नई शाखा में स्थानांतरित होने की उम्मीद है।- अप्रतिबद्ध ट्रैक किए गए परिवर्तनों के साथ एक अनाथ शाखा प्रारंभ करना, या यह सोचना कि यह
mainहटा देता है। - यह मानते हुए कि जिस फ़ाइल को अनदेखा किया गया था वह उसके
.gitignoreफ़ोल्डर को छोड़ने के बाद भी अनदेखा रहती है।
अगर कुछ गलत होता है
यदि आपने कोई अलग कमिट बिना नाम के छोड़ दी है, तो रीफ्लॉग खोलें (पाठ 29) और उस पर एक शाखा डालें। यदि एक अनाथ शाखा में कोई गलती थी, तो Undo वापस स्विच हो जाता है जबकि नई शाखा में कोई प्रतिबद्धता नहीं होती है; अन्यथा main दोबारा जांचें। अस्वीकृत चेकआउट से कुछ नहीं बदला।
अपनी समझ की जाँच करें
प्रत्येक प्रश्न का उत्तर दें, फिर क्यों पढ़ें। "आवश्यक" चिह्नित प्रश्न पाठ को पूरा करने में गिने जाते हैं।
6 में से 0 सही
पाठ को पूरा करने के लिए आवश्यक प्रश्नों के सही उत्तर दें।
इस ब्राउज़र में चेक किया गया.
अभ्यास करें
रिपोर्ट करें कि प्रत्येक राज्य में HEAD कहाँ इंगित करता है (शाखा, अलग, अजन्मा), अलग की गई प्रतिबद्धता की आईडी और उस पर शाखा, और अनाथ शाखा पर क्या git ls-files छपा है। फिर भविष्यवाणी करें कि जब .gitignore चला जाए तो उपेक्षित फ़ाइल का क्या होगा।
आपकी अपनी पुष्टि: साइट आपका कंप्यूटर नहीं देख सकती।
पाठ को पूरा करने के लिए आवश्यक प्रश्नों के सही उत्तर दें और व्यावहारिक अभ्यास की पुष्टि करें।
पुनर्कथन
- एक अलग प्रतिबद्धता को पहुंच योग्य बने रहने के लिए एक शाखा की आवश्यकता होती है।
- एक अनाथ शाखा एक अलग रूट शुरू करती है और ट्रैक की गई फ़ाइलों को फ़ोल्डर से हटा देती है।
- अस्वीकृत चेकआउट आपके संपादन की सुरक्षा करता है।
संबंधित
शब्दावली शब्द प्रस्तुत किये गये
अलग सिर - सिर منفصل; अनाथ शाखा - فرع يتيم; अजन्मी शाखा - فرع غير مولود; रूट कमिट - إيداع جذري.
वीडियो प्रतिलेख
वीडियो का वर्णन, संकेत दर संकेत।
प्रतिलिपि दिखाएँ
- सिर कहाँ है? तीन राज्य.
- HEAD एक शाखा, एक कमिट, या एक नाम दे सकता है शाखा जिसमें अभी तक कोई प्रतिबद्धता नहीं है।
- अलग रहते हुए की गई प्रतिबद्धता वास्तविक है, लेकिन कुछ भी इसका नाम नहीं लेता.
- उस प्रतिबद्धता पर एक शाखा उसे रखती है पहुंच योग्य.
- कमिट एम पर राइट-क्लिक करें और चेक चुनें इस प्रतिबद्धता से बाहर.
- स्टाइलशीट बदलें, इसे चरणबद्ध करें, और एक बार प्रतिबद्ध करें.
- नई कमिट पर राइट-क्लिक करें, और एक बनाएं इसकी जांच किए बिना, यहां शाखा लगाएं।
- अब शाखा की जाँच करें. सिर जुड़ा हुआ है पुनः.
- सहेजे न गए संपादन के साथ, चेकआउट होता है मना कर दिया. रद्द करना सब कुछ रखता है।
- पहले कमिट करें, स्टैश करें और स्विच करें, या त्यागें. त्यागना वह है जिससे बचना है।
- एक नए इतिहास के लिए, क्रिएट ऑर्फ़न चलाएँ पैलेट से शाखा.
- यह छोड़ी गई ट्रैक की गई फ़ाइलों को गिनता है। ट्रैक न किए गए और उपेक्षित लोग रह जाते हैं।
- पुष्टि करना। फ़ोल्डर में कोई ट्रैक की गई फ़ाइलें नहीं हैं.
- एक रीडमी जोड़ें, और प्रतिबद्ध करें। यह प्रतिबद्धता है कोई अभिभावक नहीं.
- टर्मिनल में, प्रतीकात्मक-रेफ 1 से बाहर निकलता है जब सिर अलग है.
- एक अजन्मी शाखा पर, HEAD का पुनः विश्लेषण विफल रहता है.
- कमिट के बाद, मर्ज-बेस को कोई नहीं मिलता है सामान्य पूर्वज.
- यदि आप बिना किसी शाखा के चले गए, तो रिफ्लॉग करें अभी भी है.
- अभ्यास करें: फिर प्रत्येक राज्य में HEAD का नाम दें किसी उपेक्षित फ़ाइल की भविष्यवाणी करें.
- अगला, धक्का देने के बाद गलतियों से उबरना।