توثيق شامل لأوامر Git

دليل مرجعي كامل لجميع أوامر Git مع شرح مفصل وأمثلة عملية لكل أمر

الإعداد والتهيئة

git config

يستخدم لضبط خيارات Git. يمكن تعيين الإعدادات على مستوى النظام، المستخدم، أو المشروع.

الاستخدامات الشائعة:

  • تعيين اسم المستخدم:
    git config --global user.name "اسمك هنا"
  • تعيين البريد الإلكتروني:
    git config --global user.email "بريدك@example.com"
  • عرض الإعدادات:
    git config --list
  • تعيين محرر النصوص الافتراضي:
    git config --global core.editor "code --wait"

ملاحظات مهمة:

  • • استخدم --global لتطبيق الإعدادات على جميع المشاريع للمستخدم الحالي.
  • • استخدم --system لتطبيق الإعدادات على جميع المستخدمين في النظام.
  • • بدون أي خيار، يتم تطبيق الإعدادات على المشروع الحالي فقط.

git init

ينشئ مستودع Git جديد. يقوم بإنشاء مجلد مخفي .git يحتوي على جميع البيانات اللازمة لتتبع المشروع.

الاستخدامات الشائعة:

  • إنشاء مستودع في المجلد الحالي:
    git init
  • إنشاء مستودع في مجلد محدد:
    git init [اسم-المجلد]
  • إنشاء مستودع فارغ (للخوادم):
    git init --bare

ملاحظات مهمة:

  • • بعد تنفيذ git init، المشروع لا يحتوي على أي ملفات متتبعة بعد.
  • • استخدم git add لبدء تتبع الملفات.
  • • المستودعات الفارغة (bare) تستخدم عادة كمستودعات مركزية للمشاريع المشتركة.

git clone

ينسخ مستودع موجود إلى مجلد جديد. يقوم بتنزيل جميع البيانات والتاريخ الكامل للمشروع.

الاستخدامات الشائعة:

  • نسخ مستودع:
    git clone https://github.com/user/repository.git
  • نسخ مستودع إلى مجلد محدد:
    git clone https://github.com/user/repository.git my-folder
  • نسخ فرع محدد فقط:
    git clone -b branch-name --single-branch https://github.com/user/repository.git
  • نسخ سطحي (بدون التاريخ الكامل):
    git clone --depth=1 https://github.com/user/repository.git

ملاحظات مهمة:

  • • يمكن استخدام بروتوكولات مختلفة: HTTPS أو SSH.
  • • النسخ السطحي يقلل من حجم التنزيل ويفيد في المشاريع الكبيرة.
  • • يتم إعداد المستودع البعيد تلقائياً باسم "origin".

الأوامر الأساسية

git add

يضيف تغييرات الملفات إلى منطقة الإعداد (staging area) استعداداً للالتزام (commit).

الاستخدامات الشائعة:

  • إضافة ملف محدد:
    git add filename.txt
  • إضافة جميع الملفات المتغيرة:
    git add .
  • إضافة جميع الملفات بما في ذلك المحذوفة:
    git add -A
  • إضافة أجزاء محددة من الملفات:
    git add -p

ملاحظات مهمة:

  • • الخيار -p (أو --patch) يتيح لك اختيار أجزاء محددة من التغييرات لإضافتها.
  • • استخدم git add *.js لإضافة جميع ملفات JavaScript.
  • • يمكن استخدام git add -u لإضافة الملفات المتتبعة فقط (بدون الملفات الجديدة).

git commit

يسجل التغييرات المضافة إلى منطقة الإعداد في تاريخ المستودع مع رسالة وصفية.

الاستخدامات الشائعة:

  • التزام مع رسالة:
    git commit -m "رسالة الالتزام"
  • إضافة والتزام في خطوة واحدة (للملفات المتتبعة):
    git commit -am "رسالة الالتزام"
  • تعديل الالتزام الأخير:
    git commit --amend
  • تعديل رسالة الالتزام الأخير:
    git commit --amend -m "رسالة جديدة"

