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

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

اجلب تحديث زميل دون استبدال صفحتك

اجلب إيداع التذييل الحقيقي من Leo مع إبقاء main والفهرس وصفحة العمل كما هي. ثم افحص تشذيب مرجع قديم في إعادة منفصلة دون خلطه بحذف فرع الخادم.

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

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

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

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

ما ستتعلمه

  • تفسير تقدم مرجع مجلوب مع ثبات main.
  • مقارنة تذييل الزميل دون تبديل أو دمج.
  • توقع أثر الجلب مع وجود تحرير محلي في الملف نفسه.
  • التمييز بين تشذيب سجل تتبُّع وحذف فرع محلي أو بعيد.

قبل البدء

تبدأ من حيث انتهى الدرس العاشر: الأصل على main/H6 وله ستة إيداعات، ومنها docs/remotes.md، وعمله وفهرسه خاليان. يتتبَّع main المرجع origin/main/H6، والوجهة المجردة المحلية تضم main/H6 وحده. تبقى feature/pricing-cards/F1 محلية دون متتبَّع أو نشر. أبقِ repo.autoFetchInterval = 0 لإظهار الحالة قبل الجلب وبعده. لا تستخدم نسخة الدرس الرابع الإضافية.

احجز مجلدًا مجاورًا جديدًا gittree-features-leo؛ توقف إن كان موجودًا. كل الأمثلة نسخ للمشروع التعليمي خارج مستودعات المصدر. سُجّل الفيديو باستخدام Git 2.52.0 وGitTree 2.0 على Ubuntu 24.04: إيداع Leo ودفعه وتهيئة نسخة المرجع القديم والفحوص جرت في الطرفية، أما الجلب والرسم ومقارنة مرجعين (Compare References) وعرض الملفات وتقليم المستودع البعيد (Prune Remote) ففي التطبيق. لم يُشغَّل شيء على macOS أو Windows، وUbuntu هو نظام Linux الوحيد المسجَّل. الحد الأدنى المقروء Git 2.39.0. لا يلزم مزوّد أو Pro أو بيانات اعتماد API للنقل المحلي.

الفكرة

يجلب جلب (Fetch) الكائنات ويحدّث المعرفة المحلية. يتقدم main في الوجهة إلى H7، لكن origin/main في الأصل يبقى H6 حتى الجلب. لا يثبت عدّ التأخر صفرًا مقابل سجل قديم أن الخادم لم يتغير.

بعد الجلب، يشير origin/main إلى H7، بينما يبقى main وHEAD عند H6، وكذلك الفهرس وصفحة العمل. قراءة الفروق ليست سحبًا أو تبديلًا أو دمجًا أو إعادة تأسيس. «متأخر بإيداع» وصف للنسب، لا عدد الملفات أو الأسطر.

السحب هو الجلب وخطوة ثانية. ينفّذ git pull جلبًا ثم يدمج ما وصل في فرعك الحالي (بتقديم سريع أو دمج أو إعادة تأسيس). يتوقف الجلب وحده عند النصف الأول، ولهذا لا يغيّر ملفاتك أبدًا. يختار الدرس 12 الخطوة الثانية عن قصد.

يزيل التشذيب مراجع التتبُّع التي غابت فروعها من الخادم وفق قاعدة الجلب. لا يحذف بنفسه فرع الخادم أو الفرع المحلي أو كل الوسوم. يفعّل طلب جلب الكل (Fetch All) في المصدر التشذيب، لذلك يتضمن البديل الأصلي --prune. أما تقليم المستودع البعيد (Prune Remote) ففعل مستقل على بعيد مسمّى، يُعرض في نسخة منفصلة.

انتقال الحالة

الفعلHEAD وmain في الأصلالفهرس والعملorigin/mainmain في الوجهة
البدايةH6صفحة H6H6H6
إيداع Leo ودفعه من نسختهH6لا تغييرH6، قديم الآنH7
جلب الكل (Fetch All) في الأصلH6لا تغييرH7H7
فحص الفروقH6لا تغييرH7H7

لا إيداع لدفتر جديد في الأصل: تحديث المرجع المجلوب هو خطوة المشروع الحقيقية. يبقى فرع الميزة عند F1.

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

غيّر index.html في نسخة Leo وحدها إلى النص الأول. الملخّص docs: add Leo's review reminder، والمؤلف والمُودِع Leo Okafor <leo@example.com>. النص الثاني لإعادة التوقع مع عمل محلي، لا للإيداع في المسار المحدد.

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

تحرير العمل في إعادة منفصلة — HTML-DIRTY-FETCH

لا تنسخه إلى الأصل المحدد:

