في هذه الصفحة
إتقان أوامر Git: دليل عملي
Git أداة لا غنى عنها للتحكم في الإصدارات: تتبع التغييرات، تعاون فعال، إدارة سجل المشروع. قدراته واسعة، لكن فهم الأوامر الرئيسية يبسط سير عملك بشكل كبير. هذا المقال يتعمق في مجموعة مختارة من أوامر Git العملية، ويشرح ما تفعله، كيف تستخدمها، ومتى تكون أكثر فعالية.
1. أوامر التكوين
إعداد بيئة Git الخاصة بك بشكل صحيح هو الخطوة الأولى. تساعدك هذه الأوامر على تحديد هويتك وتفضيلاتك.
-
git config --global user.name "Your Name"- ما يفعله: يُعيّن اسم المستخدم العام لالتزامات Git الخاصة بك. سيظهر هذا الاسم في سجل الالتزامات لجميع المستودعات على نظامك.
- متى تستخدمه: عادةً، يكون هذا أحد أول الأوامر التي تشغلها بعد تثبيت Git. يضمن أن التزاماتك تنسب إليك.
- كيف تستخدمه:
git config --global user.name "Ammar Najjar"
-
git config --local user.email <email>- ما يفعله: يُعيّن عنوان البريد الإلكتروني للالتزامات الخاصة بمستودع معين. هذا يتجاوز إعداد البريد الإلكتروني العام.
- متى تستخدمه: عندما تحتاج إلى استخدام عنوان بريد إلكتروني مختلف لمشروع معين (مثل بريد إلكتروني عمل لمشروع شركة، وبريد إلكتروني شخصي لمساهمات المصادر المفتوحة).
- كيف تستخدمه:
git config --local user.email your.email@example.com
-
git config --local user.signingkey <key>- ما يفعله: يُكوّن مفتاح GPG الذي سيُستخدم لتوقيع الالتزامات محلياً داخل مستودع معين.
- متى تستخدمه: إذا كان مشروعك أو مؤسستك تتطلب التزامات موقعة للتحقق والسلامة، وتحتاج إلى استخدام مفتاح محدد لذلك المستودع.
- كيف تستخدمه:
git config --local user.signingkey YOUR_GPG_KEY_ID
فهم واستخدام user.signingkey
إضافة التوقيع بالالتزام باستخدام GPG (الحماية PRIVACY GNU) طبقة من الأمان والثقة في سجل Git. عندما توقع التزاماً، تثبت تشفيرياً أنك هو مؤلف هذا الالتزام وأن محتوى الالتزام لم يُتلاعب به منذ توقيعه.
1. توليد مفتاح GPG (إذا لم يكن لديك واحد): إذا لم يكن لديك بعد مفتاح GPG، ستحتاج إلى توليد واحد. هذه إعداد لمرة واحدة.
gpg --full-generate-key
اتبع الأوامر لاختيار نوع المفتاح، وحجم المفتاح، وانتهاء الصلاحية، وتعيين عبارة مرور.
2. الحصول على معرف مفتاح GPG: بمجرد أن يكون لديك مفتاح GPG، تحتاج إلى معرفه لإخبار Git بأي مفتاح يُستخدم.
gpg --list-secret-keys --keyid-format LONG
ابحث عن سطر مشابه لـ sec rsa4096/YOUR_KEY_ID 2023-01-01 [SC] حيث YOUR_KEY_ID هو السلسلة السداسية عشرية من 16 حرفاً. هذا هو المعرف الذي ستستخدمه.
3. تكوين Git لاستخدام مفتاح GPG: يمكنك تكوين Git عالمياً أو محلياً لمستودع محدد.
- التكوين العالمي (لجميع المستودعات):
git config --global user.signingkey YOUR_KEY_ID - التكوين المحلي (للمستودع الحالي فقط):
git config --local user.signingkey YOUR_KEY_ID
4. تفعيل توقيع الالتزام التلقائي (اختياري لكنه موصى به): لتوقيع جميع التزاماتك تلقائياً، يمكنك تعيين تكوين عام:
git config --global commit.gpgsign true
إذا لم تُعيّن هذا، ستحتاج إلى توقيع كل التزام يدوياً باستخدام git commit -S.
5. توقيع التزام:
- إذا كان
commit.gpgsignعلىtrue، فقط شغّل:
سيُطلب منك إدخال عبارة مرور GPG.git commit -m "Your commit message" - إذا كان
commit.gpgsignعلىfalse، وقّع يدوياً بـ:git commit -S -m "Your commit message"
6. التحقق من التزام موقّع: لرؤية ما إذا كان الالتزام موقّعاً ومن قبل، استخدم:
git log --show-signature
سترى رسالة “Good signature from…” إذا كانت التوقيع صالحة والمفتاح موثوقاً به.
git config --global push.default current- ما يفعله: يُعيّن السلوك الافتراضي لـ
git push. معcurrent، سيقومgit pushبدفع الفرع الحالي إلى فرعه المصدري (فرع في المستودع البعيد يتتبعه). - متى تستخدمه: لتبسيط سير عمل الدفع. بدلاً من كتابة
git push origin <branch-name>دائماً، يمكنك ببساطة كتابةgit pushوسيعرف Git إلى أي فرع بعيد تتم الإضافة. - كيف تستخدمه:
git config --global push.default current
- ما يفعله: يُعيّن السلوك الافتراضي لـ
2. التفرع والتنقل
الفرعات هي أساس Git، مما يتيح التطوير المتوازى. تساعدك هذه الأوامر على إدارتها والتنقل فيها.
-
git rev-parse --abbrev-ref HEAD- ما يفعله: يعرض اسم الفرع الحالي.
HEADيشير إلى الالتزام الحالي، و--abbrev-refيعرض اسمه الرمزي (اسم الفرع) بدلاً من بصمة SHA-1 الكاملة. - متى تستخدمه: للتحقق بسرعة من أي فرع أنت عليه، مفيد بشكل خاص في السكريبتات أو عندما تحتاج إلى تأكيد سياقك.
- كيف تستخدمه:
git rev-parse --abbrev-ref HEAD
- ما يفعله: يعرض اسم الفرع الحالي.
-
git rev-parse --abbrev-ref HEAD | sed 's/.*\(PATTERN-HERE\).*/\1/'- ما يفعله: يستخرج نمطاً محدداً من اسم الفرع الحالي باستخدام
sed. هذا مفيد لتحليل أسماء الفرعات المهيكلة (مثل feature/JIRA-123-description). - متى تستخدمه: في السكريبتات أو الأتمتة حيث تحتاج إلى استخراج معرفات محددة (مثل رقم التذكرة) من اسم فرعك.
- كيف تستخدمه: استبدل
PATTERN-HEREبنمطك regular المطلوب. على سبيل المثال، لاستخراج “JIRA-123” من “feature/JIRA-123-add-feature”:git rev-parse --abbrev-ref HEAD | sed 's/.*\(JIRA-[0-9]*\).*/\1/'
- ما يفعله: يستخرج نمطاً محدداً من اسم الفرع الحالي باستخدام
-
git config --global alias.gco = "!f() { git branch -a | grep -e $1 -m 1 | sed 's/remotes\\/origin\\///' | xargs git checkout; }; f"- ما يفعله: يُنشئ اسماً مستعاراً عاماً لGit باسم
gcoيتيح لك عمل checkout لفرع بتقديم نمط جزئي. يبحث في جميع الفرعات المحلية والبعيدة، ويختار أول تطابق، ويتحقق منه. - متى تستخدمه: عندما تنتقل بتردد بين الفرعات وتتذكر فقط جزءاً من اسم الفرع، أو عندما تكون أسماء الفرعات طويلة ومعقدة.
- كيف تستخدمه: بعد إعداد الاسم المستعار، يمكنك استخدامه هكذا:
git gco PATTERN-HERE # Example: git gco feature/my-new-feature (if your branch is feature/my-new-feature-branch)
- ما يفعله: يُنشئ اسماً مستعاراً عاماً لGit باسم
-
git stash branch <branch-name>- ما يفعله: يُنشئ فرعاً جديداً من الالتزام الذي كان текущياً عند إنشاء التخزين المؤقت، ثم يطبق التغييرات المخزنة على هذا الفرع الجديد. ثم يتم حذف إدخال التخزين المؤقت.
- متى تستخدمه: عندما قمت بتخزين عمل وقررت لاحقاً أن هذه التغييرات يجب أن تشكل أساس فرع ميزة جديد، بدلاً من تطبيقها على الفرع الحالي.
- كيف تستخدمه:
git stash branch new-feature-branch
3. الالتزامات وفحص السجل
فهم سجل المشروع وإجراء التغييرات هما عمليات Git أساسية.
-
git commit --no-verify- ما يفعله: يُنشئ التزاماً، لكنه يتجاوز أي خطافات pre-commit مُكوّنة للمستودع.
- متى تستخدمه: استخدم بحذر. يُستخدم هذا عادةً عندما يفشل خطاف pre-commit مؤقتاً أو عندما تعرف أن التغييرات التي تقوم بالتزامها تتعمد تجاوز تحقق محدد (مثل التزام عمل لا يزال قيد التنفيذ لا يجتاز فحص linting بعد).
- كيف تستخدمه:
git commit --no-verify -m "WIP: Bypassing hooks for now"
-
git diff --name-only- ما يفعله: يعرض فقط أسماء الملفات التي تم تغييرها (مُعدّة أو غير مُعدّة) منذ الالتزام الأخير.
- متى تستخدمه: للحصول بسرعة على نظرة عامة على الملفات التي قمت بتعديلها دون رؤية تغييرات المحتوى الفعلية.
- كيف تستخدمه:
git diff --name-only
-
git log --follow <file>- ما يفعله: يعرض سجل الالتزامات لملف محدد، بما في ذلك الالتزامات التي تم فيها إعادة تسمية الملف أو نقله. بدون
--follow، سيتوقفgit logعن تتبع سجل الملف إذا أُعيد تسميته. - متى تستخدمه: لفهم التطور الكامل للملف، حتى إذا تغير مساره بمرور الوقت.
- كيف تستخدمه:
git log --follow src/main.js
- ما يفعله: يعرض سجل الالتزامات لملف محدد، بما في ذلك الالتزامات التي تم فيها إعادة تسمية الملف أو نقله. بدون
-
git log -p --follow <file>- ما يفعله: مشابه لـ
git log --follow، لكنه يعرض أيضاً الواجهة (diff) لكل التزام، مع تفاصيل التغييرات الدقيقة التي أُجريت على الملف. - متى تستخدمه: عندما تحتاج إلى رؤية ليس فقط متى تغير ملف، بل ماذا تغير في كل التزام طوال تاريخه، بما في ذلك عمليات إعادة التسمية.
- كيف تستخدمه:
git log -p --follow src/main.js
- ما يفعله: مشابه لـ
-
git show --remerge-diff- ما يفعله: (متوفر في Git 2.36.0 وما بعده) عند تطبيقه على التزام دمج، يعرض هذا الأمر الفروقات مع تعارضات الدمج وكيفية حلها.
- متى تستخدمه: بعد الدمج، لمراجعة التغييرات المحددة التي أُجريت لحل التعارضات، مما يوفر وضوحاً بشأن استراتيجية الدمج.
- كيف تستخدمه:
git show --remerge-diff <merge-commit-hash>
-
git log -p -Gword- ما يفعله: يجد الالتزامات التي يظهر فيها “الكلمة” المحددة ( أو التعبيرregular ) في الفروقات (التغييرات الفعلية التي أُجريت على الكود).
- متى تستخدمه: لتحديد الالتزامات التي أدخلت أو عدلت قطعة كود محددة، أو اسم متغير، أو استدعاء دالة.
- كيف تستخدمه:
git log -p -G"my_function_name"
-
git log --grep=word- ما يفعله: يجد جميع الالتزامات التي يحتوي رسالتها على “الكلمة” المحددة (أو التعبيرregular).
- متى تستخدمه: للبحث عن التزامات مرتبطة بميزة محددة أو إصلاح خطأ أو موضوع بناءً على الكلمات المفتاحية في رسائل الالتزام.
- كيف تستخدمه:
git log --grep="bugfix"
4. الوسوم والأدوات المساعدة
تُستخدم الوسوم لتحديد نقاط محددة في السجل، عادةً للإصدارات.
git tag -l | rg -e "2\d.\d.\d$" | sort | tail -n 10- ما يفعله: هذا خط أنابيب من الأوامر:
git tag -l: يسرد جميع الوسوم في المستودع.rg -e "2\d.\d.\d$": يُصفّي الوسوم باستخدامripgrep(أداة خارجية) للعثور على تلك التي تتطابق مع نمط مثل “2.x.x” (مثل 2.1.0، 2.36.0).sort: يُرتب الوسوم المصفاة أبجدياً.tail -n 10: يعرض آخر 10 إدخالات، مما يمنحك فعلياً أحدث 10 وسوم “مستقرة” تبدو مبنية على النمط.
- متى تستخدمه: لتحديد بسرعة وسوم الإصدار المستقرة الأخيرة في مستودع يتبع مخطط الإصدار الدلالي.
- كيف تستخدمه: تأكد من تثبيت
ripgrep.git tag -l | rg -e "2\d.\d.\d$" | sort | tail -n 10
- ما يفعله: هذا خط أنابيب من الأوامر:
5. أوامر سير العمل اليومية الأساسية
تمثل هذه الأوامر الخبز والزبدة في تفاعل مطور البرمجيات مع Git، تغطي كل شيء، من التحقق من الحالة إلى دفع التغييرات.
-
git status- ما يفعله: يعرض حالة دليل العمل ومنطقة التجهيز. يخبرك أي تغييرات تم تجهيزها، وأيها لم يتم، وأي ملفات لا تتبعها Git.
- متى تستخدمه: باستمرار! هذه هي طريحتك الرئيسية لفهم الحالة الحالية لمستودعك قبل الالتزام أو إجراء عمليات أخرى.
- كيف تستخدمه:
git status
-
git add <file>/git add ./git add -p- ما يفعله: يضيف تغييرات من دليل العمل إلى منطقة التجهيز، لتحضيرها للالتزام التالي.
<file>: يُجهّز ملف(ات) محددة..: يُجهّز جميع التغييرات في الدليل الحالي ودلالياته الفرعية.-p(patch): يتيح لك تحديد قطع محددة من التغييرات داخل الملفات للتجهيز بشكل تفاعلي.
- متى تستخدمه: قبل كل التزام، لتحديد بدقة أي تغييرات تريد تضمينها.
-pلا تُقدّر بثمن لإنشاء التزامات نظيفة ومُركّزة. - كيف تستخدمه:
git add my_feature.js git add . git add -p
- ما يفعله: يضيف تغييرات من دليل العمل إلى منطقة التجهيز، لتحضيرها للالتزام التالي.
-
git commit -m "Your message"/git commit --amend- ما يفعله: يسجل التغييرات المُجهّزة في المستودع كالتزام جديد.
-m: يوفر رسالة التزام مباشرة في سطر الأوامر.--amend: يتيح لك تعديل الالتزام الأخير. يمكنك تغيير رسالته، أو إضافة/إزالة ملفات، أو تعديل تغييرات موجودة.
- متى تستخدمه:
-m: بعد تجهيز التغييرات، لإتمام وحدة عمل منطقية.--amend: لإصلاح خطأ إملائي في رسالة الالتزام الأخيرة، أو لإضافة ملف/تغيير منسي للالتزام الأخير قبل دفعه إلى بعيد مشترك.
- كيف تستخدمه:
git commit -m "Add user authentication feature" git commit --amend -m "Fix typo in auth feature commit message"
- ما يفعله: يسجل التغييرات المُجهّزة في المستودع كالتزام جديد.
-
git branch <new-branch-name>- ما يفعله: يُنشئ فرعاً جديداً يشير إلى الالتزام الحالي.
- متى تستخدمه: للبدء في العمل على ميزة جديدة أو إصلاح خطأ أو تجربة دون التأثير على قاعدة الكود الرئيسية.
- كيف تستخدمه:
git branch feature/new-dashboard
-
git switch <branch-name>/git checkout <branch-name>- ما يفعله: يُحوّل دليل عملك إلى الفرع المحدد.
git switchهو الأمر الأحدث والأمان للتنقل بين الفرعات، بينماgit checkoutأكثر تنوعاً (يمكنه أيضاً استعادة الملفات). - متى تستخدمه: للانتقال بين خطوط التطوير المختلفة.
- كيف تستخدمه:
git switch main git checkout feature/new-dashboard # Older but still common
- ما يفعله: يُحوّل دليل عملك إلى الفرع المحدد.
-
git checkout -b <new-branch-name>- ما يفعله: اختصار مريح يُنشئ فرعاً جديداً ويتحول إليه فوراً.
- متى تستخدمه: عندما تريد بدء فرع ميزة جديد والغوص فيه مباشرة.
- كيف تستخدمه:
git checkout -b bugfix/login-issue
-
git pull- ما يفعله: يجلب تغييرات من المستودع البعيد ويدمجها تلقائياً مع فرعك الحالي. هذا اختصار لـ
git fetchيليهgit merge. - متى تستخدمه: لمزامنة فرعك المحلي مع نظيره البعيد، وجلب أحدث التغييرات من المتعاونين.
- كيف تستخدمه:
git pull origin main # Or simply: git pull (if upstream is set)
- ما يفعله: يجلب تغييرات من المستودع البعيد ويدمجها تلقائياً مع فرعك الحالي. هذا اختصار لـ
-
git fetch- ما يفعله: يحمّل كائنات ومراجع من مستودع آخر (البعيد) إلى مستودعك المحلي. لا يدمج أو يُعدّل ملفات عملك المحلية.
- متى تستخدمه: لرؤية ماحدث من تغييرات في البعيد دون دمجها في عملك الحالي. مفيد لفحص الفرعات البعيدة أو التحضير لعملية دمج/إعادة قاعدة.
- كيف تستخدمه:
git fetch origin
-
git push- ما يفعله: يرفع التزاماتك المحلية إلى المستودع البعيد.
- متى تستخدمه: لمشاركة عملك المكتمل مع الآخرين أو النسخ الاحتياطي لتغييراتك.
- كيف تستخدمه:
git push origin feature/my-new-feature # Or simply: git push (if upstream is set)
-
git merge <branch>- ما يفعله: يدمج تغييرات من الفرع المحدد في فرعك الحالي.
- متى تستخدمه: لدمج فرعات الميزات المكتملة في فرع التطوير الرئيسي، أو لجلب تغييرات من فرع مشترك إلى فرعك.
- كيف تستخدمه:
git switch main git merge feature/my-new-feature
-
git rebase <branch>- ما يفعله: يُعيد تطبيق التزامات فرعك الحالي فوق فرع قاعدة آخر. هذا يُعيد كتابة سجل فرعك، مُنشئاً سجلاً خطيطاً.
- متى تستخدمه: لإبقاء فرع الميزة محدّثاً مع الفرع الرئيسي دون إنشاء التزامات دمج، مما ينتج عنه سجل أكثر نظافة وخطية. استخدم بحذر على الفرعات التي تم دفعها ومشاركتها بالفعل.
- كيف تستخدمه:
git switch feature/my-new-feature git rebase main
-
git reset --hard HEAD~1/git revert HEAD- ما يفعلان: كلاهما يُلغي التغييرات، لكن بطريقتين مختلفتين:
git reset --hard HEAD~1: يُحرك مؤشر الفرع الحالي التزاماً واحداً للخلف، مُتجاهلاً أي تغييرات في دليل العمل ومنطقة التجهيز. هذا يُعيد كتابة السجل.git revert HEAD: يُنشئ التزاماً جديداً يُلغي التغييرات التي أدخلها الالتزام المحدد. هذا يحافظ على السجل.
- متى تستخدمه:
git reset --hard: لإسقاط الالتزام الأخير بالكامل (وأي تغييرات غير مُلتزمة) محلياً، خاصة إذا لم تقم بدفعه بعد. استخدم بحذر شديد لأنه يُفقد البيانات.git revert: لإلغاء التزام تم دفعه بالفعل إلى بعيد مشترك، لأنه يُنشئ التزاماً جديداً يُعكّس التغييرات صراحةً، مع الحفاظ على سجل واضح.
- كيف تستخدمه:
git reset --hard HEAD~1 # Discard last commit git revert HEAD # Create a new commit that undoes the last one
- ما يفعلان: كلاهما يُلغي التغييرات، لكن بطريقتين مختلفتين:
-
ملف
.gitignore- ما يفعله: ملف نصي بسيط في دليل جذر مستودعك يخبر Git أي ملفات أو دلاليات يجب تجاهلها. لن تتتبع Git هذه الملفات، ولن تعرضها كغير مُتتبّعة.
- متى تستخدمه: لمنع الملفات غير الضرورية (مثل مخرجات البناء، الملفات المؤقتة، تكوين IDE، أو بيانات الاعتماد الحساسة) من الالتزام في المستودع.
- كيف تستخدمه: أنشئ ملفاً باسم
.gitignoreفي جذر مشروعك وسرد أنماط للملفات/المجلدات التي يجب تجاهلها.# Example .gitignore content /node_modules/ .env *.log build/
<a href="#" class="go-to-top">العودة للأعلى</a>
تمثل هذه الأوامر مجموعة فرعية قوية من قدرات Git. بفهم غايتها ومعرفة متى تُطبّقها، يمكنك التنقل في سجل مشروعك وإدارة الفرعات والتعاون بكفاءة أكبر. الممارسة المنتظمة مع هذه الأوامر ستعزز إتقانك لGit وتحسن سير عمل التطوير الخاص بك.