ملاحظات مهمة:

  • • استخدم رسائل التزام وصفية ومختصرة.
  • • الخيار --amend يعدل الالتزام الأخير بدلاً من إنشاء التزام جديد.
  • • بدون الخيار -m، سيفتح Git محرر النصوص لكتابة رسالة مفصلة.
  • • تجنب استخدام --amend بعد دفع الالتزام إلى المستودع البعيد.

git status

يعرض حالة الملفات في مساحة العمل ومنطقة الإعداد، ويظهر الملفات المتغيرة والمضافة والغير متتبعة.

الاستخدامات الشائعة:

  • عرض الحالة الكاملة:
    git status
  • عرض الحالة بشكل مختصر:
    git status -s
  • عرض الفرع الحالي فقط:
    git status -b

ملاحظات مهمة:

  • • في الوضع المختصر (-s)، تظهر الملفات برموز: ?? للملفات الجديدة، M للمعدلة، A للمضافة.
  • • استخدم git status بانتظام للتحقق من حالة مساحة العمل.
  • • يمكن دمج الخيارات مثل git status -sb للحصول على عرض مختصر مع معلومات الفرع.

git diff

يعرض التغييرات بين مساحة العمل ومنطقة الإعداد أو بين منطقة الإعداد والالتزام الأخير.

الاستخدامات الشائعة:

  • عرض التغييرات غير المضافة:
    git diff
  • عرض التغييرات المضافة:
    git diff --staged
  • عرض التغييرات في ملف محدد:
    git diff filename.txt
  • عرض التغييرات بين التزامين:
    git diff commit1..commit2

ملاحظات مهمة:

  • • يمكن استخدام --color-words لعرض التغييرات على مستوى الكلمات.
  • • استخدم git diff HEAD لعرض جميع التغييرات منذ آخر التزام.
  • • يمكن استخدام أدوات خارجية لعرض الاختلافات بشكل أفضل عبر git difftool.

إدارة الفروع

git branch

يدير الفروع في المستودع. يستخدم لإنشاء وعرض وحذف الفروع.

الاستخدامات الشائعة:

  • عرض جميع الفروع المحلية:
    git branch
  • عرض جميع الفروع (المحلية والبعيدة):
    git branch -a
  • إنشاء فرع جديد:
    git branch branch-name
  • حذف فرع:
    git branch -d branch-name
  • حذف فرع بالقوة:
    git branch -D branch-name
  • إعادة تسمية الفرع الحالي:
    git branch -m new-name

ملاحظات مهمة:

  • • الفرع الحالي يظهر مع علامة * بجانبه.
  • • استخدم -d لحذف الفروع المدمجة فقط، و -D للحذف القسري.
  • • يمكن استخدام --merged و --no-merged لعرض الفروع المدمجة وغير المدمجة.

git checkout

يستخدم للتبديل بين الفروع أو استعادة ملفات من التزامات سابقة.

الاستخدامات الشائعة:

  • التبديل إلى فرع موجود:
    git checkout branch-name
  • إنشاء فرع جديد والتبديل إليه:
    git checkout -b new-branch
  • استعادة ملف من الالتزام الأخير:
    git checkout -- filename.txt
  • التبديل إلى التزام محدد:
    git checkout commit-hash

ملاحظات مهمة:

  • • استخدم git checkout - للعودة إلى الفرع السابق.
  • • الأمر git switch هو بديل أحدث لـ git checkout للتبديل بين الفروع.
  • • استخدم git restore بدلاً من git checkout -- لاستعادة الملفات في الإصدارات الحديثة.

git merge

يدمج التغييرات من فرع إلى الفرع الحالي.

