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

الدرس 20 · السجل والتكامل

أعد تأسيس عمل لم يُدفع بعد

أعد تطبيق إيداع تسجيل غير منشور على أساس محدث مستقل. احتفظ بالطرف القديم وافحص الهوية والأب الجديدين ومحتوى التسجيل المقصود.

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

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

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

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

ما ستتعلمه

  • حدد نطاق الإعادة الخاص.
  • احفظ التاريخ المودع القديم.
  • تعرف الهويات المعاد إنشاؤها.
  • افحص الأب والشجرة الكاملة.

قبل البدء

تبدأ من نسخة منفصلة من نتيجة الدرس الثامن عشر (main هو الدمج M وهو خالٍ): يحمل الفرع الخاص feature/signup-form إيداعًا واحدًا S، ويحمل updated-main إيداعًا مختلفًا N، كلاهما على M، ويشير rescue/signup-before-rebase إلى S أيضًا. الفرع الخاص مسحوب وخالٍ وغير منشور.

سُجّل الفيديو باستخدام Git 2.52.0 وGitTree 2.0 على Ubuntu 24.04: بُني الفرع الخاص والأساس الأحدث في الطرفية؛ أما إعادة التأسيس وحوارها وفحص النتيجة ففي التطبيق، وقُرئت النتيجة في الطرفية. شُغّلت الإعادة الأصلية أدناه في نسخة مؤقتة وأعطت النتيجة نفسها. لم يُشغَّل شيء على macOS أو Windows، وUbuntu هو نظام Linux الوحيد المسجَّل. الحد الأدنى المقروء لـ GitTree هو Git 2.39.0.

يطلب GitTree تسجيل الدخول، ثم تشمل الخطة المجانية كل خطوات الدرس. لا مزوّد أو Pro أو اعتماد API أو خدمة إنترنت مطلوبة. الوجهة المحلية المجردة ليست GitLab أو CI. الهويات خيالية example.com؛ لا تنفذ الدرس في مستودع مصدر.

نفّذ التغييرات عبر التطبيق أو الطريق الأصلي من الحالة نفسها، لا كليهما بالتتابع. يمكن التحقق بالقراءة بعد أيهما. تُسمَّى التهيئة الطرفية أصلية، لا ميزة تطبيق مختلقة.

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

تختار إعادة التأسيس إيداعات الفرع وتعيد تطبيق تغييراتها على أساس جديد؛ لا تحرك الكائنات القديمة، بل تنشئ إيداعات بآباء وهويات جديدة.

يجب أن يكون الفرع الحالي هو المقصود. يضيف S التسجيل وN وثيقة مختلفة فينجح بلا تعارض، لا ضمانًا لكل إعادة.

السجل المنشور حد تنسيق. هذه الإيداعات خاصة عمدًا؛ لا تعد تأسيس الميزة المنشورة لتستقيم الرسمة. يحفظ المرجع الإيداعات لا النص غير المحفوظ.

تنتقل الميزة إلى S′ وتتغير الملفات للشجرة المجمعة؛ يبقى الأساس والحفظ وmain والبعيد.

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

ابدأ نسخة عادية منفصلة من المشروع كما تركه الدرس الثامن عشر (main هو الدمج M). يبقى gittree-features الأصلي محفوظًا ولا تنفذ في مستودع مصدر. ثم نفّذ التحضير أدناه. الهوية محلية خيالية والتوقيع معطل.

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

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

index.html — SIGNUP

مقتطف من ملف · 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/integration-note.md — DOC_MERGE

الناتج
# Integration review

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

في GitTree

لوحة الأوامر: Command+Shift+P (وCtrl+Shift+P على Ubuntu)، ثم الأمر المحدد حرفيًا. أفعال المرجع المسمّى في قائمة صفه، لا اختصار لوحة بلا وسيط.

  1. أعدّ التباعد وفرع الحفظ بالأوامر المحددة دون إعادة كتابة منشور.
  2. تحقق من سحب الميزة وخلوها وعدم نشرها وافحص S وN.
  3. انقر updated-main بزر الفأرة الأيمن في الرسم ← إعادة تأسيس feature/signup-form على updated-main (Rebase feature/signup-form onto updated-main)؛ يسمّي الحوار الفرع الحالي والهدف.
  4. اقرأ خيارات إعادة التأسيس هذه (Options for this rebase) وأبقِ خبّئ التغييرات المحلية ثم أعِدها (Stash local changes and put them back) وانقل الفروع التي تشير إلى هذه الإيداعات (Move the branches that point into these commits) معطلين. يقول الحوار إن feature/signup-form القديم يبقى تحت refs/ogt/trash.
  5. اختر إعادة تأسيس feature/signup-form (Rebase feature/signup-form) مرة واحدة وانتظر إشعار انتهاء الإعادة؛ عند التوقف احتفظ بالحالة لا تكررها.
  6. افحص أب S′ ورسالته وقارن المعرّفات الحقيقية.
  7. افحص الملفين كاملين وثبات فرع الحفظ عند S.
  8. أثبت الخلو وانتهاء الإعادة واترك main والبعيد.

