🐙 Git و GitHub CLI
أوامر Git الأساسية والمتقدمة للتحكم في الإصدارات، الفروع، المستودعات البعيدة، التخزين المؤقت، العلامات و GitHub CLI.
🔹 الأوامر الأساسية
| الأمر | مثال | الوصف | 
|---|---|---|
| git add | إضافة ملف إلى منطقة التحضير (staging) | |
| git add file.txt | تحضير ملف محدد للالتزام القادم | |
| git add . | تحضير جميع التغييرات في المجلد الحالي وما تحته | |
| git add -p | اختيار الأجزاء المراد تحضيرها بشكل تفاعلي (مفيد للالتزامات الجزئية) | |
| git clone | استنساخ مستودع إلى مجلد جديد | |
| git clone -b branch_name URL | استنساخ فرع محدد فقط (بدلاً من الافتراضي) | |
| git clone --depth 1 URL | استنساخ الالتزام الأخير فقط كنسخة سطحية لتوفير الوقت والمساحة | |
| git commit | تسجيل التغييرات في المستودع | |
| git commit -m "Initial commit" | التزام مع رسالة بدون فتح المحرر | |
| git commit -a -m "Fix bugs" | تحضير والتزام جميع الملفات المعدلة برسالة | |
| git commit --amend | تحديث الالتزام الأخير (تغيير الرسالة أو إضافة تغييرات) | |
| git commit --fixup abc1234 | إنشاء التزام fixup ليتم دمجه تلقائيًا لاحقًا أثناء rebase تفاعلي | |
| git config | الحصول على إعدادات المستودع أو تعيينها (محلية أو عامة) | |
| git config --global user.name "Name" | تعيين اسم المستخدم العالمي لـ Git | |
| git config --global user.email "email@example.com" | تعيين البريد الإلكتروني العالمي لـ Git | |
| git config --list | عرض جميع إعدادات Git (الاسم، البريد الإلكتروني، المحرر، إلخ) | |
| git diff | عرض التغييرات بين الالتزامات أو بين الالتزام ومساحة العمل | |
| git diff HEAD | عرض ما تغير منذ آخر التزام (تغييرات غير محضرة) | |
| git diff --staged | عرض ما سيتم تضمينه في الالتزام القادم | |
| git diff --word-diff HEAD~1 | عرض التغييرات على مستوى الكلمات | |
| git grep | البحث داخل ملفات المستودع | |
| git grep "functionName" | البحث عن جميع إشارات  | |
| git grep -n "TODO" | البحث عن الأسطر التي تحتوي على  | |
| git grep -i "login" | البحث عن كلمة  | |
| git init | إنشاء مستودع Git فارغ أو إعادة تهيئة مستودع موجود | |
| git init my-project | تهيئة مستودع جديد في مجلد my-project | |
| git init --bare | تهيئة مستودع bare | |
| git log | عرض سجلات الالتزامات | |
| git log --oneline | عرض تاريخ الالتزامات في صيغة مختصرة | |
| git log --graph --all | عرض جميع الفروع في رسم بياني مرئي | |
| git log -p --stat | عرض التصحيحات وإحصائيات تغييرات الملفات للالتزامات | |
| git reset | إلغاء تحضير الملفات مع الاحتفاظ بالتغييرات في مساحة العمل | |
| git reset HEAD file.txt | إزالة ملف من التحضير (مع الاحتفاظ بالتعديلات) | |
| git reset --hard HEAD~1 | الرجوع التزامًا واحدًا وحذف جميع التغييرات (غير قابل للاسترجاع!) | |
| git reset --soft HEAD~1 | إلغاء الالتزام الأخير مع الاحتفاظ بالتغييرات جاهزة للالتزام مجددًا | |
| git reset --mixed HEAD~1 | إلغاء الالتزام مع الاحتفاظ بالتغييرات غير محضرة في مساحة العمل | |
| git show | عرض أنواع مختلفة من الكائنات | |
| git show <commit_hash> | عرض التغييرات ورسالة الالتزام المحدد | |
| git show HEAD~1 | عرض الالتزام السابق للحالي | |
| git show --stat | عرض ملخص لتغييرات الملفات في الالتزام الأخير | |
| git status | عرض حالة مساحة العمل | |
| git status -s | عرض الحالة بصيغة مختصرة | |
| git status -b | عرض الفرع الحالي وحالة الملفات | 
🌿 إنشاء الفروع والدمج
| الأمر | مثال | الوصف | 
|---|---|---|
| git branch | إنشاء أو عرض أو حذف الفروع | |
| git branch new-feature | إنشاء فرع جديد باسم  | |
| git branch -d old-feature | حذف فرع محلي باسم  | |
| git checkout | التبديل بين الفروع أو استعادة الملفات من التزامات أخرى | |
| git checkout main | التبديل إلى الفرع  | |
| git checkout -b new-branch | إنشاء والتبديل إلى فرع جديد باسم  | |
| git switch | التبديل بين الفروع (بديل مبسط لـ checkout) | |
| git switch main | التبديل إلى الفرع  | |
| git switch -c feature-x | إنشاء والتبديل إلى فرع جديد باسم  | |
| git switch new-feature | التبديل إلى فرع موجود باسم  | |
| git merge | دمج التغييرات من فرع آخر في الفرع الحالي | |
| git merge new-feature | دمج فرع  | |
| git merge --no-ff new-feature | إنشاء التزام دمج دائم حتى عند إمكانية fast-forward | |
| git merge --abort | إلغاء الدمج والتراجع إذا حدثت تعارضات | |
| git rebase | إعادة تطبيق الالتزامات على قاعدة جديدة | |
| git rebase main | إعادة تطبيق التزامات الفرع فوق فرع  | |
| git rebase -i HEAD~3 | تحرير آخر 3 التزامات بشكل تفاعلي | |
| git rebase --abort | إيقاف وإلغاء عملية rebase جارية | |
| git rebase -i --autosquash HEAD~5 | دمج الالتزامات المحددة كـ fixup أو squash تلقائيًا أثناء rebase | |
| git cherry-pick | تطبيق التزامات محددة من فرع آخر | |
| git cherry-pick <hash> | تطبيق التزام محدد (بواسطة hash) على الفرع الحالي | |
| git cherry-pick --continue | متابعة cherry-pick بعد حل التعارضات | |
| git cherry-pick A^..B | تطبيق نطاق من الالتزامات بين  | 
📡 المستودعات البعيدة
| الأمر | مثال | الوصف | 
|---|---|---|
| git remote | إدارة الروابط مع المستودعات البعيدة (مثل GitHub) | |
| git remote -v | عرض أسماء remotes وروابطها | |
| git remote add origin URL | إضافة مستودع بعيد باسم  | |
| git pull | تحميل ودمج التغييرات من فرع بعيد | |
| git pull origin main | جلب ودمج تغييرات فرع  | |
| git pull --rebase origin main | جلب وإعادة تطبيق فرعك على فرع بعيد بدلًا من الدمج | |
| git push | رفع تغييراتك المحلية إلى مستودع بعيد | |
| git push origin main | دفع فرعك المحلي  | |
| git fetch | تحميل التغييرات من البعيد بدون دمج | |
| git fetch origin | جلب جميع التحديثات من  | |
| git fetch origin main | جلب فرع  | |
| git fetch --all | جلب التحديثات من جميع remotes | |
| git fetch --prune | تنظيف الفروع المحذوفة على البعيد | |
| git fetch --dry-run | عرض ما سيتم جلبه بدون تنزيل | |
| git fetch origin +main | تحديث فرع التتبع المحلي بقوة ( | 
📦 التخزين المؤقت والتنظيف
| الأمر | مثال | الوصف | 
|---|---|---|
| git stash | حفظ التغييرات غير الملتزمة مؤقتًا (العمل الجاري) | |
| git stash | حفظ الملفات المعدلة والمحجوزة ثم العودة لآخر التزام | |
| git stash apply | إعادة تطبيق آخر stash (مع بقائه محفوظًا) | |
| git stash pop | إعادة تطبيق وحذف آخر stash | |
| git stash list | عرض قائمة جميع stashes | |
| git stash branch feature-fix | إنشاء فرع جديد وتطبيق أحدث stash عليه | |
| git clean | حذف الملفات غير المتتبعة (غير موجودة في Git) بشكل دائم | |
| git clean -f | حذف الملفات غير المتتبعة في المجلد الحالي | |
| git clean -fd | حذف الملفات والمجلدات غير المتتبعة | |
| git clean -n | معاينة ما سيتم حذفه (تشغيل آمن) | 
🏷️ العلامات
| الأمر | مثال | الوصف | 
|---|---|---|
| git tag | إنشاء أو عرض أو حذف العلامات لتحديد نقاط محددة في التاريخ (مثل الإصدارات) | |
| git tag -a v1.0 -m "Version 1.0" | إنشاء علامة annotated باسم  | |
| git tag -d v1.0 | حذف العلامة المحلية  | |
| git push | رفع الالتزامات والفروع والعلامات من المحلي إلى البعيد | |
| git push origin --tags | رفع جميع العلامات المحلية إلى البعيد | |
| git push origin v1.0 | رفع علامة محددة (مثل  | |
| git push origin :refs/tags/v1.0 | حذف العلامة البعيدة  | 
🛠️ حل التعارضات
| الأمر | مثال | الوصف | 
|---|---|---|
| git mergetool | فتح أداة مرئية لحل تعارضات الدمج | |
| git mergetool --tool=meld | استخدام أداة محددة (مثل Meld) لحل التعارضات | |
| git rerere | السماح لـ Git بتذكر كيفية حل التعارضات سابقًا | |
| git config --global rerere.enabled true | تفعيل إعادة استخدام حلول التعارض السابقة تلقائيًا | |
| git rerere status | عرض الملفات التي لديها حلول تعارض محفوظة | |
| git rerere diff | عرض التغييرات التي حفظها Git لإعادة استخدامها | 
⚙️ أوامر متقدمة
| الأمر | مثال | الوصف | 
|---|---|---|
| git bisect | استخدام البحث الثنائي للعثور على الالتزام الذي أدخل الخطأ | |
| git bisect start | بدء بحث ثنائي بين التزام جيد وآخر سيء لتحديد الخطأ | |
| git bisect bad | وضع علامة على الالتزام الحالي كـ “سيء” | |
| git bisect good <commit> | وضع علامة على التزام معروف كـ “جيد” | |
| git blame | عرض من عدل كل سطر من الملف، مع الإصدار والمؤلف | |
| git blame file.txt | عرض المؤلف ومعلومات الالتزام لكل سطر | |
| git blame -L 10,20 file.txt | عرض معلومات blame لأسطر 10 إلى 20 فقط | |
| git blame --show-email file.txt | عرض عناوين البريد للمؤلفين مع تغييرات الأسطر | |
| git reflog | عرض وإدارة سجل المراجع (reflog) لحركات الفروع و HEAD | |
| git reflog show main@{1.week.ago} | رؤية مكان إشارة فرع  | |
| git reflog expire --expire=30.days --dry-run | معاينة إدخالات reflog الأقدم من 30 يومًا قبل حذفها | |
| git reflog delete HEAD@{2} | حذف إدخال reflog محدد (بحذر) | |
| git submodule | إضافة أو تهيئة أو تحديث أو فحص الوحدات الفرعية | |
| git submodule add URL path | إضافة مستودع خارجي كـ submodule في مسار محدد | |
| git submodule update --init | تهيئة وتنزيل جميع الوحدات الفرعية المدرجة | |
| git submodule foreach git pull | تشغيل  | |
| git submodule sync --recursive | مزامنة روابط الوحدات بعد التعديلات في  | |
| git submodule update --remote --merge | تحديث الوحدات إلى أحدث التزاماتها | |
| git archive | إنشاء أرشيف (zip، tar) للملفات من التزام أو فرع محدد | |
| git archive --format=zip HEAD > archive.zip | إنشاء أرشيف ZIP من الملفات الحالية عند HEAD | |
| git archive -o release.tar.gz HEAD | إنشاء أرشيف  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | إنشاء أرشيف  | |
| git gc | تنظيف الملفات غير الضرورية وتحسين المستودع | |
| git gc --aggressive | تنظيف وتحسين شامل (قد يكون بطيئًا لكنه فعال) | |
| git gc --prune=now | حذف جميع الكائنات غير القابلة للوصول فورًا (خطر إذا لم تكن متأكدًا) | |
| git shortlog | ملخص سريع للمؤلفين والتزاماتهم | |
| git shortlog -e | عرض قائمة المؤلفين مع عناوين بريدهم الإلكتروني | |
| git shortlog -s -n | عرض عدد الالتزامات لكل مؤلف مرتبة حسب العدد | |
| git shortlog -sne | مثل السابق، لكن مع الأسماء والبريد أيضًا | |
| git revert | إنشاء التزام جديد يلغي تغييرات التزام سابق دون إعادة كتابة التاريخ | |
| git revert HEAD | إلغاء الالتزام الأخير بإنشاء التزام يعكس تغييره | |
| git revert <commit_hash> | إلغاء التزام محدد بواسطة hash مع إنشاء التزام عكسي آمن | 
🐙 GitHub CLI
ghيتيح لك إدارة GitHub من الطرفية.
| الأمر | مثال | الوصف | 
|---|---|---|
| gh auth login | المصادقة مع مضيف GitHub للسماح لأوامر CLI بالتفاعل مع حسابك | |
| gh auth login --with-token < mytoken.txt | المصادقة باستخدام رمز وصول شخصي مخزن في ملف ( | |
| gh auth login --hostname enterprise.internal | المصادقة مع خادم GitHub Enterprise (غير github.com) | |
| gh repo clone | استنساخ مستودع GitHub إلى جهازك المحلي | |
| gh repo clone user/repo | استنساخ المستودع repo المملوك من قبل  | |
| gh repo clone cli/cli -- --depth=1 | استنساخ المستودع لكن تنزيل الالتزام الأخير فقط لاستنساخ أسرع وأصغر | |
| gh repo clone cli/cli workspace/cli | استنساخ المستودع إلى مجلد مخصص  | |
| gh issue list | عرض القضايا (Issues) في مستودع GitHub مع إمكانية التصفية حسب معايير مختلفة | |
| gh issue list --assignee "@me" | عرض القضايا المخصصة لك | |
| gh issue list --state all | عرض القضايا بغض النظر عن حالتها (مفتوحة أو مغلقة) | |
| gh issue list --search "error no:assignee sort:created-asc" | عرض القضايا المطابقة لـ “error”، غير المعينة، مرتبة حسب تاريخ الإنشاء تصاعديًا | |
| gh pr create | إنشاء Pull Request على GitHub عبر CLI | |
| gh pr create --title "..." | إنشاء Pull Request بعنوان محدد | |
| gh pr create --project "Roadmap" | ربط Pull Request بمشروع GitHub يسمى “Roadmap” | |
| gh pr create --base develop --head monalisa:feature | إنشاء PR من فرع  | |
| gh repo create | إنشاء مستودع جديد على GitHub عبر CLI | |
| gh repo create my-project | إنشاء مستودع جديد باسم  | |
| gh repo create my-project --public --clone | إنشاء مستودع عام واستنساخه محليًا | |
| gh repo create my-project --private --source=. --remote=upstream | إنشاء مستودع بعيد خاص من المجلد الحالي وإضافة remote باسم  | 
💡 اختصارات Git (Aliases مفيدة)
قم بإعداد أسماء مستعارة مريحة لتسريع الأوامر الشائعة في Git:
git config --global alias.br branch                                       # اختصار لـ: git branch
git config --global alias.ci commit                                       # اختصار لـ: git commit
git config --global alias.co checkout                                     # اختصار لـ: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # رسم بياني جميل للتاريخ
git config --global alias.last "log -1 HEAD"                              # عرض آخر التزام
git config --global alias.st status                                       # اختصار لـ: git status🚀 أوامر Git المتقدمة للمحترفين
| الأمر | مثال | الوصف | 
|---|---|---|
| git filter-repo | أداة قوية وسريعة لإعادة كتابة تاريخ Git لإزالة أو تعديل الملفات، أو المؤلفين، أو المسارات؛ تحل محل git filter-branch بسرعة وأمان محسنين | |
| git filter-repo --path secret.txt --invert-paths | إعادة كتابة تاريخ المستودع بكفاءة لإزالة الملفات أو المجلدات الحساسة | |
| git filter-repo --replace-text replacements.txt | استبدال النصوص أو الأنماط عبر التاريخ بالكامل (مثل إزالة بيانات الاعتماد) | |
| git filter-repo --subdirectory-filter src | استخراج تاريخ مجلد فرعي إلى مستودع جديد مع الحفاظ على بيانات الالتزام | |
| git worktree | إدارة مجلدات عمل متعددة مرتبطة بمستودع واحد، مما يسمح بالعمل على فروع متعددة في نفس الوقت بدون استنساخ | |
| git worktree add ../feature feature-branch | إنشاء مجلد عمل إضافي مرتبط بنفس المستودع للعمل على فرع آخر بالتوازي | |
| git worktree list | عرض جميع worktrees النشطة مع مساراتها والفروع المرتبطة بها | |
| git worktree remove ../feature | إزالة worktree مرتبط عند عدم الحاجة وتنظيف المجلدات بأمان | |
| git replace | إنشاء مراجع مؤقتة تستبدل الكائنات الحالية، مما يتيح التلاعب المحلي بالتاريخ بدون تدمير | |
| git replace <old_commit> <new_commit> | استبدال التزام بآخر مؤقتًا في المستودع المحلي للاختبار أو التصحيح | |
| git replace --list | عرض جميع المراجع النشطة للاستبدال | |
| git replace -d <replace_ref> | حذف مرجع استبدال محدد لإرجاع السلوك | |
| git stash | حفظ التغييرات غير الملتزمة مؤقتًا في stack، مما يسمح بالتبديل بين السياقات بدون الالتزام | |
| git stash push -p | اختيار الأجزاء المراد حفظها بشكل تفاعلي للتحكم الدقيق | |
| git stash push -m "WIP selective stash" | إنشاء stash برسالة مخصصة لتسهيل التعرف | |
| git stash apply stash@{2} | تطبيق stash محدد من القائمة بدون حذفه | |
| git rebase | إعادة تطبيق الالتزامات فوق قاعدة جديدة، مما يسهل الحصول على تاريخ أنظف وخطي وتحريره بشكل تفاعلي | |
| git rebase --interactive --autosquash | بدء rebase تفاعلي يعيد ترتيب ودمج الالتزامات المحددة تلقائيًا | |
| git rebase -i --autosquash HEAD~10 | إعادة ترتيب ودمج الالتزامات المحددة قبل الدفع للحفاظ على التاريخ نظيفًا | |
| git commit --fixup <commit> | إنشاء التزام fixup سيتم دمجه تلقائيًا أثناء rebase | |
| git commit --squash <commit> | إنشاء التزام squash لدمجه مع التزام محدد أثناء rebase | |
| git bisect | أداة بحث ثنائي لتحديد الالتزام الذي أدخل خطأ بسرعة عن طريق اختبار الالتزامات المتتالية | |
| git bisect run | أتمتة عملية bisect بتشغيل برنامج اختبار على كل التزام لتحديد الالتزام المسبب للخطأ | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | تشغيل برنامج اختبار على كل التزام لتسريع تحديد الأخطاء | |
| git bisect visualize | فتح أداة رسومية لتصور عملية bisect | |
| git bisect reset | الخروج من وضع bisect والعودة إلى HEAD الأصلي | |
| git commit | تسجيل التغييرات مع خيارات متقدمة مثل التعديل، التوقيع، fixup، وتخصيص الرسائل للحفاظ على تاريخ عالي الجودة | |
| git commit --gpg-sign | إنشاء التزام موقّع بمفتاح GPG للتحقق من صحة المؤلف | |
| git commit -S -m "Signed commit" | توقيع الالتزامات باستخدام GPG لضمان النزاهة وصحة المؤلف | |
| git config --global user.signingkey <key_id> | تكوين مفتاح GPG المستخدم لتوقيع الالتزامات بشكل عام | |
| git log --show-signature | عرض معلومات توقيع GPG الخاصة بالالتزامات | |
| git reflog | الاحتفاظ بسجل لتحديثات HEAD والفروع، ضروري لاستعادة الالتزامات المفقودة وفهم الحركات المحلية | |
| git reset --hard HEAD@{3} | إعادة تعيين الفرع الحالي إلى حالة سابقة من reflog للاستعادة | |
| git reflog expire --expire=now --all | حذف جميع إدخالات reflog فورًا لتنظيف السجل (بحذر) | 
🧰 نصائح احترافية وتلقائية سير العمل
| الموضوع | الأوامر / المثال | الشرح والنصائح الاحترافية | 
|---|---|---|
| تنظيف المستودع بعمق | git gc --aggressive --prune=now | إجراء جمع قمامة عميق وحذف الكائنات غير القابلة للوصول فورًا لتحسين الأداء. يُستخدم أثناء الصيانة | 
| Worktrees للفروع المتوازية | git worktree add ../feature-branch feature | الاحتفاظ بمجلدات عمل متعددة لتطوير الميزات بشكل متزامن بدون استنساخ إضافي | 
| تاريخ خطي ونظيف | git rebase -i --autosquash | قبل الدفع، قم بإعادة تطبيق الالتزامات تفاعليًا مع autosquash للحفاظ على التاريخ نظيفًا | 
| التزامات آمنة | git commit -S | توقيع الالتزامات باستخدام GPG لتعزيز الموثوقية، إلزامي في بيئات الشركات | 
| البحث الآلي عن الأخطاء | git bisect run ./test-script.sh | أتمتة عملية البحث عن الأخطاء بتشغيل برنامج اختبار على كل التزام أثناء bisect | 
| ذاكرة حلول التعارض | git config --global rerere.enabled true | تمكين إعادة استخدام حلول التعارض لتسريع حل التعارضات المتكررة عبر rebase أو الدمج | 
| الأسماء المستعارة والـ Hooks المشتركة | تخزين اختصارات Git الشائعة و commit hooks في مستودع مشترك أو CI لفرض معايير الفريق وزيادة الإنتاجية | 
📚 موارد إضافية
🧠 نصيحة
لا تحاول حفظ كل شيء. استخدم --help، واستكشف، وتدرّب بانتظام:
git help <command>
git status🌐 روابط مفيدة
📘 التوثيق الرسمي لـ Git — دليل تفصيلي لجميع أوامر Git:
https://git-scm.com/docs
📙 تعلم Git Branching — درس تفاعلي مرئي لإتقان مفاهيم الفروع:
https://learngitbranching.js.org
📕 كتاب Pro Git (مجاني، بواسطة Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 ورقة الغش الرسمية لـ Git (مرجع مختصر رسمي):
https://education.github.com/git-cheat-sheet-education.pdf