الاستخدامات الشائعة:

  • دمج فرع في الفرع الحالي:
    git merge branch-name
  • دمج مع إنشاء التزام دمج دائماً:
    git merge --no-ff branch-name
  • دمج مع تجاهل التغييرات في حالة التعارض:
    git merge -Xours branch-name
  • إلغاء عملية الدمج:
    git merge --abort

ملاحظات مهمة:

  • • في حالة وجود تعارضات، يجب حلها يدوياً ثم استخدام git add و git commit.
  • • الخيار --no-ff يمنع الدمج السريع ويحتفظ بتاريخ الفرع.
  • • استخدم git mergetool لحل التعارضات باستخدام أداة رسومية.

git rebase

يعيد تطبيق التزامات من فرع على فرع آخر، مما يؤدي إلى تاريخ خطي أكثر نظافة.

الاستخدامات الشائعة:

  • إعادة قاعدة الفرع الحالي على فرع آخر:
    git rebase branch-name
  • إعادة قاعدة تفاعلية (لتعديل الالتزامات):
    git rebase -i HEAD~3
  • متابعة إعادة القاعدة بعد حل التعارضات:
    git rebase --continue
  • إلغاء عملية إعادة القاعدة:
    git rebase --abort

تحذير مهم:

  • لا تستخدم rebase على الفروع المشتركة التي يعمل عليها آخرون!
  • • إعادة القاعدة تعيد كتابة تاريخ المستودع، مما قد يسبب مشاكل في التعاون.
  • • استخدم git pull --rebase لتجنب التزامات الدمج غير الضرورية عند سحب التغييرات.

العمل عن بعد

git remote

يدير المستودعات البعيدة المرتبطة بالمستودع المحلي.

الاستخدامات الشائعة:

  • عرض المستودعات البعيدة:
    git remote -v
  • إضافة مستودع بعيد:
    git remote add origin https://github.com/user/repo.git
  • تغيير عنوان المستودع البعيد:
    git remote set-url origin https://github.com/user/new-repo.git
  • حذف مستودع بعيد:
    git remote remove origin

ملاحظات مهمة:

  • • يمكن إضافة عدة مستودعات بعيدة بأسماء مختلفة (مثل origin, upstream).
  • • استخدم git remote show origin لعرض معلومات مفصلة عن مستودع بعيد.
  • • عند استنساخ مستودع، يتم إضافة المستودع البعيد تلقائياً باسم "origin".

git push

يرسل التغييرات المحلية إلى المستودع البعيد.

الاستخدامات الشائعة:

  • دفع الفرع الحالي:
    git push origin branch-name
  • دفع جميع الفروع:
    git push --all origin
  • دفع الوسوم:
    git push origin --tags
  • دفع بالقوة (استخدم بحذر):
    git push origin branch-name --force
  • تعيين الفرع المحلي لتتبع الفرع البعيد:
    git push -u origin branch-name

تحذير مهم:

  • • استخدام --force يمكن أن يؤدي إلى فقدان التزامات الآخرين. استخدمه بحذر شديد.
  • • بديل أكثر أماناً هو --force-with-lease الذي يتحقق من عدم وجود تغييرات جديدة قبل الكتابة فوق التاريخ.
  • • استخدم -u (أو --set-upstream) في أول دفع لتعيين الفرع البعيد كمتتبع.

git pull

يجلب التغييرات من المستودع البعيد ويدمجها في الفرع المحلي الحالي.

الاستخدامات الشائعة:

  • سحب التغييرات من الفرع البعيد:
    git pull origin branch-name
  • سحب مع إعادة القاعدة بدلاً من الدمج:
    git pull --rebase origin branch-name
  • سحب من جميع الفروع البعيدة:
    git pull --all

ملاحظات مهمة:

  • • الأمر git pull هو اختصار لـ git fetch متبوعاً بـ git merge.
  • • استخدم --rebase للحصول على تاريخ أكثر نظافة بدون التزامات دمج إضافية.
  • • يمكن تعيين pull.rebase في الإعدادات لاستخدام rebase دائماً: git config --global pull.rebase true.

