الإعداد والتهيئة
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
لمتابعة العملية بعد حل التعارضات. - • مفيد لنقل إصلاحات محددة من فرع إلى آخر.