الدرس 1 من 9 · الأساسيات
لماذا نحتاج إلى نظام لإدارة النسخ؟ تثبيت Git وإعداده
الهدف
فهم المشكلة التي يحلّها نظام إدارة النسخ (version control)، وتثبيت Git على جهازك وإعداده بشكل صحيح (الهوية، الفرع الافتراضي، المحرّر) حتى تكون أولى عمليات الـ commit نظيفة منذ البداية.
أهم النقاط
- يحتفظ نظام إدارة النسخ بتاريخ كل تعديل في المشروع: من، وماذا، ومتى، ولماذا. يمكننا الرجوع إلى الخلف، والمقارنة، والعمل ضمن فريق دون أن يمحو أحدنا عمل الآخر.
- Git نظام موزَّع: يملك كل مطوّر نسخة كاملة من التاريخ، ويمكنه العمل دون اتصال بالشبكة.
- قبل أول commit، اضبط على الأقل
user.nameوuser.email: فهما يُنقشان في كل commit. - يقرأ
git configالإعدادات ويكتبها على ثلاثة مستويات:--system(الجهاز كله)، و--global(حسابك)، و--local(مستودع واحد). الأقرب هو الذي يُطبَّق. - يحوّل
git initمجلدًا إلى مستودع: فهو ينشئ مجلدًا فرعيًا مخفيًا.gitيحتوي على التاريخ كله.
1. المشكلة: « index-final-v3-OK-vraiment.html »
تخيّل وكالة Atlas Web في الدار البيضاء (حي المعاريف): أربعة مطوّرين يبنون موقعًا لسلسلة محلات حلويات. دون أداة مناسبة، هذا ما يحدث:
- يرسل يوسف
index.htmlعبر WhatsApp إلى سلمى، فتعدّله بينما يواصل هو العمل على نسخته. في المساء، يجب الدمج يدويًا. - يطلب الزبون « أعيدوا الشريط الإعلاني الذي كان قبل أمس ». لم يعد أحد يعرف أي نسخة كانت.
- يظهر خلل (bug) في بيئة الإنتاج. من غيّر ماذا، ومتى؟ لغز.
- يحتوي المجلد المشترك على
site-final.zipوsite-final-v2.zipوsite-final-corrige-ilyas.zip…
يجيب نظام إدارة النسخ عن كل هذه الأسئلة:
| الحاجة | ما يفعله Git |
|---|---|
| الرجوع إلى الخلف | يمكن استرجاع كل حالة مسجّلة (commit) |
| معرفة من غيّر ماذا | يحمل كل commit مؤلفًا وتاريخًا ورسالة |
| العمل ضمن فريق | يعمل كل واحد على فرعه (branch)، ثم ندمج (merge) |
| التجربة دون مخاطرة | يُرمى فرع التجربة إن لم تنجح الفكرة |
| النسخ الاحتياطي | تحتوي كل نسخة من المستودع (الجهاز، خادم GitHub أو GitLab) على التاريخ كله |
مركزي أم موزَّع
كانت الأدوات القديمة (CVS وSubversion) مركزية: يعيش التاريخ على خادم واحد، ودون شبكة لا يمكن تسجيل أي شيء. أما Git، الذي أنشأه Linus Torvalds سنة 2005 لتطوير نواة Linux، فهو موزَّع: يحتوي حاسوبك على المستودع كاملًا. تُنجز عمليات commit في قطار الدار البيضاء-الرباط دون اتصال، ثم تشاركها لاحقًا.
Git ليس GitHub. Git هو البرنامج، وهو حرّ ومثبّت على جهازك. أما GitHub وGitLab وBitbucket فهي خدمات تستضيف مستودعات Git وتضيف حولها أدوات (مراجعة الشيفرة، التذاكر، CI/CD). ستتعرّف عليها في المستوى 2.
2. تثبيت Git
غالبًا ما يكون Git مثبّتًا مسبقًا. تحقّق أولًا:
git --version
# git version 2.47.2
إذا لم يُعثر على الأمر، ثبّته بواسطة مدير الحزم الخاص بنظامك:
# Debian, Ubuntu
sudo apt update && sudo apt install git
# Rocky Linux, AlmaLinux, RHEL, Fedora
sudo dnf install git
# macOS (أدوات سطر الأوامر من Apple، أو Homebrew)
xcode-select --install
brew install git
على Windows، ثبّت « Git for Windows » من موقع Git الرسمي: فهو يوفّر git وطرفية Git Bash ومديرًا لبيانات الاعتماد. يمكنك أيضًا العمل تحت WSL (نظام Ubuntu داخل Windows) وتثبيت Git بواسطة apt، كما على الخادم.
البحث في التوثيق
git help # الأوامر الأكثر استعمالًا
git help config # الدليل الكامل لأمر ما (يعادل man git-config)
git config -h # الملخّص القصير للخيارات
التوثيق الرسمي متاح أيضًا على الإنترنت، أمرًا بأمر، في موقع Git.
3. إعداد الهوية
يسجّل كل commit اسمًا وعنوان بريد إلكتروني. من دونهما، يرفض Git تنفيذ الـ commit أو يخترع هوية انطلاقًا من اسم الجهاز، مما يعطي تواريخ غير مقروءة (« root@pc-salle3 »).
git config --global user.name "Salma Bennani"
git config --global user.email "salma@agence-atlas.ma"
استعمل عنوان حسابك على GitHub أو GitLab: فبفضله يربط الموقع عمليات الـ commit بملفك الشخصي.
تحقّق:
git config --global user.name
# Salma Bennani
git config --list --show-origin
# file:/root/.gitconfig user.name=Salma Bennani
# file:/root/.gitconfig user.email=salma@agence-atlas.ma
مستويات الإعداد الثلاثة
| الخيار | الملف | النطاق |
|---|---|---|
--system |
/etc/gitconfig |
جميع مستخدمي الجهاز |
--global |
~/.gitconfig (أو ~/.config/git/config) |
حسابك، وجميع مستودعاتك |
--local (افتراضيًا داخل مستودع) |
.git/config الخاص بالمستودع |
هذا المستودع فقط |
المستوى الأدق هو الذي يُطبَّق. حالة نموذجية: مستقلّ (freelance) يعمل لصالح Atlas Web ولصالح زبائنه الخاصين، يحتفظ بعنوانه الشخصي على المستوى العام، ويضع عنوان الوكالة فقط في مستودعات الوكالة:
cd ~/projets/patisserie-atlas
git config user.email "karim@agence-atlas.ma" # --local : هذا المستودع فقط
git config --show-origin user.email
# file:.git/config karim@agence-atlas.ma
الملف ~/.gitconfig ملف نصي بسيط، يمكن قراءته وتعديله:
[user]
name = Salma Bennani
email = salma@agence-atlas.ma
[init]
defaultBranch = main
4. إعدادات مفيدة أخرى
# اسم الفرع الذي ينشئه git init (وإلا « master » في كثير من النسخ)
git config --global init.defaultBranch main
# المحرّر المستعمل لكتابة رسائل الـ commit الطويلة
git config --global core.editor "nano" # أو "vim"، أو "code --wait" لـ VS Code
# الألوان في الطرفية (مفعّلة افتراضيًا في النسخ الحديثة)
git config --global color.ui auto
# نهايات الأسطر: على Windows، تحويل CRLF/LF تلقائيًا
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # Linux و macOS
# اختصارات شخصية (alias)
git config --global alias.st status
git config --global alias.lg "log --oneline --graph --all"
لقراءة إعداد أو حذفه:
git config --global --get core.editor
git config --global --unset alias.st
نهايات الأسطر. في فريق مختلط Windows/Linux، قد يبدو ملف « معدّلًا بالكامل » لمجرد أن نهايات الأسطر تغيّرت. اضبط
core.autocrlfمنذ البداية؛ وسترى في المستوى 3 أن ملف.gitattributesيسمح بفرض القاعدة على الفريق كله.
5. إنشاء أول مستودع
mkdir -p ~/projets/vitrine
cd ~/projets/vitrine
git init
# Initialized empty Git repository in /root/projets/vitrine/.git/
ls -a
# . .. .git
المجلد .git هو المستودع: التاريخ، والفروع، والإعدادات المحلية. أما باقي المجلد فهو نسخة العمل (working copy) الخاصة بك. لا تعدّل .git يدويًا أبدًا، ولا تحذفه: ستفقد التاريخ كله.
يقبل git init أيضًا مسارًا: git init /srv/projets/vitrine ينشئ المجلد عند الحاجة.
لننشئ أول ملف ونسجّله:
echo '<h1>Pâtisserie Atlas</h1>' > index.html
git status
# On branch main
# No commits yet
# Untracked files:
# index.html
git add index.html # « أريد تسجيل هذا الملف »
git commit -m "Premier commit : page d'accueil"
# [main (root-commit) 3f2a9c1] Premier commit : page d'accueil
# 1 file changed, 1 insertion(+)
git log --oneline
# 3f2a9c1 (HEAD -> main) Premier commit : page d'accueil
لقد أنجزت للتو أول commit لك. يشرح الدرس التالي بالتفصيل مناطق Git الثلاث (نسخة العمل، الفهرس index، المستودع) والأوامر add وcommit وstatus وlog وdiff.
6. المفردات الأساسية
| المصطلح | المعنى |
|---|---|
| المستودع (repository) | المشروع الذي يتتبّعه Git، مع تاريخه كله (المجلد .git) |
| commit | لقطة مسجّلة للمشروع، مع المؤلف والتاريخ والرسالة |
| hash (أو SHA) | المعرّف الفريد لـ commit، مثلًا 3f2a9c1… (40 حرفًا، غالبًا ما تُختصر إلى 7) |
| الفرع (branch) | خط تطوير؛ main هو الفرع الرئيسي |
| HEAD | « حيث أنت الآن »: الـ commit (والفرع عادةً) المستخرج حاليًا |
| البعيد (remote) | نسخة أخرى من المستودع، غالبًا على GitHub أو GitLab |
أخطاء متكررة
- تنفيذ commit بهوية خاطئة: تحقّق من
git config user.emailفي كل مستودع جديد إذا كانت لديك عدة حسابات. العنوان الذي لا يطابق أي حساب على GitHub يعطي عمليات commit « يتيمة ». git initفي المجلد الخطأ (مجلدك الشخصي بأكمله مثلًا): يعرضgit statusحينها آلاف الملفات. احذف ببساطة الـ.gitالذي أُنشئ خطأً بواسطةrm -rf ~/.git، بعد التحقق من المسار.- الخلط بين Git وGitHub: يمكن استعمال Git طوال الحياة دون حساب على GitHub؛ فالمستودع المحلي مستودع كامل.
- نسيان
-m: دون رسالة، يفتحgit commitالمحرّر المضبوط. إذا كانvimوتهت فيه، اضغطÉchap، ثم:q!وEntréeللإلغاء.
التطبيق العملي (Lab)
في هذا المختبر (حاوية Debian فيها Git)، تنطلق من جهاز لم يُضبط فيه Git قطّ:
- تسجّل هويتك العامة؛
- تضبط الفرع الافتراضي على
main؛ - تنشئ المستودع
/root/vitrineبواسطةgit init؛ - تنجز فيه أول commit مع ملف
index.html.
تحقّق من عملك بواسطة git config --list وgit status وgit log --oneline.
اختبار قصير
- اذكر مشكلتين ملموستين يحلّهما نظام إدارة النسخ داخل فريق.
- ماذا تعني عبارة « Git موزَّع »؟
- ما الفرق بين
git config --globalوgit config --local؟ أيّهما يُطبَّق؟ - ماذا يحتوي المجلد
.gitالذي ينشئهgit init؟ - لماذا يجب ضبط
user.emailقبل أول commit؟
الأجوبة
- مثلًا: استرجاع نسخة قديمة من ملف، ومعرفة من عدّل ماذا ومتى، والسماح لعدة أشخاص بالعمل في الوقت نفسه دون محو عمل الآخرين.
- تحتوي كل نسخة من المستودع على التاريخ كله: يمكن تنفيذ commit، أو الاطلاع على السجلّ، أو إنشاء فروع دون خادم ولا شبكة.
- ينطبق
--globalعلى جميع مستودعاتك (الملف~/.gitconfig)؛ و--localعلى مستودع واحد (.git/config). الإعداد المحلي هو الذي يُطبَّق، لأنه الأدق. - المستودع كله: تاريخ عمليات الـ commit، والفروع، والوسوم (tags)، والإعدادات المحلية. حذفه يعني فقدان التاريخ.
- لأن الهوية تُنقش في كل commit وتُستعمل لربط عمليات الـ commit بحسابك على GitHub أو GitLab؛ وتصحيحها لاحقًا يفرض إعادة كتابة التاريخ.
المراجع: التوثيق الرسمي لـ Git (git-scm.com). نص أصلي من MasterLinux.