🐙 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