مقتطف من ملف · 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">
    <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">Inspect the update before integrating it.</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>
  </main>
  <footer><p>Built by a fictional team for GitTree Learn.</p></footer>
  <script type="module" src="site.js"></script>
</body>
</html>

في GitTree

التسميات الإنجليزية حرفية من المصدر؛ راجع نظائر الواجهة العربية الفعلية عند التصوير.

  1. افتح تبويب الأصل على main وتحقق من هويته وخلو العمل ومن تعطيل الجلب الخلفي. لا تجلب قبل تصوير الحالة الأولى.
  2. أعدّ نسخة Leo وإيداع التذييل بأوامر T1، وسمها تهيئة زميل بالطرفية الأصلية. يغير دفعه الوجهة المجردة، لا سجل الأصل المجلوب. لا حساب مستضافًا أو استجابة مزوّد مصطنعة.
  3. نفّذ T2 قبل الجلب. يتفق main وorigin/main عند H6، بينما يعطي فحص الوجهة معرّف H7 مختلفًا. ما زال التذييل قديمًا في صفحة العمل.
  4. افتح لوحة الأوامر بـ Command+Shift+P (وCtrl+Shift+P على Ubuntu) واختر جلب الكل (Fetch All) مرة واحدة؛ الاختصار Command+Shift+F (وCtrl+Shift+F). انتظر النتيجة الحقيقية ولا تضغط Pull. مع بعيد واحد يكافئه النقر على origin بزر الفأرة الأيمن → جلب المستودع البعيد (Fetch Remote)، لا خطوة ثانية (لم يُصوَّر).
  5. حدد الإيداع المجلوب الجديد، docs: add Leo's review reminder، وافحص الملخّص وهوية Leo الحقيقية. يبقى main/HEAD عند الإيداع السابق. التحديد ليس تبديلًا.
  6. لوحة الأوامر مقارنة مرجعين… (Compare References…) → مقارنة مرجعين (Compare References). الطرف الأقدم (Old side) = main؛ الطرف الأحدث (New side) = origin/main؛ ما الذي يُقارَن (What to compare) = الطرفان كما هما (The two endpoints)، ثم مقارنة (Compare). يظهر index.html وحده وتذكير التذييل المحدد.
  7. عرض الملفات (Show Files) بـ Command+Shift+E (وCtrl+Shift+E على Ubuntu)، ثم index.html وEnter. يبقى تذييل العمل القديم. العودة إلى الرسم البياني (Back to Graph) → عرض تغييرات مجلد العمل (Show Working Changes): لا عناصر مُجهَّزة أو غير مُجهَّزة. لا حفظ أو إيداع أو دمج مطلوبًا.
  8. اترك main عند ستة إيداعات وorigin/main عند سبعة، والعدّ 0/1 والعمل خاليًا. أبقِ الميزة غير منشورة؛ لا تعالج التأخر بدفع قسري.
  9. نسخة B المنفصلة فقط: أعدّ المرجع القديم كما في T5، وافحص dry-run أولًا. افتح B من علامة تبويب جديدة (New Tab؛ Ctrl+T) بصف Open gittree-features-prune ضمن المستودعات الأخيرة. في تبويب B انقر origin في اللوحة الجانبية بزر الفأرة الأيمن → تقليم المستودع البعيد (Prune Remote). لا حوار معاينة أو تأكيد مختلقًا؛ يرسل التطبيق الفعل مباشرة. يختفي origin/practice/stale مع بقاء keep-stale المحلي والملفات.

اختصارات مفتاح Command مأخوذة من خريطة مفاتيح التطبيق، وصيغ Ctrl هي المستخدمة على Ubuntu. تهيئة الزميل والخادم بالطرفية لا تُعرض كإنشاء مشروع مستضاف في التطبيق.

في الطرفية

تبدأ الأوامر في الأصل التعليمي ما لم يُحدَّد -C أو تُذكر إعادة منفصلة. جلب الطرفية بديل فعل التطبيق لا تكرار لازم بعده.

T1 — تهيئة الزميل الحقيقي

الأمر · bash
git clone --quiet --branch main "$(git remote get-url origin)" ../gittree-features-leo
git -C ../gittree-features-leo config user.name "Leo Okafor"
git -C ../gittree-features-leo config user.email leo@example.com
git -C ../gittree-features-leo config commit.gpgsign false

أُنشئت نسخة جديدة على main وضُبطت هويتها محليًا فقط. في تلك النسخة غيّر سطر التذييل وحده ليصير الملف كله مطابقًا لـ HTML-LEO-FOOTER (يفعل الفيديو ذلك بأمر sed واحد؛ وحفظ النص كاملًا في محرر يعطي الملف نفسه)، ثم:

