تخطَّ إلى المحتوى
GitTree

الدرس 27 · الاستعادة

إعادة التعيين: ناعمة ومختلطة وكاملة

أرجِع فرعًا إيداعًا واحدًا بثلاث طرق، وانظر ماذا يفعل كل نمط بالفرع ومنطقة التجهيز وملفاتك، لتختار النمط الذي يُبقي العمل الذي تريده.

حُفظ التقدّم في هذا المتصفح.

يحمّل التشغيل الفيديو من YouTube (وضع الخصوصية المحسّنة).

تعليق صوتي بالإنجليزية · ترجمة إنجليزية وعربية

افتح صفحة الفيديوشاهد على YouTube

ما ستتعلمه

  • أن تقول ما يحرّكه كل نمط من أنماط إعادة التعيين: الفرع والفهرس والملفات على القرص.
  • أن تحمي العمل المودَع والعمل غير المودَع قبل أي نمط مدمّر.
  • أن تقرأ مخرجات الحالة التي يتركها كل نمط.
  • أن تعرف أي ملفات يمكن أن تكتب فوقها إعادة التعيين الكاملة، ومنها غير المتتبَّعة.

قبل البدء

أنت على private/reset، وهو فرع يبدأ من الصفحة المدموجة M في الدرس 18 («See your work clearly.»). فوق M إيداع واحد C يغيّر العنوان إلى «Review changes with confidence.». ويشير فرع rescue/before-reset إلى C. بعد ذلك الإيداع عدّلت الصفحة مرة أخرى إلى «Understand each saved change.» ولم تجهّزها ولم تودعها. ولديك أيضًا ملاحظة غير متتبَّعة هي docs/signup-hint.md. تريد إرجاع private/reset إلى M.

كل شيء هنا محلي وضمن الخطة المجانية (يطلب GitTree تسجيل الدخول): دون حساب استضافة أو مزوّد أو إنترنت. كل الهويات خيالية (example.com). لا تنفّذ الدرس في مشروع حقيقي. نسخة إعادة التعيين الكاملة مؤقتة.

نفّذ التغييرات في GitTree أو بأوامر Git الأصلية، لا بالطريقتين في النسخة نفسها. القراءة بعد التنفيذ آمنة دائمًا. تسميات القوائم مأخوذة من نصوص GitTree 2.0 نفسها، وشُغّلت الأوامر الأصلية بـ Git 2.43 في نسخ مؤقتة. لم تُشغَّل خطوات GitTree على macOS أو Windows أو Linux.

الفكرة وأثر الأفعال

تنقل إعادة التعيين الفرع الحالي إلى إيداع آخر. ويحدد النمط كم تمسّ بعد ذلك. الناعمة تحرّك الفرع وحده: يبقى الفهرس وملفاتك كما كانت، فيظهر الفرق تغييرات مُجهَّزة. المختلطة تحرّك الفرع وتستبدل الفهرس بالهدف: تبقى ملفاتك، فيظهر الفرق تغييرات غير مجهَّزة. الكاملة تحرّك الفرع وتستبدل الفهرس وتكتب ملفاتك المتتبَّعة على الهدف. وتذهب تعديلاتك غير المودَعة على الملفات المتتبَّعة.

يحفظ فرع الحفظ الإيداع C، فيمكن إيجاد العنوان المودَع من جديد. لكنه لا يحفظ التعديل الأحدث الذي لم يُودَع قط. تُوجد الإيداعات عبر سجل المراجع؛ أما التعديلات غير المحفوظة فلا، لأنها لم تدخل Git أصلًا. احمِها بنفسك قبل أي نمط مدمّر.

والإعادة الكاملة تكتب أيضًا فوق ملف غير متتبَّع إذا كان في الهدف ملف متتبَّع بالمسار نفسه. أما الملف غير المتتبَّع الذي لا يعترض الطريق، مثل docs/signup-hint.md هنا، فيُترك. وهذه ملاحظة عن هذا المشروع، لا وعد عن كل ملف غير متتبَّع.

في الأنماط الثلاثة المرجع الوحيد الذي يتحرك هو الفرع: يبقى rescue/before-reset والفروع الأخرى وما على الخوادم كما هو.

يسألك GitTree أولًا. يقول حوار إعادة التعيين ما الذي سيبقى، ويقول في الكاملة إن كل ما يزيله يُحفظ أولًا تحت refs/ogt/trash ليستعيده «تراجع». أما إعادة التعيين في الطرفية فلا تصنع لقطة كهذه.