لكل إيداع عادي: الملخّص (Summary) بالملخّص المحدد والوصف (Description) خالٍ؛ خيارات تعديل الإيداع الأخير (Amend Previous Commit) وتخطّي الخطّافات (Skip Hooks) وإضافة Signed-off-by (Add Signed-off-by) ومؤلف مختلف (Different Author) والدفع بعد الإيداع (Push After Commit) والسماح بإيداع فارغ (Allow Empty Commit) معطلة ودون مؤلفين مشاركين. جهّز الملفات المحددة ثم زر الإيداع ذي العدد الصحيح مرة واحدة، أو Command+Enter كبديل. درس التعديل الأخير وحده يغير خياره الصريح.

في الطرفية

في نسخة الدرس الثامن عشر/M خالية منفصلة، أنشئ الفرع الخاص:

الأمر · bash
git switch --create feature/signup-form

احفظ SIGNUP كاملًا ثم:

الأمر · bash
git add -- index.html
git commit --quiet -m "feat: add the local signup demonstration"
git branch rescue/signup-before-rebase
BASE_SHA="$(git rev-parse HEAD~1)"
git switch --quiet --create updated-main "$BASE_SHA"

على updated-main احفظ DOC_MERGE كاملًا ثم:

الأمر · bash
git add -- docs/integration-note.md
git commit --quiet -m "docs: add the integration review"
git switch --quiet feature/signup-form

BASE_SHA هو M المقاس قبل إيداع التسجيل. صار للفرعين إيداع مستقل ويحفظ rescue/signup-before-rebase الطرف القديم دون نشر.

البديل الأصلي للإعادة:

الأمر · bash
git rebase --quiet --no-autostash --no-update-refs --no-autosquash updated-main
git log -1 --format=%s
git rev-parse HEAD HEAD^ updated-main rescue/signup-before-rebase
git status --short

الملخّص المرصود:

الناتج
feat: add the local signup demonstration

يختلف HEAD عن S المحفوظ؛ ويساوي HEAD^ الأساس N. تبقى الوثيقة وكامل SIGNUP، والحالة خالية. توقف عند مُدخل معدل أو منشور غير متوقع بدل زيادة القوة. لنسخة التعارض راجع الدرس الثالث والعشرون؛ التوقف ليس إتمامًا.

النتيجة

حيث تنتهي: الميزة عند S′ وأبوها N وتجمع التسجيل والوثيقة؛ يبقى S في فرع الحفظ. لا عملية جارية والعمل خالٍ وmain والبعيد ثابتان.

أخطاء شائعة

  • افتراض أن الخط المستقيم يحفظ الهوية القديمة.
  • اعتبار النسخة البديلة نقطة الأصل.
  • تكرار تغيير اكتمل في التطبيق.

إن حدث خطأ

يحفظ الفرع S قبل الإعادة. عند التوقف افحص الشريط وحل أو أوقف صراحةً؛ لا يوقف --abort إعادة مكتملة ولا ينشئ الأصلي سجل التطبيق.

اختبر فهمك

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

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

    ما الذي يعاد؟

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

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

    ما الذي يُفحص؟

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

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

    أُعيد S على N: الأب؟

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

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

    غيّر الطرفين في سطر العنوان نفسه.

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

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

    هل --abort يلغي إعادة مكتملة؟

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

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

    ما الدليل؟

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

0 من 6 صحيحة

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

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

تدريب

أثبت اختلاف الطرف واتفاق الأب مع N والمحتوى. توقع تعارض تعديل العنوان نفسه في نسخة الدرس الثالث والعشرون منفصلة.

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

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

خلاصة

  • تعيد العملية إنشاء الإيداعات.
  • اختر الحالي والهدف صراحةً.
  • يهم نطاق الخصوصية والاستعادة.

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

Rebase — إعادة تأسيس; replay — إعادة تطبيق; rescue ref — مرجع حفظ.

نص الفيديو

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

اعرض النص
  1. ابدأ من نقطة الحالة المحددة.
  2. سمِّ الفرع ونسخة الفهرس ونسخة العمل.
  3. أعدّ نسخة الدورة المعزولة وحدها.
  4. أعدّ التباعد الخاص ومرجع الحفظ.
  5. افحص الفرع الحالي فعليًا.
  6. اختر الأساس الجديد المقصود.
  7. أبقِ خيارات الإعادة غير المطلوبة معطلة.
  8. انتظر نتيجة الإعادة الفعلية.
  9. يعني الأب الجديد هوية إيداع جديدة.
  10. افحص كامل المحتوى المجمّع.
  11. احفظ الطرف القديم دون نشره.
  12. ما الذي يعاد؟
  13. يعاد إنشاء النطاق المختار على الأساس الجديد.
  14. ما الذي يُفحص؟
  15. يحدد النطاق ما يتحرك.
  16. أُعيد S على N: الأب؟
  17. أب الإيداع S′ هو N.
  18. غيّر الطرفين في سطر العنوان نفسه.
  19. قد تتوقف الإعادة؛ الحل والمتابعة صريحان.
  20. هل --abort يلغي إعادة مكتملة؟
  21. الإيقاف للعملية الجارية؛ استعادة المكتمل تحتاج دليلها.
  22. ما الدليل؟
  23. قد تثبت الرسالة وتتغير الهوية.
  24. تحقّق من النتيجة الفعلية، لا رسالة وحدها.
  25. توقّع نتيجة المُدخل المختلف قبل الفعل.
  26. احتفظ بالعمل المفيد قبل الاستعادة.
  27. أثبت نقطة الحالة قبل المتابعة.
  28. احتفظ بالنتيجة المتحققة للخطوة التالية.