# GitLab: ما هو وكيف تعمل معه عبر Git: clone وpush وmerge request وCI/CD

URL: https://skillaria.top/ar/guides/git/what-is-gitlab

GitLab منصة ويب لتخزين مستودعات Git والعمل الجماعي عليها: الكود وmerge request والمهام وCI/CD المدمج في مكان واحد. يمكن استخدامه على السحابة عبر gitlab.com أو على خادم الشركة الخاص، ويُرسَل الكود ويُستقبَل بأوامر Git المعتادة مثل clone وpush وpull.

## GitLab ما هو

GitLab منصة تُحفظ فيها مستودعات Git ويُبنى حولها العمل الجماعي: استعراض الكود، وطلبات الدمج (merge request)، والمهام، والويكي، وسجل الحاويات، وCI/CD المدمج. وباختصار، GitLab هو «GitHub مع خط بناء مدمج وإمكانية تشغيله على خادمك الخاص». وتحتفظ شركات كثيرة، خاصةً الكبيرة منها، بكودها في GitLab منشور داخل شبكتها الداخلية.

بدأ المشروع عام 2011 كتطبيق مفتوح لاستضافة الكود، ثم نمت حوله الشركة GitLab Inc. تتوفر المنصة في نسختين: Community Edition وهي النسخة المفتوحة التي تُثبَّت مجاناً على خادمك، وEnterprise Edition بمزايا مدفوعة. وفي gitlab.com تُسمى الخطط Free وPremium وUltimate.

من المهم عدم الخلط بين المفهومين. Git برنامج تحكم في الإصدارات يعمل على حاسوبك. أما GitLab فخدمة تحفظ نسخة بعيدة من المستودع وتضيف إليها واجهة وأدوات للفريق. لا يمكن العمل مع GitLab دون Git، لكن Git يعمل بشكل ممتاز دون GitLab.

## Git وGitLab: الفرق بينهما

يسأل الناس «git و gitlab ما الفرق» عادةً حين تظهر الكلمتان معاً في وصف وظيفة أو في أول يوم عمل. والفرق يشبه الفرق بين المستند والتخزين السحابي: يتتبع Git تغييرات الملفات ويحفظ سجل الـ commits والفروع محلياً. ويستقبل GitLab هذا السجل عبر الشبكة ويعرضه في المتصفح.

|  | Git | GitLab |
| --- | --- | --- |

| ما هو | برنامج للتحكم في الإصدارات | منصة ويب للمستودعات والعمل الجماعي |

| أين يعمل | على حاسوب المطور | على gitlab.com أو على خادم الشركة |

| هل يحتاج إلى الإنترنت | لا، إلا عند push وpull وfetch وclone | نعم، فهو خدمة شبكية |

| أهم وظائفه | الـ commits والفروع والدمج والسجل | merge request والمراجعة والمهام وCI/CD وصلاحيات الوصول |

| كيف يُستخدم | سطر الأوامر، أو بيئة التطوير، أو واجهات Git الرسومية | المتصفح مع أوامر Git المعتادة |

كل العمليات على الكود، مثل commit وbranch وmerge، تنفذها في Git كما كنت تفعل. أما GitLab فيستقبل النتيجة بأمر `git push` ويتيح مناقشتها مع الزملاء.

## GitLab وGitHub: ما الذي يختلف

تحفظ المنصتان مستودعات Git وتدعمان مراجعة الكود، لذلك تنتقل المهارات الأساسية كما هي. الاختلافات في التركيز وطريقة النشر.

| المعيار | GitLab | GitHub |
| --- | --- | --- |

| طلب الدمج | Merge request (MR) | Pull request (PR) |

| CI/CD | GitLab CI/CD المدمج، والملف `.gitlab-ci.yml` | GitHub Actions، والملفات في `.github/workflows/` |

| التثبيت على خادم خاص | Community Edition مجانية على خادمك | GitHub Enterprise Server، بمقابل |

| الكود المصدري للمنصة | مفتوح (Community Edition) | مغلق |

| تجميع المشاريع | مجموعات ومجموعات فرعية متداخلة | المؤسسات (Organizations) |