الأمر · bash
git -C ../gittree-features-leo add -- index.html
git -C ../gittree-features-leo commit --quiet -m "docs: add Leo's review reminder"
git -C ../gittree-features-leo push --quiet origin main

نجحت كلها بصمت؛ الدفع إلى الوجهة المجردة المحلية المؤقتة، لا الإنترنت أو الإنتاج.

T2 — السجل القديم مقابل حالة الوجهة

الأمر · bash
git rev-list --left-right --count main...origin/main
git rev-parse refs/heads/main
git rev-parse refs/remotes/origin/main
git ls-remote --heads origin refs/heads/main

عدّ الوصول قبل الجلب:

الناتج
0	0

يتفق ناتجا SHA التاليان عند H6، ويعرض ls-remote معرّف H7 الحقيقي المختلف وrefs/heads/main. تختلف المعرّفات حسب البيانات، فلا نضع SHA مختلقًا. لا يحدّث هذا الفحص المباشر origin/main.

T3 — الجلب دون دمج والتحقق

الأمر · bash
git fetch --all --prune --quiet

خرج 0 دون stdout. يتضمن الأمر التشذيب كما يفعّله طلب التطبيق في المصدر.

الأمر · bash
git symbolic-ref --short HEAD
git rev-list --count main
git rev-list --count origin/main
git rev-list --left-right --count main...origin/main
git log -1 --format="%s%n%an <%ae>%n%cn <%ce>" origin/main
git diff --name-only main origin/main
git status --short

النواتج قبل استعلام الحالة الأخير:

الناتج
main
6
7
0	1
docs: add Leo's review reminder
Leo Okafor <leo@example.com>
Leo Okafor <leo@example.com>
index.html

الحالة الأخيرة خالية بخروج 0. قورنت معرّفات main وكامل ملف الفهرس وبايتات العمل قبل الجلب وبعده؛ بقيت مطابقة. لم يحدث تبديل إلى H7.

الأمر · bash
git diff main origin/main -- index.html

كامل الفرق المرصود:

الناتج
diff --git a/index.html b/index.html
index eebd082..1e4cfde 100644
--- a/index.html
+++ b/index.html
@@ -34,7 +34,7 @@
       </div>
     </section>
   </main>
-  <footer><p>Built by a fictional team for GitTree Learn.</p></footer>
+  <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>

T4 — مُدخل مختلف: صفحة عمل معدلة

في نسخة منفصلة من الأصل قبل الجلب، احفظ HTML-DIRTY-FETCH دون تجهيز؛ تحديث Leo موجود في الوجهة:

الأمر · bash
git fetch --all --prune --quiet
git status --short
git show :index.html
git rev-list --left-right --count main...origin/main

ينجح الجلب وتبقى الحالة:

الناتج
 M index.html

يعرض git show كامل الملف القديم في الفهرس، لا تحرير العمل. العدّ 0/1، والقرص يطابق HTML-DIRTY-FETCH كاملًا. لا يخلق تداخل اسم الملف تعارض جلب؛ للدمج اللاحق شروط مختلفة.

T5 — مرجع تتبُّع قديم في B فقط

من مجلد الأصل التعليمي، أعدّ وجهتين مجاورتين جديدتين غير موجودتين؛ لا تُعد توجيه A:

الأمر · bash
git clone --quiet --bare --single-branch --branch main --no-local ../gittree-features-origin.git ../gittree-features-prune-origin.git
git clone --quiet --single-branch --branch main --no-local . ../gittree-features-prune
PRUNE_URL="$(node --input-type=module -e "import path from 'node:path'; import {pathToFileURL} from 'node:url'; console.log(pathToFileURL(path.resolve('../gittree-features-prune-origin.git')).href);")"
git -C ../gittree-features-prune remote set-url origin "$PRUNE_URL"
git -C ../gittree-features-prune config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
git --git-dir=../gittree-features-prune-origin.git branch practice/stale main
git -C ../gittree-features-prune fetch --prune --quiet origin
git -C ../gittree-features-prune branch keep-stale origin/practice/stale
git --git-dir=../gittree-features-prune-origin.git branch --delete --quiet practice/stale

تجلب نسخة B أحادية الفرع main وحده أولًا؛ يعيد تعيين remote.origin.fetch الصريح قاعدة الفروع الشاملة في B وحده ليصل practice/stale أيضًا. توقف عند أي فشل تهيئة. عطّل الجلب الخلفي في تفضيلات B قبل تسجيل التطبيق. غاب فرع الوجهة المؤقت وبقي سجله القديم وفرع keep-stale المحلي. تستهدف الأوامر التالية B صراحةً:

