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

पाठ 25 · इतिहास और एकीकरण

चेरी-पिक के साथ चयनित कमिट लागू करें

एक टीम के साथी के सुधार को उसकी पूरी शाखा को मर्ज किए बिना अपनी रिलीज शाखा में कॉपी करें, फिर नई कमिट, उसके लेखक, उसकी फाइलें और पीछे क्या रह गया, इसकी जांच करें।

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

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

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

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

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

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

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

प्रिया की शाखा priya/label एक साझा बेसलाइन बी (साइनअप पेज) के ऊपर दो कमिट रखती है। पहला एक असंबंधित नोट है, "दस्तावेज़: असंबंधित स्रोत नोट", जो कि docs/temporary-review.md जोड़ता है। दूसरा उसका समाधान है, "ठीक करें: काल्पनिक ईमेल लेबल को स्पष्ट करें", जो लेबल को index.html में बदल देता है। आपकी शाखा release/label उसी बेसलाइन बी से शुरू होती है और इसकी अपनी एक प्रतिबद्धता है, "दस्तावेज़: रिकॉर्ड लक्ष्य समीक्षा", जो docs/integration-note.md जोड़ती है। release/label की जांच कर ली गई है और कार्य वृक्ष साफ़ है। आप चाहते हैं कि वह आपकी शाखा पर ठीक हो, लेकिन उसका नोट नहीं।

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 पर नहीं चलाए गए।

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

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

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

निर्भरताएँ अभी भी मायने रखती हैं। फिक्स साइनअप फॉर्म की एक पंक्ति को संपादित करता है, इसलिए लक्ष्य शाखा के पास पहले से ही वह फॉर्म होना चाहिए। यदि ऐसा नहीं होता है, तो Git एक संघर्ष के साथ रुक जाता है। यदि लक्ष्य में पहले से ही समान परिवर्तन है, तो चयन खाली हो जाएगा और Git फिर से बंद हो जाएगा। दोनों ही मामलों में देखें कि ऑपरेशन क्या कहता है; इससे आगे निकलने के लिए किसी खाली प्रतिबद्धता को बाध्य न करें।

केवल लक्ष्य शाखा ही चलती है। priya/label और सर्वर पर सब कुछ वैसा ही रहता है जैसा वे थे। नई प्रतिबद्धता में लेबल परिवर्तन को release/label में जोड़ा गया है और कुछ नहीं।

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

प्रोजेक्ट की एक अलग सामान्य प्रति से प्रारंभ करें क्योंकि पाठ 18 ने इसे छोड़ दिया है, और अपने मूल gittree-features को अछूता छोड़ दें। SIGNUP को आधार रेखा के रूप में सहेजें, फिर दो शाखाएं बनाएं। नीचे दिए गए निकाय बेसलाइन पृष्ठ (SIGNUP), असंबंधित नोट (DOC_NOISE), निश्चित पृष्ठ (SIGNUP_LABEL) और आपका अपना नोट (DOC_MERGE) हैं।

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

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

Index.html - साइन अप करें

फ़ाइल अंश · 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>

docs/temporary-review.md - DOC_NOISE

आउटपुट
Temporary rehearsal note, deliberately dropped.

Index.html - SIGNUP_LABEL

फ़ाइल अंश · 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">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>

दस्तावेज़/एकीकरण-नोट.एमडी - DOC_MERGE

आउटपुट
# Integration review

This note was written on main while signup work was private.

GitTree में

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

  1. जैसा कि अगले भाग में दिखाया गया है, आधार रेखा और दो शाखाएँ बनाएँ। release/label जांचें और पुष्टि करें कि कार्य वृक्ष साफ़ है।
  2. ग्राफ़ में प्रिया की प्रतिबद्धता "ठीक करें: काल्पनिक ईमेल लेबल को स्पष्ट करें" ढूंढें, न कि उसके नीचे का नोट। इसे चुनें और इसका विवरण पढ़ें: एक बदला हुआ पथ, index.html, और इसका मूल असंबंधित नोट है।
  3. उस कमिट पर राइट-क्लिक करें और Cherry-Pick Commit चुनें। यह उस शाखा पर तुरंत लागू होता है जिस पर आप हैं; कोई शाखा बीनने वाला नहीं है. कमांड उस कमिट पर अक्षम है जो पहले से ही चालू है।
  4. वास्तविक परिणाम की प्रतीक्षा करें. यदि कोई कार्रवाई रुक जाती है, तो दोबारा चुनने के बजाय बैनर पर Resolve, Continue या Abort… का उपयोग करें।
  5. Select the new commit on release/label. Its ID differs from Priya's, the author is Priya Nair and the committer is GitTree Demo.
  6. index.html खोलें: यह SIGNUP_LABEL है। docs/temporary-review.md नहीं है और आपका अपना docs/integration-note.md है। priya/label अभी भी अपने पुराने टिप का नाम बताता है।
  7. release/label साफ़ छोड़ें. धक्का न दें, और मर्ज न करें priya/label।

यदि आप ग्राफ़ में दो या अधिक कमिट चुनते हैं, तो मेनू Cherry-Pick Commits प्रदान करता है और उन्हें क्रम में कॉपी करता है। यह पाठ एक की प्रतिलिपि बनाता है.

पाठ्यक्रम में प्रत्येक सामान्य प्रतिबद्धता के लिए: 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 label-base

SIGNUP को index.html के रूप में सहेजें, फिर:

Command · bash
git add -- index.html
git commit --quiet -m "feat: prepare the shared signup baseline"
BASE_SHA="$(git rev-parse HEAD)"
git switch --create priya/label