| الأكثر انتشاراً في | تطوير الشركات والخوادم الداخلية | المشاريع مفتوحة المصدر والمشاريع العامة والمحافظ الشخصية |

في الممارسة يستخدم كثير من المطورين المنصتين معاً: المشاريع الشخصية والمحافظ على GitHub، والكود الخاص بالعمل على GitLab المؤسسي. أوامر Git واحدة في الحالتين، ويتغير فقط عنوان المستودع البعيد.

## gitlab.com أم خادم خاص (self-hosted)

يناسب gitlab.com السحابي المشاريع الشخصية والفرق الصغيرة: تسجل وتنشئ المستودعات فوراً. التحديثات والنسخ الاحتياطية والتوفر من مسؤولية GitLab. وتتغير قيود الخطة المجانية (عدد الأعضاء، ودقائق CI، ومساحة التخزين) من وقت لآخر، لذلك راجع الشروط الحالية في صفحة الخطط.

أما الـ self-hosted GitLab فتُثبّته الشركة على خادمها الخاص: من حزمة Linux، أو عبر Docker، أو Kubernetes. الكود لا يغادر الشبكة الداخلية، ويمكن ربط تسجيل الدخول المؤسسي عبر LDAP، وإعداد مشغّلات (runners) خاصة للبناء. وبالمقابل يتولى المسؤولون التحديثات والنسخ الاحتياطية بأنفسهم. والفرق بالنسبة للمطور يكاد لا يُلاحَظ: العنوان لن يكون `gitlab.com`، بل مثلاً `gitlab.company.com`.

## إعداد Git للعمل مع GitLab

قبل أول commit حدد الاسم والبريد الإلكتروني، فيظهران في السجل، ويربط GitLab الـ commits بملفك الشخصي عبر البريد:

```
git config --global user.name "Ahmed Ali"
git config --global user.email "ahmed@example.com"
```

على Windows يُفضَّل العمل في Git Bash، فهو يأتي مع Git for Windows ويحتوي على `ssh-keygen`، لذلك تعمل كل أوامر هذه المقالة فيه دون تغيير. بعد ذلك اختر طريقة الدخول: HTTPS مع رمز، أو مفتاح SSH.

### الدخول عبر HTTPS: personal access token

لا يُنصح باستخدام كلمة مرور الحساب في عمليات Git عبر HTTPS، ومع تفعيل التحقق الثنائي لن تنجح أصلاً. بدلاً منها أنشئ personal access token من إعدادات الملف الشخصي في GitLab (قسم Access tokens). وللعمل على الكود تكفي الصلاحيتان `read_repository` و`write_repository`. حدد مدة الصلاحية واحفظ الرمز فوراً، فلن يُعرض مرة أخرى.

عند أول push أو clone يسألك Git عن اسم المستخدم وكلمة المرور: أدخل اسم مستخدم GitLab، وبدلاً من كلمة المرور الرمز. ومدير بيانات الاعتماد (وهو مدمج في Git for Windows) سيحفظه، فلن تحتاج إلى إدخاله مرة أخرى.

### الدخول عبر مفتاح SSH

SSH أنسب للعمل اليومي: تضيف المفتاح مرة واحدة، ولا تُدخل شيئاً بعد ذلك.

```
ssh-keygen -t ed25519 -C "ahmed@example.com"
cat ~/.ssh/id_ed25519.pub
```

الصق محتوى الملف `.pub` (المفتاح العام) في إعدادات الملف الشخصي في GitLab ضمن قسم SSH Keys. وللتحقق من الاتصال:

```
ssh -T git@gitlab.com
Welcome to GitLab, @ahmed.ali!
```

## Git clone من GitLab: كيف تستنسخ مستودعاً

في صفحة المشروع يوجد زر Code يعرض عنوانين، واحداً لـ SSH وآخر لـ HTTPS. انسخ العنوان المطلوب ونفّذ `git clone`:

```
# عبر HTTPS
git clone https://gitlab.com/my-group/my-project.git

# عبر SSH
git clone git@gitlab.com:my-group/my-project.git
```

في GitLab قد يتضمن مسار المشروع مجموعات فرعية، مثل `gitlab.com/company/backend/api.git`، وهذا طبيعي، فانسخ العنوان كاملاً.

