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

الدرس 12 · العمل اليومي

اختر طريقة السحب المناسبة

اختر سياسة سحب صريحة بعد فحص التباعد. قارن رفض التقديم وحده والدمج والإعادة الخاصة من ثلاث نسخ وخادم محلي معزول.

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

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

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

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

ما ستتعلمه

  • افصل الجلب عن دمج السحب.
  • قارن ثلاث سياسات صريحة.
  • تعرّف رفض التقديم نتيجة سياسة.
  • راجع المتتبَّع وإعداد السياسة المستمر.

قبل البدء

تبدأ من مشروع الدورة كما تركه الدرس الحادي عشر، مع إيصال main إلى إيداع Leo المجلوب؛ سمِّ هذا الإيداع M. عندها لديك ثلاث نسخ عادية من تباعد واحد: فرع خاص بإيداع واحد S، وفرع الخادم updated-main بإيداع آخر N، كلاهما فوق M. كل نسخة على الفرع الخاص وخالية من التغييرات. origin لكل نسخة وجهة جديدة تضم updated-main/N ويتتبَّعه الفرع؛ لا تغيير لبعيد المشروع الأصلي.

سُجّل الفيديو باستخدام 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، ويحفظ الدمج المسارين، وتعيد الإعادة الإيداع الخاص على الأساس. لا تغير الوضع سرًا لإخفاء الرفض.

تغير أوامر وضع السحب general.pullMode على مستوى التطبيق، لا خيار عملية واحدة. سجّل القيمة السابقة واستعدها؛ لا تغير أعلام الطرفية إعداد التطبيق.

يجلب كل سحب وجهته المعزولة. يبقي ff-only الفرع والملفات، ويحدث البديلان نسختهما فقط. لا دفع؛ يبقى تفضيل التطبيق حتى استعادته.

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

ابدأ نسخة عادية منفصلة من مشروع الدورة كما تركه الدرس الحادي عشر. يبقى 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.

docs/pull-policy.md — DOC_PULL

الناتج
# Pull policy

Fetch first and inspect ancestry.
Use fast-forward only when no integration decision is needed.
Merge preserves existing commit identities; rebase recreates private commits.
Never rewrite someone else's published work without coordination.

في GitTree

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

  1. أعدّ النسخ الثلاث المعزولة وخادمها والفرع المتتبَّع الخاص بكل منها كما في القسم التالي، وسجّل نمط السحب (Pull mode) الحالي (general.pullMode) قبل اختيار سياسة.
  2. في نسخة التقديم السريع اختر من لوحة الأوامر سحب: تقديم سريع فقط (Pull: Fast-Forward Only)، ثم انقر سحب (Pull) في الشريط وانتظر الرفض الحقيقي بسبب التباعد. يعرض الإشعار «تعذّر التقديم السريع لـ feature/signup-form» (feature/signup-form cannot fast-forward) ويقول إن للطرفين إيداعات ليست لدى الآخر وإن شيئًا لم يتغيّر، ويقدّم حلّ… (Resolve…) للدمج أو إعادة التأسيس أو إعادة التعيين. يبقى الإشعار حتى تغلقه، فأغلقه بـ إغلاق الإشعار (Dismiss notification) قبل النسخة التالية.
  3. افحص أن طرف الفرع والملفات لم يتغيّرا رغم أن origin/updated-main المجلوب محدَّث؛ لا تنقر دفع قسري… (Force Push…).
  4. في نسخة الدمج التي لم تُمَس اختر سحب: تقديم سريع إن أمكن، وإلا فدمج (Pull: Fast-Forward if Possible, Else Merge) ثم سحب (Pull)، وافحص النتيجة ذات الأبوين.
  5. في نسخة إعادة التأسيس التي لم تُمَس اختر سحب: إعادة تأسيس (Pull: Rebase) ثم سحب (Pull)؛ الفرع الحالي خاص فلا حاجة إلى تخبئة تلقائية.
  6. افحص S′ على N وأبوي الدمج وتطابق الشجرتين الكاملتين، واحتفظ بنتيجة كل نسخة منفصلة.
  7. احفظ DOC_PULL باسم docs/pull-policy.md في نسخة تدريب فقط بعد حفظ النتائج المقارَنة، واتركه غير مودَع.
  8. أعد نمط السحب (Pull mode) السابق صراحةً، وتحقق أنه لم يحدث دفع تلقائي ولم يتغيّر 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 كبديل. درس التعديل الأخير وحده يغير خياره الصريح.