إعداد حالة المشروع المحددة

ابدأ من نسخة عادية منفصلة من ناتج الدرس 18 المدموج M وأبقِ أصلك دون مساس. أنشئ الفرع واحفظ SARA إيداع العنوان وأنشئ فرع الحفظ عنده. ثم احفظ OMAR دون تجهيز وDOC_HINT ملفًا جديدًا. احتفظ بنسخة من OMAR والملاحظة خارج Git، ثم اصنع ثلاث نسخ متطابقة، واحدة لكل من الناعمة والمختلطة والكاملة.

مدخلات الملفات كاملة

احفظ في المرحلة المحددة فقط بصيغة UTF-8 وLF وسطر نهائي. لا تلصق أسوار Markdown. ترث الملفات الثابتة نقطة البداية؛ لا تستبدل الأصل بنسخة إعادة منفصلة.

index.html — MERGED

مقتطف من ملف · 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>
  </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>

index.html — SARA

مقتطف من ملف · 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">Review changes with confidence.</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>
  </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>

index.html — OMAR

مقتطف من ملف · 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">Understand each saved change.</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>
  </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/signup-hint.md — DOC_HINT

الناتج
Unfinished signup hint: use fictional data only.

في GitTree

افتح لوحة الأوامر بـ Command+Shift+P (وCtrl+Shift+P على Ubuntu). إعادة التعيين في قائمة النقر بزر الفأرة الأيمن على الإيداع، ضمن القائمة الفرعية إعادة تعيين private/reset إلى هذا الإيداع (Reset private/reset to This Commit).

  1. ابنِ الفرع وفرع الحفظ والتعديل غير المجهَّز والملاحظة كما يبيّن القسم التالي. احتفظ بنسخة من التعديل والملاحظة خارج Git. اصنع ثلاث نسخ متطابقة وافتحها في ثلاث تبويبات.
  2. النسخة الناعمة. في المخطط انقر M (الإيداع تحت C، لا رأس الفرع) بزر الفأرة الأيمن وافتح إعادة تعيين private/reset إلى هذا الإيداع. اختر ناعمة: إبقاء كل التغييرات مُجهَّزة (Soft: Keep All Changes Staged). يقول حوار التأكيد إن كل تغيير منذ ذلك الحين يبقى مُجهَّزًا ولا يتغير أي ملف. اختر إعادة تعيين private/reset.
  3. افحص النتيجة الناعمة: الفرع على M، والصفحة على القرص ما زالت تقول «Understand each saved change.»، وقائمتا المجهَّز وغير المجهَّز تحملان index.html.
  4. النسخة المختلطة. اختر مختلطة: إبقاء التغييرات في مجلد العمل (Mixed: Keep Changes in the Working Folder) على M. يقول الحوار إن كل تغيير يبقى في مجلد العمل غير مجهَّز. اختر إعادة تعيين private/reset. الفرع على M، والصفحة على القرص هي التعديل نفسه، والتغيير غير مجهَّز فقط.
  5. النسخة الكاملة. بعد أن حفظت التعديل والملاحظة في مكان آخر فقط، اختر كاملة: التخلّص من كل التغييرات… (Hard: Discard All Changes…) على M. الحوار تحذير: يسرد ما يُزال ويقول إنه يُحفظ أولًا تحت refs/ogt/trash. اقرأه. الافتراضي إلغاء (Cancel). اختر التخلّص وإعادة تعيين private/reset.
  6. افحص النتيجة الكاملة: الفرع على M، والصفحة هي عنوان M، وقائمة التغييرات تعرض الملاحظة غير المتتبَّعة وحدها. يقول الإشعار «تمت إعادة التعيين إلى» والإيداع.
  7. قارن النسخ الثلاث وفرع rescue/before-reset الذي ما زال على C. لا تدفع أيًّا منها.

أوامر إعادة التعيين معطَّلة على الإيداع الذي يقف عليه الفرع بالفعل، وحين لا يكون فرع محدَّدًا.

لكل إيداع عادي في الدورة: الملخّص (Summary) هو العنوان المحدد، والوصف (Description) خالٍ، وتبقى الخيارات تعديل الإيداع الأخير وتخطّي الخطّافات وإضافة Signed-off-by ومؤلف مختلف والدفع بعد الإيداع والسماح بإيداع فارغ معطّلة.