الأمر · bash
git -C ../gittree-features-prune remote prune --dry-run origin
git -C ../gittree-features-prune remote prune origin
git -C ../gittree-features-prune for-each-ref --format='%(refname)' refs/remotes/origin/practice/stale
git -C ../gittree-features-prune show-ref --verify --quiet refs/heads/keep-stale

مقتطف المعاينة الفعلي بعد سطر URL المتغير:

الناتج
 * [would prune] origin/practice/stale

مقتطف التنفيذ الفعلي:

الناتج
 * [pruned] origin/practice/stale

استعلام for-each-ref خالٍ بخروج 0؛ وshow-ref صامت بخروج 0، فيثبت بقاء keep-stale. يبقى main والقرص في B ثابتين وmain في وجهته عند H7. تتضمن السجلات الكاملة Pruning origin والعنوان المقاس؛ لا نختلق مسار جهاز ثابتًا.

لا تنفذ جلب الكل (Fetch All) بين التهيئة وتقليم المستودع البعيد (Prune Remote)؛ فهو يشذّب بالفعل، ولن يبقى مرجع للعرض المنفصل.

النتيجة

حيث تنتهي: الأصل على main/H6 بستة إيداعات وتذييل قديم. origin/main/H7 يسجل سابع إيداع، وmain في الوجهة H7 دون تغيير بسبب الجلب. يتتبَّع main المرجع المجلوب ويتأخر بإيداع؛ الفهرس والعمل خاليان. الميزة F1 محلية وغير منشورة. تبقى مراجع B/C وتحريراتها خارج الأصل، ولا إيداع docs/fetch-and-prune.md إضافيًا.

أخطاء شائعة

  • اعتبار عدّ 0/0 القديم حالة خادم حديثة.
  • توقع ظهور التذييل الجديد في العمل تلقائيًا.
  • اختيار Pull أو التبديل كي يبدو الجلب ناجحًا.
  • توقع التخلّص من تحرير العمل أو تعارضه بمجرد الجلب.
  • اعتبار التشذيب حذفًا لمستودع الوجهة أو keep-stale المحلي.

إن حدث خطأ

يعني خطأ المسار أو الإذن فحص العنوان والسبب الحقيقي، لا إعادة تعيين التاريخ أو استبدال الوجهة. رفض النقل أو مساعد الاعتماد أو الثقة ليس دليل غياب تحديثات. اعرض الرسالة الفعلية وعالج سببها. قد يمنع الوضع المقيَّد النقل؛ لا تثق بمستودع عشوائي لإكمال التسجيل، بل بالمختبر المفحوص وحده.

إن تحرك main أو تغير التذييل، افحص هل وقع Pull أو تبديل أو تحرير خارجي. احتفظ بالحالة غير المتوقعة قبل إعداد نقطة جديدة، ولا تستخدم إعادة تعيين كاملة لإخفاء السبب. إن غاب مرجع التشذيب فربما أزاله جلب الكل (Fetch All) سابق؛ أعد B بدل رسم صف يختفي أو حذف فرع مفيد.

اختبر فهمك

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

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

    دفع Leo الإيداع H7 ولم تجلب. إلى ماذا قد يشير origin/main؟

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

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

    أي الملاحظات تطابق نتيجة الجلب؟

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

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

    بعد الجلب، main ستة وorigin/main سبعة، وH6 أب H7. ما العدّ؟

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

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

    احفظ تحرير العمل البديل دون تجهيز ثم اجلب H7. ماذا يحدث؟

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

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

    حُذف فرع خادم B وبقي سجل التتبُّع وفرع keep-stale. ماذا يزيل التشذيب؟

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

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

    ما الفحوص المطلوبة معًا؟

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

0 من 6 صحيحة

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

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

تدريب

توقع أن يبقى الفهرس والعمل H6 بينما تحمل الشجرة المجلوبة تذييل Leo. أثبت في إعادة العمل المعدل بقاء كامل نص القرص دون تعارض. فسّر بقاء keep-stale بعد التشذيب في B. اترك الأصل وحده عند 0/1 وحالة خالية.

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

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

خلاصة

  • يحدّث الجلب المعرفة دون دمج الفرع.
  • خلو الحالة لا يعني مواكبة البعيد.
  • يختلف تشذيب سجل التتبُّع عن حذف فرع محلي أو بعيد.

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

Fetch — جلب؛ prune — تشذيب؛ stale remote-tracking ref — مرجع تتبُّع بعيد قديم؛ behind — متأخر؛ endpoint comparison — مقارنة الطرفين.

نص الفيديو

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

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