EduFlow
Git و GitHub
⁦0%⁩

الوحدة 3 · التعاون على GitHub

الـ Pull Requests ومراجعة الكود

17 دقراءة 4 درتّب الخطوات

الدرس في لمحة

افتح pull request من فرع مرفوع، واكتب وصفًا يستطيع المراجعون التصرّف بناءً عليه، وراجِع الكود وحدّثه عبر التعليقات والـ commits الجديدة، وادمج بالطريقة المناسبة.

  1. 1من الفرع إلى الـ pull request
  2. 2اكتب وصفًا يستطيع الناس التصرّف بناءً عليه
  3. 3المراجعة
  4. 4الدمج: ثلاثة أزرار، ثلاثة سجلّات

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

حين تعمل وحدك، دمج الفرع مجرد أمر. أما في الفريق فهو حوار: يقرأ شخص آخر التغيير، ويطرح الأسئلة، ويكتشف الخطأ الذي لم تره، وبعد ذلك فقط يصل إلى main. والـ pull request (طلب الدمج) على GitHub هو المكان الذي يجري فيه هذا الحوار. وحتى في موقع شخصي تعمل عليه وحدك يستحق الاستخدام، لأنك بعد بضعة دروس ستربط به فحوصًا آلية، ولأن أصحاب العمل ينظرون إلى طريقة عملك، لا إلى ما بنيته فقط.

من الفرع إلى الـ pull request

بنيت مرشّحًا (filter) لصفحة المشاريع على فرع ورفعته:

Terminal
git switch -c projects-filter
# …commits…
git push -u origin projects-filter

يتضمّن ناتج الرفع رابطًا: Create a pull request for 'projects-filter' on GitHub by visiting: https://github.com/maya-okafor/portfolio/pull/new/projects-filter. افتحه، أو انقر شريط “Compare & pull request” في صفحة الـ repository. تحقّق من محدّدي الفرعين: base هو المكان الذي يجب أن يذهب إليه العمل (main)، و compare هو فرعك.

ومع GitHub CLI، يطلب gh pr create عنوانًا ونصًا في الطرفية، و gh pr create --fill يستخدم رسائل الـ commits الخاصة بك.

وإن لم يكن العمل جاهزًا لكنك تريد ملاحظات مبكرة، فافتحه كـ draft pull request (مسوّدة). لا يمكن دمجه حتى تعلّمه بأنه جاهز، وهو يخبر المراجعين أن ينظروا إلى الاتجاه العام لا إلى التفاصيل.

اكتب وصفًا يستطيع الناس التصرّف بناءً عليه

العنوان يقول ما يفعله التغيير: “Add tag filter to projects page”. والنص يجيب عن ثلاثة أسئلة:

Markdown
## What
Adds tag buttons above the project grid; clicking one hides cards without that tag.

## Why
The grid has 14 projects now and visitors asked for a way to find the React ones.

## How to check
1. Open projects.html
2. Click "React": only 5 cards remain
3. Click "All": all 14 return

Closes #12

أضف لقطة شاشة لأي شيء مرئي؛ ويمكنك لصق الصور مباشرة في المربّع. السطر الأخير يستخدم كلمة إغلاق مفتاحية: حين يُدمج هذا الـ pull request في الفرع الافتراضي، يُغلق الـ issue رقم 12 تلقائيًا ويرتبط الاثنان ببعضهما. وتعمل Fixes و Resolves أيضًا.

المراجعة

يفتح المراجِع تبويب Files changed، الذي يعرض الـ diff بين فرعك وقاعدته. يستطيع التعليق على أي سطر، أو تحديد عدة أسطر لتعليق أشمل، أو كتابة suggestion (اقتراح): بديل مقترح تستطيع تطبيقه بنقرة واحدة كـ commit. وحين ينتهي، يرسل مراجعته بإحدى الحالات Comment أو Approve أو Request changes.

للردّ لا تفتح أي شيء جديد. نفّذ التغييرات محليًا، وأنشئ commit، وارفعه إلى الفرع نفسه:

Terminal
git commit -am "Rename filter class to project-filter"
git push

يتحدّث الـ pull request، ويرى المراجِع فقط ما تغيّر منذ مراجعته الأخيرة. ردّ على كل تعليق، وأغلق النقاشات المحسومة (resolve)، واطلب نظرة أخرى.

أبقِ الـ pull requests صغيرة. حين يبقى التغيير دون 400 سطر تقريبًا يستطيع المراجِع أن يفكّر فعلًا في كل سطر؛ أما الـ pull request ذو الألفي سطر فيُمرّ عليه سريعًا ويُوافَق عليه. وإن كانت الـ feature كبيرة، فقسّمها إلى سلسلة من الـ pull requests يترك كل منها الموقع يعمل.