في الطرفية

في نسخة منفصلة من ناتج الدرس 18:

الأمر · bash
git switch --create private/reset

احفظ SARA باسم index.html ثم:

الأمر · bash
git add -- index.html
git commit --quiet -m "feat: reset snapshot example"
git branch rescue/before-reset

احفظ OMAR باسم index.html دون تجهيز وDOC_HINT باسم docs/signup-hint.md. احتفظ بنسخة من الاثنين خارج Git ثم اصنع ثلاث نسخ متطابقة. في كل واحدة:

الأمر · bash
TARGET_SHA="$(git rev-parse rescue/before-reset^)"

النسخة الناعمة فقط:

الأمر · bash
git reset --quiet --soft "$TARGET_SHA"

النسخة المختلطة فقط:

الأمر · bash
git reset --quiet --mixed "$TARGET_SHA"

النسخة الكاملة فقط، في نسختها المؤقتة:

الأمر · bash
git reset --quiet --hard "$TARGET_SHA"

في كل نسخة اقرأ:

الأمر · bash
git rev-parse HEAD
git show :index.html
git status --short

كل HEAD هو M. يحمل الفهرس SARA بعد الناعمة، وصفحة M بعد المختلطة والكاملة. والملف على القرص هو OMAR بعد الناعمة والمختلطة، وصفحة M بعد الكاملة. وكانت الحالات:

الناعمة:

الناتج
MM index.html
?? docs/signup-hint.md

المختلطة:

الناتج
 M index.html
?? docs/signup-hint.md

الكاملة:

الناتج
?? docs/signup-hint.md

لم تصنع إعادة التعيين في الطرفية لقطة في GitTree. ما زال git reflog يسرد C، لكن OMAR ليس فيه أصلًا. وفي مختبر منفصل محفوظ النسخ كتبت إعادة تعيين كاملة إلى إيداع فيه docs/signup-hint.md متتبَّع فوق ملف غير متتبَّع بالمسار نفسه.

النتيجة

أين تنتهي: الفروع الثلاثة على M. الناعمة: الفهرس يحمل SARA والملف يحمل OMAR. المختلطة: الفهرس يحمل M والملف يحمل OMAR. الكاملة: كلاهما يحمل M. والملاحظة غير المتتبَّعة باقية في كل نسخة، وrescue/before-reset ما زال على C.

أخطاء شائعة

  • اعتبار فرع الحفظ نسخة احتياطية من عمل أحدث لم يُودَع.
  • استخدام الإعادة الكاملة لتنظيف نسخة دون حفظ التعديلات أولًا.
  • توقع ألا تترك الناعمة شيئًا مُجهَّزًا.
  • إعادة تعيين فرع دفعته بالفعل ثم دفعه فوق عمل زميل.

إن حدث خطأ

استخدم مرجع الحفظ لإيجاد العنوان المودَع من جديد، ونسخك الخارجية للتعديل والملاحظة. وفي GitTree حفظت إعادة التعيين الكاملة التي أجريتها من التطبيق لقطة أولًا، فيمكن لـ «تراجع» استعادتها. أما التي أجريتها في الطرفية فلا.

اختبر فهمك

أجب عن كل سؤال ثم اقرأ السبب. الأسئلة المعلَّمة «مطلوب» تُحتسب لإكمال الدرس.

  1. السؤال 1 من 6

    أي نمط لإعادة التعيين يحرّك الفرع وحده ويترك الفهرس وملفاتك كما كانت؟

    اختر إجابة واحدة.

  2. السؤال 2 من 6

    أي مما يلي صحيح عن إعادة التعيين الكاملة؟

    اختر كل إجابة صحيحة.

  3. السؤال 3 من 6
    مطلوب

    في النسخة المختلطة تعيد تعيين private/reset إلى M. ماذا يطبع git status --short؟

    اختر إجابة واحدة.

  4. السؤال 4 من 6

    غيّر المُدخل: لم تحفظ التعديل والملاحظة خارج Git وتنفّذ الإعادة الكاملة في الطرفية. من أين تستعيد التعديل؟

    اختر إجابة واحدة.

  5. السؤال 5 من 6
    مطلوب

    بعد إعادة تعيين يطبع git status --short الملف MM index.html. أي نمط عمل، وماذا يحمل الفهرس؟

    اختر إجابة واحدة.

  6. السؤال 6 من 6
    مطلوب

    بعد الإعادة الكاملة في نسختها المؤقتة، أي قراءات تبيّن أنها فعلت ما يقوله الدرس؟

    اختر كل إجابة صحيحة.