في الطرفية

في نسخة نظيفة منفصلة من المشروع، أوصل main أولًا إلى إيداع Leo المجلوب (هذا هو M)، ثم أنشئ الفرع الخاص:

الأمر · bash
git merge --ff-only --quiet origin/main
git switch --create feature/signup-form

ضع ملف SIGNUP المحفوظ مكان index.html (حفظ الفيديو ملفات الدرس في ~/Downloads ويستخدم cp ~/Downloads/SIGNUP.html index.html) ثم:

الأمر · 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 في docs/integration-note.md (cp ~/Downloads/DOC_MERGE.md docs/integration-note.md) ثم:

الأمر · 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 قبل التسجيل؛ الطرفان مستقلان والحفظ عند S دون نشر. من نسخة ما قبل الإعادة أعد خادمًا جديدًا يضم N وحده:

الأمر · bash
git clone --quiet --bare --single-branch --branch updated-main --no-local . ../gittree-pull-origin.git

اصنع ثلاث نسخ عادية عند المُدخل نفسه بواسطة cp -R <source-demo-copy> <new-copy> أو نسخ نظام ملفات مفحوص يحفظ .git، مع توقف كل عمليات Git والتطبيق. في كل نسخة غيّر origin إلى عنوان file المقاس للخادم الجديد، واجلب وعيّن متتبَّع الفرع؛ لا تُعد توجيه الأصل:

الأمر · bash
git remote set-url origin "<measured-file-url>"
git fetch --quiet --prune origin
git branch --set-upstream-to=origin/updated-main feature/signup-form

استبدل قيمة العنوان بالوجهة المحلية المقاسة. في نسخة التقديم وحده:

الأمر · bash
git pull --quiet --ff-only origin updated-main

الخروج المرصود 128؛ مقتطف التشخيص:

الناتج
hint: Diverging branches can't be fast-forwarded, you need to either:
hint:
hint: 	git merge --no-ff
hint:
hint: or:
hint:
hint: 	git rebase
hint:
hint: Disable this message with "git config set advice.diverging false"
fatal: Not possible to fast-forward, aborting.

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

الأمر · bash
git pull --quiet --no-rebase --no-edit origin updated-main

في نسخة الإعادة المنفصلة:

الأمر · bash
git pull --quiet --rebase origin updated-main

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

الأمر · bash
git rev-list --parents -n 1 HEAD
git rev-parse 'HEAD^{tree}'
git status --short

تتغير SHAs الفعلية؛ كانت الحالات خالية قبل حفظ وثيقة السياسة الاختيارية. لا يدفع أي أمر فرعًا.

النتيجة

حيث تنتهي: تبقى نسخة ff-only عند S بعد الرفض والجلب؛ تنشئ نسخة الدمج أبوين والإعادة S′ على N؛ الشجرتان تتفقان دون دفع. تحفظ وثيقة السياسة كتدريب غير مودع بعد المقارنة فقط.

أخطاء شائعة

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

إن حدث خطأ

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

اختبر فهمك

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

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

    ما السحب هنا؟

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

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

    ماذا يحدث مع رفض ff-only؟

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

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

    إعادة الخاص على N: الأب؟

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

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

    اجعل الفرع منشورًا مشتركًا: هل ننصح بالإعادة تلقائيًا؟

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

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

    هل يغير أمر الوضع سحبًا واحدًا؟

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

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

    ما دليل المقارنة؟

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

0 من 6 صحيحة

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

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

تدريب

فسّر ما تغير رغم الرفض وقارن شجرتي النجاح وآباءهما، ثم احفظ الوثيقة وافحص استعادة التفضيل.

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

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

خلاصة

  • يشمل السحب سياسة دمج.
  • قد يأتي الرفض بعد جلب ناجح.
  • يلزم مراجعة استمرار التفضيل.

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

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

نص الفيديو

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

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