DOC_NOISE को docs/temporary-review.md के रूप में सहेजें, फिर:

Command · bash
git add -- docs/temporary-review.md
git commit --quiet -m "docs: unrelated source note"

SIGNUP_LABEL को index.html के रूप में सहेजें, फिर:

Command · bash
git add -- index.html
git -c user.name="Priya Nair" -c user.email=priya@example.com commit --quiet -m "fix: clarify the fictional email label"
PICK_SHA="$(git rev-parse HEAD)"
git switch --create release/label "$BASE_SHA"

DOC_MERGE को docs/integration-note.md के रूप में सहेजें, फिर:

Command · bash
git add -- docs/integration-note.md
git commit --quiet -m "docs: record target review"

अब फिक्स चुनें और परिणाम पढ़ें:

Command · bash
git cherry-pick "$PICK_SHA"
git log -1 --format='%s%n%an <%ae>%n%cn <%ce>'
git diff-tree --no-commit-id --name-only -r HEAD
git status --short
आउटपुट
fix: clarify the fictional email label
Priya Nair <priya@example.com>
GitTree Demo <demo@example.com>
index.html

नए कमिट की आईडी PICK_SHA से भिन्न है, index.html SIGNUP_LABEL है, docs/temporary-review.md अनुपस्थित है और स्थिति खाली है। जानने के लिए दो विविधताएँ, अलग-अलग प्रतियों में चलाएँ, कभी भी विहित में नहीं: git cherry-pick -x "$PICK_SHA" नए संदेश में "(चेरी कमिट से चुनी गई ...)" पंक्ति जोड़ता है, जो साझा शाखाओं को चुनने में मदद करती है; और जिस लक्ष्य पर साइनअप फ़ॉर्म का अभाव है, वही कमांड index.html पर विरोध के साथ रुक जाता है, जिसे आप हल करते हैं (पाठ 23) या git cherry-pick --abort के साथ छोड़ देते हैं। यदि लक्ष्य में पहले से ही परिवर्तन है, तो Git एक खाली पिक के साथ फिर से रुक जाता है, और git cherry-pick --skip या --abort बाहर निकलने का रास्ता है।

नतीजा

Where you end: release/label के पास प्रिया के फिक्स के साथ एक नई प्रतिबद्धता है, जिसे प्रिया नायर ने लिखा है और GitTree डेमो ने एक नई आईडी के साथ प्रतिबद्ध किया है। पृष्ठ पर स्पष्ट लेबल है, असंबंधित नोट साथ नहीं आया, priya/label और सर्वर अपरिवर्तित है और कार्य वृक्ष साफ़ है।

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

  • चेरी-पिक की सोच प्रतिबद्धता को आगे बढ़ाती है। यह परिवर्तन की प्रतिलिपि बनाता है; मूल वहीं रहता है जहां वह था।
  • ग़लत कमिट चुनना, समाधान के बजाय असंबंधित नोट।
  • जब परिवर्तन पहले से ही शाखा में हो तो एक खाली प्रतिबद्धता को मजबूर करना।
  • संपूर्ण फीचर को मर्ज करने के बजाय, एक समय में एक कमिट को कॉपी करने के लिए चेरी-पिक का उपयोग करना।

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

यदि पिक बंद हो जाए तो बैनर पढ़ें। Resolve और Continue इसे पाठ 23 के अनुसार समाप्त करें; Abort… शाखा को वहीं लौटा देता है जहां वह थी। यदि चयन समाप्त होने के बाद गलती हो गई, तो नई प्रतिबद्धता केवल release/label पर है: इसे वहां पूर्ववत करें, और स्रोत शाखा को कभी नहीं छुआ जाएगा।

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

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

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

    चेरी-पिक कॉपी क्या करती है?

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

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

    चयन के बाद, नई प्रतिबद्धता के बारे में इनमें से कौन सा सत्य है?

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

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

    प्रिया का फिक्स एक असंबंधित नोट कमिट के शीर्ष पर बैठता है। आप केवल release/label पर फिक्स को चेरी-पिक करते हैं। क्या docs/temporary-review.md बाद में release/label पर है?

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

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

    इनपुट बदलें: release/label के पास वह साइनअप फॉर्म नहीं है जिसे प्रिया का फिक्स संपादित करता है। जब आप चुनते हैं तो क्या होता है?

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

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

    आप एक कमिट चुनते हैं और Git "पिछला चेरी-पिक अब खाली है" पर रुक जाता है। परिवर्तन आपकी शाखा पर पहले से ही है. आप क्या करते हैं?

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

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

    कौन से रीडबैक दर्शाते हैं कि चयन ने वही किया जो पाठ में कहा गया है?

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

6 में से 0 सही

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

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

अभ्यास करें

नए कमिट की आईडी, लेखक और कमिटर, उसके बदले हुए पथ और क्या docs/temporary-review.md मौजूद है, इसकी रिपोर्ट करें। फिर अनुमान लगाएं कि यदि आप फिर से वही प्रतिबद्धता release/label पर चुनते हैं तो क्या होगा।

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

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

पुनर्कथन

  • चेरी-पिक एक कमिट के बदलाव को एक नए कमिट के रूप में कॉपी करता है।
  • माता-पिता और इससे पहले प्रतिबद्ध लोग पीछे रह जाते हैं।
  • कुछ भी थोपने से पहले निर्भरता और खाली चयन की जाँच करें।

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

चेरी-पिक - انتقاء; स्रोत प्रतिबद्ध - إيداع المصدر; लक्ष्य - الهدف; निर्भरता - निर्भरता.

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

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

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