0 من 6 صحيحة

أجب عن الأسئلة المطلوبة إجابة صحيحة لتكمل الدرس.

جرى التحقق في هذا المتصفح.

تدريب

نفّذ القراءات الثلاث في كل نسخة واملأ جدولًا: إلى أين يشير الفرع، وماذا يحمل الفهرس، وماذا يحمل الملف. ثم قل أي نمط تستخدمه لإعادة صياغة رسالة الإيداع، وأيها لإلغاء تجهيز كل شيء، وأيها للتخلّص من كل شيء.

تأكيد منك أنت: لا يستطيع الموقع رؤية جهازك.

لإكمال الدرس، أجب عن الأسئلة المطلوبة إجابة صحيحة وأكّد تنفيذ التمرين العملي.

خلاصة

  • الناعمة تحرّك الفرع وحده.
  • المختلطة تعيد تعيين الفهرس أيضًا.
  • الكاملة تعيد كتابة ملفاتك أيضًا.

المصطلحات الجديدة

Reset — إعادة تعيين; soft — ناعمة; mixed — مختلطة; hard — كاملة; rescue branch — فرع حفظ.

نص الفيديو

ترجمة التعليق الصوتي الإنجليزي للفيديو، مقطعًا بعد مقطع.

اعرض النص
  1. أرجِع فرعًا، واختر كم يتغير غير ذلك.
  2. الناعمة تحرّك الفرع. والمختلطة تضيف الفهرس. والكاملة تضيف ملفاتك.
  3. فيصير الفرق مُجهَّزًا أو غير مجهَّز أو ذاهبًا.
  4. ابنِ بداية واحدة: إيداع وفرع حفظ وتعديل غير محفوظ وملاحظة.
  5. اصنع ثلاث نسخ متطابقة، ودوّن معرّف M.
  6. التعديل لم يُودَع قط. احتفظ بنسخة خارج Git.
  7. يعرض المخطط M ثم C وفرع الحفظ على C.
  8. انقر M بزر الفأرة الأيمن وافتح قائمة إعادة التعيين الفرعية واختر ناعمة.
  9. يقول الحوار إن كل تغيير يبقى مُجهَّزًا ولا يتغير أي ملف.
  10. الفرع على M الآن. وC ما زال على فرع الحفظ.
  11. تحمل القائمة المجهَّزة الإيداع القديم. وغير المجهَّزة تعديلك.
  12. الملف على القرص ما زال يحمل تعديلك.
  13. النسخة المختلطة: القائمة نفسها، اختر مختلطة.
  14. يقول هذا الحوار إن التغييرات تبقى غير مجهَّزة.
  15. الآن index.html غير مجهَّز فقط.
  16. تعديلك ما زال في الملف.
  17. قبل الكاملة احفظ التعديل والملاحظة في مكان آخر.
  18. النسخة الكاملة: اختر كاملة، بالنقاط التي تعني تحذيرًا.
  19. يسرد الحوار ما يُزال ويقول إنه يُحفظ أولًا. والإلغاء هو الافتراضي.
  20. اختر التخلّص وإعادة التعيين.
  21. بقيت الملاحظة وحدها. والصفحة صفحة M من جديد.
  22. في الطرفية القراءة الأولى هي الإيداع. والثلاثة هي M.
  23. git show مع النقطتين يقرأ الفهرس. والناعمة تبقي الصفحة القديمة.
  24. الحالة مختلفة في كل نسخة.
  25. فرع الحفظ ما زال على الإيداع الأقدم.
  26. والملف على القرص: تعديلك مرتين، وعنوان M مرة.
  27. غيّر المُدخل: بلا نسخة خارجية، وكاملة في الطرفية.
  28. يسرد سجل المراجع الإيداعات. والتعديل غير المحفوظ ليس فيه.
  29. والكاملة تكتب فوق ملف غير متتبَّع إن كان في الهدف ملف هناك.
  30. الناعمة والمختلطة لا تفقدان شيئًا. والكاملة في التطبيق تُحفظ أولًا.
  31. تدريب: املأ جدولًا للفرع والفهرس والملف لكل نمط.
  32. التالي: اعكس إيداعًا مشتركًا دون إعادة كتابة التاريخ.