### Git clone من GitLab بالرمز

في السكربتات وعلى الخوادم التي لا يوجد فيها من يُدخل كلمة المرور، يُمرَّر الرمز داخل العنوان مباشرة. ويمكن أن يكون اسم المستخدم اسمك في GitLab أو الاسم الخاص `oauth2`:

```
git clone https://oauth2:YOUR_TOKEN@gitlab.com/my-group/my-project.git
```

انتبه: هذا العنوان سيُحفظ في `.git/config` وقد يصل إلى سجل أوامر الطرفية (shell history). للأتمتة الأفضل استخدام deploy token أو project access token بأقل الصلاحيات ومدة محددة، وفي CI استخدام المتغير المدمج `CI_JOB_TOKEN`.

## Git push إلى GitLab: إرسال الكود

إذا كان المشروع موجوداً محلياً فأنشئ مشروعاً فارغاً في GitLab (بدون README حتى لا يُنشأ commit إضافي)، ثم اربط المستودع البعيد:

```
git remote add origin git@gitlab.com:my-group/my-project.git
git branch -M main
git push -u origin main
```

يربط العلم `-u` الفرع المحلي بالفرع البعيد، وبعد ذلك يكفي كتابة `git push` و`git pull`. ودورة العمل المعتادة لا تختلف عن أي خدمة أخرى:

```
git switch -c feature/login
git add .
git commit -m "إضافة نموذج تسجيل الدخول"
git push -u origin feature/login
git pull
```

تُرسل الوسوم (tags) بشكل منفصل: `git push origin v1.2.0`، أو كلها معاً عبر `git push --tags`. في GitLab تظهر الوسوم في قسم Tags، وغالباً ما تُشغّل خط إصدار (pipeline) للنشر.

### أخطاء شائعة في git push إلى GitLab

- **HTTP Basic: Access denied** — اسم المستخدم خاطئ أو أدخلت كلمة المرور بدل الرمز. أنشئ رمزاً بصلاحية `write_repository` واحذف السجل القديم من مدير بيانات الاعتماد.
- **Permission denied (publickey)** — لم يتعرف GitLab على مفتاح SSH. تحقق من إضافة المفتاح العام إلى الملف الشخصي، ونفّذ `ssh -T git@gitlab.com`.
- **You are not allowed to push code to protected branches** — الفرع (عادةً `main`) محمي. أرسل التغييرات إلى فرعك وافتح merge request.
- **rejected ... (fetch first)** — توجد على الخادم commits ليست لديك. نفّذ `git pull --rebase` ثم أعد الـ push.
- **remote: Project not found** — خطأ في العنوان، أو ليست لديك صلاحية الوصول إلى المشروع؛ استعلم عن دورك من المالك.

## Merge request في GitLab

merge request نظير pull request في GitHub: طلب بدمج فرعك في الفرع الرئيسي. وهنا يترك الزملاء تعليقاتهم على أسطر الكود، وتعمل فحوص CI، ويُتخذ قرار الدمج. بعد push لفرع جديد يطبع GitLab في الطرفية رابطاً لإنشاء MR، وتعرض واجهة الويب اقتراحاً بإنشائه.

يمكن إنشاء MR مباشرة من سطر الأوامر باستخدام push options:

```
git push -o merge_request.create -o merge_request.target=main origin feature/login
```

الدورة المعتادة: فرع للمهمة، ثم commits، ثم push، ثم MR، ثم مراجعة وخط بناء أخضر، ثم دمج. وعند الدمج يستطيع GitLab دمج الـ commits في commit واحد (squash) وحذف الفرع المصدر. وإذا ظهر تعارض في MR فالأسهل تحديث الفرع محلياً بـ `git pull --rebase origin main` أو `git merge main`، ثم حل التعارضات وإعادة الـ push.

ضع علامة Draft على العمل غير المكتمل: لن يُدمج MR كهذا بالخطأ، لكن الزملاء يرون التغييرات ويستطيعون مناقشتها.

## CI/CD في GitLab: ملف .gitlab-ci.yml

