🐙 Git و GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
نُشر

٨ ربيع الأول ١٤٤٧ هـ

أوامر 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"

البحث عن جميع إشارات functionName في جميع ملفات المشروع

git grep -n "TODO"

البحث عن الأسطر التي تحتوي على TODO مع إظهار أرقام الأسطر

git grep -i "login"

البحث عن كلمة 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

إنشاء فرع جديد باسم new-feature

git branch -d old-feature

حذف فرع محلي باسم old-feature

git checkout التبديل بين الفروع أو استعادة الملفات من التزامات أخرى
git checkout main

التبديل إلى الفرع main

git checkout -b new-branch

إنشاء والتبديل إلى فرع جديد باسم new-branch

git switch التبديل بين الفروع (بديل مبسط لـ checkout)
git switch main

التبديل إلى الفرع main

git switch -c feature-x

إنشاء والتبديل إلى فرع جديد باسم feature-x

git switch new-feature

التبديل إلى فرع موجود باسم new-feature

git merge دمج التغييرات من فرع آخر في الفرع الحالي
git merge new-feature

دمج فرع new-feature في الفرع الحالي

git merge --no-ff new-feature

إنشاء التزام دمج دائم حتى عند إمكانية fast-forward

git merge --abort

إلغاء الدمج والتراجع إذا حدثت تعارضات

git rebase إعادة تطبيق الالتزامات على قاعدة جديدة
git rebase main

إعادة تطبيق التزامات الفرع فوق فرع 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

تطبيق نطاق من الالتزامات بين A و B

📡 المستودعات البعيدة

الأمر

مثال

الوصف

git remote إدارة الروابط مع المستودعات البعيدة (مثل GitHub)
git remote -v

عرض أسماء remotes وروابطها

git remote add origin URL

إضافة مستودع بعيد باسم origin

git pull تحميل ودمج التغييرات من فرع بعيد
git pull origin main

جلب ودمج تغييرات فرع main البعيد في فرعك الحالي

git pull --rebase origin main

جلب وإعادة تطبيق فرعك على فرع بعيد بدلًا من الدمج

git push رفع تغييراتك المحلية إلى مستودع بعيد
git push origin main

دفع فرعك المحلي main إلى origin

git fetch تحميل التغييرات من البعيد بدون دمج
git fetch origin

جلب جميع التحديثات من origin بدون تطبيقها

git fetch origin main

جلب فرع main فقط من البعيد

git fetch --all

جلب التحديثات من جميع remotes

git fetch --prune

تنظيف الفروع المحذوفة على البعيد

git fetch --dry-run

عرض ما سيتم جلبه بدون تنزيل

git fetch origin +main

تحديث فرع التتبع المحلي بقوة (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 باسم v1.0 مع رسالة

git tag -d v1.0

حذف العلامة المحلية v1.0 (لا يؤثر على البعيد)

git push رفع الالتزامات والفروع والعلامات من المحلي إلى البعيد
git push origin --tags

رفع جميع العلامات المحلية إلى البعيد

git push origin v1.0

رفع علامة محددة (مثل v1.0) إلى المستودع البعيد

git push origin :refs/tags/v1.0

حذف العلامة البعيدة 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}

رؤية مكان إشارة فرع main قبل أسبوع

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 pull داخل كل submodule لتحديثها

git submodule sync --recursive

مزامنة روابط الوحدات بعد التعديلات في .gitmodules

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

إنشاء أرشيف .tar.gz مضغوط من HEAD

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

إنشاء أرشيف .tar.gz مع جميع الملفات داخل مجلد project/

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

المصادقة باستخدام رمز وصول شخصي مخزن في ملف (mytoken.txt)

gh auth login --hostname enterprise.internal

المصادقة مع خادم GitHub Enterprise (غير github.com)

gh repo clone استنساخ مستودع GitHub إلى جهازك المحلي
gh repo clone user/repo

استنساخ المستودع repo المملوك من قبل user في مجلد باسم repo

gh repo clone cli/cli -- --depth=1

استنساخ المستودع لكن تنزيل الالتزام الأخير فقط لاستنساخ أسرع وأصغر

gh repo clone cli/cli workspace/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 من فرع feature في fork monalisa إلى فرع develop

gh repo create إنشاء مستودع جديد على GitHub عبر CLI
gh repo create my-project

إنشاء مستودع جديد باسم my-project على GitHub (مع تفاعل تفاعلي)

gh repo create my-project --public --clone

إنشاء مستودع عام واستنساخه محليًا

gh repo create my-project --private --source=. --remote=upstream

إنشاء مستودع بعيد خاص من المجلد الحالي وإضافة remote باسم upstream

💡 اختصارات 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