git fetch

يجلب التغييرات من المستودع البعيد دون دمجها في الفروع المحلية.

الاستخدامات الشائعة:

  • جلب التغييرات من جميع المستودعات البعيدة:
    git fetch --all
  • جلب التغييرات من مستودع محدد:
    git fetch origin
  • جلب فرع محدد:
    git fetch origin main
  • جلب التغييرات وحذف الفروع البعيدة التي تم حذفها:
    git fetch --prune

ملاحظات مهمة:

  • • على عكس git pull، لا يقوم git fetch بدمج التغييرات تلقائياً.
  • • يمكنك مراجعة التغييرات قبل دمجها باستخدام git diff.
  • • مفيد للاطلاع على التغييرات البعيدة دون التأثير على عملك المحلي.

git push

يرسل التغييرات المحلية إلى المستودع البعيد.

الاستخدامات الشائعة:

  • دفع التغييرات إلى الفرع الحالي:
    git push
  • دفع التغييرات إلى فرع محدد:
    git push origin main
  • دفع فرع محلي جديد إلى المستودع البعيد:
    git push -u origin feature-branch
  • دفع التغييرات بالقوة (استخدم بحذر):
    git push --force

ملاحظات مهمة:

  • • استخدم -u أو --set-upstream عند دفع فرع جديد لإعداد التتبع.
  • • تجنب استخدام --force إلا عند الضرورة لأنه قد يؤدي إلى فقدان تغييرات الآخرين.
  • • استخدم --force-with-lease كبديل أكثر أماناً للدفع بالقوة.

أوامر متقدمة

git rebase

يعيد تطبيق الالتزامات على رأس فرع آخر، مما يساعد في الحفاظ على تاريخ خطي نظيف.

الاستخدامات الشائعة:

  • إعادة قاعدة الفرع الحالي على فرع آخر:
    git rebase main
  • إعادة قاعدة تفاعلية لتعديل الالتزامات:
    git rebase -i HEAD~3
  • متابعة إعادة القاعدة بعد حل التعارضات:
    git rebase --continue

ملاحظات مهمة:

  • • لا تستخدم rebase على فروع مشتركة مع مطورين آخرين.
  • • يمكنك استخدام -i للوضع التفاعلي الذي يسمح بتعديل، دمج، أو حذف الالتزامات.
  • • استخدم --abort للخروج من عملية إعادة القاعدة في حالة حدوث مشاكل.

git stash

يحفظ التغييرات المحلية مؤقتاً للعمل على شيء آخر ثم العودة إليها لاحقاً.

الاستخدامات الشائعة:

  • حفظ التغييرات الحالية:
    git stash
  • حفظ التغييرات مع رسالة توضيحية:
    git stash save "رسالة توضيحية"
  • عرض قائمة التغييرات المحفوظة:
    git stash list
  • استعادة آخر تغييرات محفوظة:
    git stash apply
  • استعادة وحذف آخر تغييرات محفوظة:
    git stash pop

ملاحظات مهمة:

  • • يمكنك استعادة تغييرات محددة باستخدام git stash apply stash@{n}.
  • • استخدم git stash drop stash@{n} لحذف تغييرات محفوظة محددة.
  • git stash clear يحذف جميع التغييرات المحفوظة.

git cherry-pick

يطبق التغييرات من التزام محدد على الفرع الحالي.

الاستخدامات الشائعة:

  • تطبيق التزام واحد على الفرع الحالي:
    git cherry-pick commit-hash
  • تطبيق عدة التزامات:
    git cherry-pick commit1..commit2

ملاحظات مهمة:

  • • استخدم -n أو --no-commit لتطبيق التغييرات دون إنشاء التزام.
  • • استخدم --continue لمتابعة العملية بعد حل التعارضات.
  • • مفيد لنقل إصلاحات محددة من فرع إلى آخر.