الدمج: ثلاثة أزرار، ثلاثة سجلّات

بعد الموافقة، يعرض زر الدمج حتى ثلاث طرق، وتستطيع إعدادات الـ repository تقييدها:

  • Create a merge commit: كل الـ commits الخاصة بك مع merge commit، مثل git merge --no-ff.
  • Squash and merge: الـ commits الخاصة بك مجمّعة في commit واحد جديد على main، يحمل عنوان الـ pull request.
  • Rebase and merge: الـ commits الخاصة بك يُعاد تشغيلها على main واحدًا تلو الآخر، دون merge commit.

الـ Squash and merge خيار افتراضي شائع للـ pull requests الصغيرة: يحصل main على commit نظيف واحد لكل تغيير، وتختفي الـ commits من نوع “fix typo”. أما الـ merge commits فتناسب الأعمال الأكبر التي تروي فيها الـ commits المنفردة قصة مفيدة. اختر واحدة لكل repository والتزم بها.

بعد الدمج، انقر Delete branch على GitHub، ثم رتّب الأمور محليًا:

Terminal
git switch main
git pull
git branch -D projects-filter

لماذا -D وليس -d؟ بعد دمج بطريقة squash أو rebase، لا تكون الـ commits الأصلية في فرعك أسلافًا لـ main (فقد أنشأ GitHub commits جديدة)، لذا يظن -d أن العمل لم يُدمج. وبمجرد أن يعرض GitHub الـ pull request على أنه مدموج، يصبح -D آمنًا.

الانتقال إلى pull request شخص آخر لاختباره أمر واحد مع الـ CLI: gh pr checkout 14. في الدرس التالي ستستخدم بقية أدوات التعاون في GitHub: الـ issues والـ projects لتخطيط العمل، والـ forks للمساهمة في repositories لا تملكها.

أهم النقاط

  • الـ pull request يقترح دمج فرع في آخر، وهو المكان الذي يجري فيه النقاش والمراجعة والفحوص الآلية.
  • رفع commits إضافية إلى الفرع نفسه يحدّث الـ pull request المفتوح؛ ولا تحتاج أبدًا إلى فتح واحد جديد.
  • الوصف الجيد يقول ما الذي تغيّر، ولماذا، وكيف تتحقّق منه، والعبارة `Closes
  • الـ merge commit والـ squash and merge والـ rebase and merge تنتج سجلّات مختلفة على main؛ اختر عُرفًا واحدًا لكل repository.
  • بعد squash merge، ابدأ العمل الجديد على فرع جديد من main المحدَّث بدل مواصلة العمل على الفرع القديم.

قراءات إضافية

تحقّق من فهمك

4 أسئلة

السؤال 1 من 4

يطلب منك مراجِع إعادة تسمية class في CSS ضمن الـ pull request المفتوح. كيف تحدّث الـ pull request؟

السؤال 2 من 4

ينتهي وصف الـ pull request الخاص بك بـ `Closes

السؤال 3 من 4

يدمج فريقك الـ pull requests بطريقة squash. بعد دمج الـ pull request الخاص بك، واصلت إنشاء commits على الفرع نفسه وفتحت pull request ثانيًا. فظهرت فيه الـ commits القديمة مجددًا مع تعارضات. لماذا؟

السؤال 4 من 4

أيّ pull request يُرجَّح أن يحظى بأكثر المراجعات فائدة؟

تدريب

رتّب الخطوات

أوصِل مرشّح المشاريع عبر pull request

رتّب خطوات سير عمل الـ pull request، من بدء العمل على مرشّح المشاريع إلى وصوله إلى main مع ترتيب الـ repository المحلي.

استخدم أزرار الأسهم لإعادة الترتيب.

  1. 1يترك مراجِع تعليقات على الأسطر ويطلب تغييرات.
  2. 2git switch main، ثم git pull، ثم git switch -c projects-filter.
  3. 3محليًا: git switch main، ثم git pull، ثم git branch -D projects-filter.
  4. 4افتح pull request (القاعدة: main) يتضمّن ما الذي تغيّر ولماذا وكيف يُتحقَّق منه، و Closes #12.
  5. 5بعد الموافقة، انقر Squash and merge، ثم Delete branch.
  6. 6سجّل الإصلاحات في commits على projects-filter ونفّذ git push؛ فيتحدّث الـ pull request.
  7. 7سجّل العمل في commits وشغّل git push -u origin projects-filter.