الميزة الأبرز في GitLab هي CI/CD المدمج. يكفي وضع الملف `.gitlab-ci.yml` في جذر المستودع، وعند كل push يُشغّل GitLab خط تنفيذ (pipeline) مكوّناً من مراحل (stages) ومهام (jobs). وتنفّذ المهام المشغّلات (runners): على gitlab.com توجد مشغّلات مشتركة، وعلى خادمك تُثبَّت مشغّلات خاصة.

```
stages:
  - test
  - deploy

test:
  stage: test
  image: python:3.12
  script:
    - pip install -r requirements.txt
    - pytest

deploy:
  stage: deploy
  script:
    - ./deploy.sh
  rules:
    - if: $CI_COMMIT_TAG
```

هنا تعمل الاختبارات عند كل push، أما المهمة `deploy` فتعمل فقط عند إرسال وسم: `git tag v1.0.0` ثم `git push origin v1.0.0`. تظهر نتائج خط التنفيذ مباشرة داخل merge request، ويمكن منع الدمج قبل نجاح الفحوص.

## كيف تحذف مستودعاً في GitLab

أوامر Git لا تستطيع حذف المشروع على الخادم، فـ `git push` يغيّر الفروع والوسوم فقط. يُحذف المشروع من واجهة الويب: إعدادات المشروع، ثم قسم General، ثم القسم Advanced، وزر الحذف مع تأكيد اسم المشروع. وتحتاج إلى دور Owner. النسخة المحلية تبقى بعد ذلك، وهي مجرد مجلد يحوي `.git`.

إذا أردت فصل المستودع المحلي عن GitLab دون حذف شيء على الخادم، فيكفي `git remote remove origin`.

## متى تختار GitLab

- لا يمكن نقل الكود إلى سحابة خارجية، وتحتاج إلى خادم خاص بك.
- تحتاج إلى CI/CD جاهز دون خدمات خارجية.
- مؤسسة كبيرة ذات هيكل فرق متدرج، فالمجموعات الفرعية المتداخلة والأدوار المرنة مفيدة.
- تنضم إلى شركة تستخدم GitLab أصلاً: عندها لا يوجد خيار، لكن مهارات Git تنتقل كاملة.

للمحافظ الشخصية ومشاريع المصدر المفتوح يختار كثيرون GitHub، لأن مجتمعه أكبر وظهور المشاريع فيه أوسع. ولا يمنعك شيء من الاحتفاظ بالمشروع في المنصتين معاً، فللمستودع الواحد أكثر من remote.

## الخلاصة

GitLab منصة لمستودعات Git تدعم المراجعة عبر merge request والمهام وCI/CD المدمج، ويعمل على السحابة أو على خادم خاص. والعمل معه يقوم على أوامر مألوفة: اضبط الدخول بالرمز أو مفتاح SSH، ثم clone وcommit وpush وmerge request. وتُشرح المستودعات البعيدة وسير العمل الجماعي عملياً في دورة Git.

## FAQ

**هل GitLab مجاني؟**

نسخة Community Edition للتثبيت على خادمك مجانية، وفي gitlab.com توجد خطة Free مجانية بقيود، أما الميزات المتقدمة فتتوفر في الخطط المدفوعة Premium وUltimate.

**هل يمكن نقل مشروع من GitHub إلى GitLab؟**

نعم، يوفر GitLab استيراد المشاريع من GitHub، ويمكن أيضاً نقل السجل يدوياً عبر git clone --mirror من العنوان القديم ثم git push --mirror إلى الجديد.

**هل أحتاج إلى تعلم أوامر خاصة بـ GitLab؟**

لا، فالعمل مع الكود يتم بأوامر Git المعتادة، ويضيف GitLab واجهة الويب، وللأتمتة توجد الأداة الطرفية glab وواجهة API.

**ما الفرق بين GitLab Flow وGit Flow؟**

GitLab Flow أبسط: العمل في فروع feature مع merge request إلى main، وتُضاف فروع منفصلة للبيئات والإصدارات عند الحاجة، دون فرعي develop وhotfix الخاصين بـ Git Flow.


---
Source: Skillaria.Top (https://skillaria.top)
