git branch
عرض الفروع أو إنشاؤها أو حذفها
يتيح لك الأمر 'git branch' إنشاء الفروع وسردها وإعادة تسميتها وحذفها. ولا يتيح التبديل بين الفروع - استخدم لذلك 'git switch' أو 'git checkout'. الفروع في Git مؤشرات خفيفة إلى commits، مما يجعل إنشاء الفروع والتبديل بينها سريعًا جدًا. دون وسائط، يسرد git branch الفروع الموجودة مع إبراز الفرع الحالي. ومع اسم فرع، ينشئ فرعًا جديدًا يشير إلى HEAD الحالي. الفروع أساسية للتطوير المتوازي، إذ تسمح بتطوير عدة ميزات أو إصلاحات في الوقت نفسه دون أن يعرقل بعضها بعضًا.
الصيغة
git branch [--list] [-a | -r] [-v [--abbrev=<n> | --no-abbrev]] [--merged | --no-merged] [<pattern>...]
git branch <branch-name> [<start-point>]
git branch (-d | -D) [-r] <branch-name>...
git branch (-m | -M) [<old-branch>] <new-branch>
git branch (-c | -C) [<old-branch>] <new-branch>
git branch [--set-upstream-to=<upstream> | -u <upstream>] [<branch-name>]الخيارات
اختيار الخيار المناسب
عرض الفروع
طرق مختلفة لسرد الفروع وفحصها
| الأمر | يعرض المحلية | يعرض البعيدة | معلومات إضافية | حالة الاستخدام |
|---|---|---|---|---|
git branch | نعم | No | الفرع الحالي معلَّم بـ * | نظرة سريعة على الفروع المحلية |
git branch -r | No | نعم | مراجع التتبّع البعيد | رؤية ما على الخادم |
git branch -a | نعم | نعم | كل المراجع | صورة كاملة لكل الفروع |
git branch -v | نعم | No | آخر commit لكل فرع | رؤية نشاط الفروع بلمحة |
git branch -vv | نعم | No | Upstream + التقدّم/التأخر | التحقق من المزامنة مع المستودع البعيد |
git branch --show-current | الحالي فقط | No | الاسم فقط | السكربتات، موجّه الـ shell |
حذف الفروع
حذف آمن أم حذف بالإجبار - اعرف الفرق
| الأمر | يتطلب الدمج | قد يضيع العمل | متى تستخدمه |
|---|---|---|---|
-d (--delete) | نعم | No | بعد دمج الـ PR، تنظيف روتيني |
-D (--delete --force) | No | نعم | التخلّي عن عمل تجريبي |
إعادة تسمية الفروع ونسخها
خيارات لإعادة تنظيم أسماء فروعك
| الأمر | يكتب فوق الموجود | يُبقي الأصل | الاستخدام المعتاد |
|---|---|---|---|
-m (--move) | لا (يفشل) | No | إعادة تسمية: feature ← feature-v2 |
-M (--move --force) | نعم | No | استبدال اسم فرع موجود |
-c (--copy) | لا (يفشل) | نعم | تكرار فرع للتجربة |
-C (--copy --force) | نعم | نعم | نسخ، مع الكتابة فوقه إن وُجد |
تصفية الفروع حسب حالة الدمج
إيجاد الفروع الجاهزة للحذف أو التي ما زالت قيد العمل
| الأمر | يعرض | الغرض | الخطوة التالية المعتادة |
|---|---|---|---|
--merged | الفروع المدموجة في HEAD | إيجاد المرشحين للتنظيف | git branch -d <branch> |
--merged main | الفروع المدموجة في main | العثور على الفروع التي يمكن حذفها بأمان | حذف الفروع المدموجة دفعة واحدة |
--no-merged | الفروع غير المدموجة | إيجاد العمل الجاري | المراجعة قبل الإصدار |
--contains <commit> | الفروع التي تحتوي commit | تتبّع أين ذهب إصلاح | التحقق من نشر hotfix |
تتبّع الـ upstream
ضبط العلاقة بين الفروع المحلية والبعيدة
| الأمر | الإجراء | الأثر | متى تستخدمه |
|---|---|---|---|
-u origin/main | تعيين الـ upstream | يعمل git push/pull دون وسائط | بعد إنشاء فرع محلي |
--track origin/feature | إنشاء + تعيين الـ upstream | فرع محلي جديد يتتبّع فرعًا بعيدًا | بدء العمل على فرع بعيد |
--unset-upstream | إزالة الـ upstream | قطع الصلة بالمستودع البعيد | إيقاف تتبّع فرع بعيد محذوف |
أمثلة على سير العمل
git branch feature-loginأنشئ فرعًا جديدًا للميزة
git switch feature-loginانتقل إلى الفرع الجديد
(make changes and commits)اعمل على الميزة بعدة commits
git switch main && git merge feature-loginادمج الميزة المكتملة في main
git branch -d feature-loginاحذف فرع الميزة بعد الدمج
git branch --mergedاسرد الفروع المدموجة
git branch -d branch-nameاحذف الفروع المدموجة بأمان واحدًا واحدًا
git fetch --pruneأزل مراجع التتبّع البعيد القديمة
git branch -rتحقّق من نظافة الفروع البعيدة
git fetch originاحصل على أحدث معلومات الفروع البعيدة
git branch -rاسرد الفروع البعيدة المتاحة
git branch --track feature origin/featureأنشئ فرعًا محليًا يتتبّع البعيد
git switch featureانتقل إلى فرع التتبّع الجديد
git branch -m old-name new-nameأعد تسمية الفرع المحلي
git push origin -u new-nameادفع الاسم الجديد للفرع إلى المستودع البعيد
git push origin --delete old-nameاحذف الاسم القديم للفرع من المستودع البعيد
git log --oneline -1احصل على hash الـ commit الذي تبحث عنه
git branch --contains <commit-hash>اعثر على الفروع المحلية التي تحتوي هذا الـ commit
git branch -r --contains <commit-hash>اعثر على الفروع البعيدة التي تحتوي هذا الـ commit
حل المشكلات
لا يمكن حذف الفرع - غير مدموج بالكامل
السبب: في الفرع commits غير مدموجة في الـ upstream الخاص به (أو في HEAD إن لم يكن له upstream)
ادمج الفرع أولًا، أو استخدم -D لإجبار الحذف إن كنت متأكدًا من التخلّي عن العمل
git branch -D branch-nameلا يمكن حذف الفرع الحالي
السبب: تحاول حذف الفرع الذي أنت عليه
انتقل إلى فرع آخر أولًا، ثم احذف الفرع المستهدف
git switch main && git branch -d old-branchاسم الفرع موجود أصلًا
السبب: تحاول إنشاء فرع باسم موجود أصلًا
اختر اسمًا آخر، أو احذف الفرع الموجود أولًا، أو استخدم -f لإعادته إلى نقطة بداية جديدة
git branch -f existing-name <start-point>لا upstream مضبوط للدفع
السبب: الفرع المحلي ليست له علاقة تتبّع مع فرع بعيد
اضبط علاقة التتبّع مع الـ upstream
git push -u origin branch-nameالفرع البعيد لا يظهر في git branch -r
السبب: المستودع المحلي لا يملك أحدث معلومات الفروع البعيدة
نفّذ fetch من المستودع البعيد لتحديث فروع التتبّع البعيد
git fetch originHEAD منفصل بعد checkout
السبب: سحبت commit مباشرة بدل فرع
أنشئ فرعًا جديدًا عند الـ commit الحالي، أو عُد إلى فرع موجود
git switch -c new-branch-nameالفرع يتتبّع مستودعًا بعيدًا خاطئًا
السبب: الـ upstream مضبوط لتتبّع فرع بعيد غير صحيح
أعد ضبط تتبّع الـ upstream إلى الفرع البعيد الصحيح
git branch -u origin/correct-branchلا تظهر كل الفروع
السبب: لا تُعرض إلا الفروع المحلية افتراضيًا
استخدم الخيار -a لعرض الفروع المحلية وفروع التتبّع البعيد معًا
git branch -aنصائح وأخطاء شائعة
أفضل الممارسات
- ✓استخدم أسماء فروع وصفية تبيّن الغرض: feature/user-auth، bugfix/login-error، hotfix/security-patch
- ✓احذف الفروع بعد الدمج ليبقى المستودع نظيفًا - استخدم 'git branch --merged' لإيجاد ما يمكن حذفه بأمان
- ✓أنشئ فروع الميزات دائمًا من فرع main محدَّث لتقليل تعارضات الدمج
- ✓استخدم 'git branch -vv' لرؤية علاقات التتبّع ومقدار التقدّم أو التأخر
- ✓اضبط التتبّع عند إنشاء الفروع بـ 'git push -u origin branch-name' لتسهيل الدفع والسحب
- ✓تجنّب العمل مباشرة على main/master - أنشئ دائمًا فرعًا لتغييراتك
- ✓استخدم 'git branch --no-merged' لإيجاد الفروع التي ما زال العمل فيها جاريًا
- ✓زامن الفروع البعيدة بانتظام بـ 'git fetch --prune' لإزالة المراجع القديمة
- ✓فكّر في استخدام 'git switch' بدل 'git checkout' لتكون النية أوضح عند تبديل الفروع
- ✓استخدم '--sort=-committerdate' لرؤية أحدث الفروع نشاطًا أولًا
- ✓قبل حذف فرع بـ -D، تحقّق أنك لم تعد تحتاجه بـ 'git log branch-name'
- ✓اكتب أسماء الفروع بأحرف صغيرة وشرطات، للاتساق والتوافق
أخطاء متكررة
- ✗توقّع أن 'git branch <name>' ينقلك إلى الفرع الجديد. هو ينشئه فقط - استخدم 'git switch <name>' أو 'git checkout -b <name>' للإنشاء والانتقال.
- ✗محاولة حذف الفرع الحالي. يجب أن تنتقل إلى فرع آخر أولًا قبل حذف الفرع الذي أنت عليه.
- ✗استخدام -d على فروع غير مدموجة وفقدان العمل. الخيار -d يحميك - إن أردت فعلًا حذف عمل غير مدموج فاستخدم -D.
- ✗نسيان دفع الفروع الجديدة إلى المستودع البعيد. الفروع المحلية لا تُشارك حتى تنفّذ 'git push -u origin <branch>'.
- ✗عدم تنظيف الفروع القديمة. استخدم 'git branch --merged' بانتظام لإيجاد الفروع المدموجة وحذفها.
الأسئلة الشائعة
'git branch <name>' ينشئ فرعًا جديدًا فقط دون الانتقال إليه. 'git checkout -b <name>' ينشئ فرعًا جديدًا وينتقل إليه في أمر واحد. والمكافئ الحديث هو 'git switch -c <name>'.
استخدم 'git branch -m old-name new-name' لإعادة تسمية فرع. إن كنت على الفرع الذي تريد إعادة تسميته، يكفي 'git branch -m new-name'. أما الفروع البعيدة فعليك دفع الاسم الجديد وحذف القديم.
-d حذف آمن لا يعمل إلا إن كان الفرع مدموجًا بالكامل في الـ upstream الخاص به (أو في HEAD إن لم يُعيَّن upstream). أما -D فحذف بالإجبار يزيل الفرع أيًّا كانت حالة دمجه. لا تستخدم -D إلا إن كنت متأكدًا من التخلّي عن commits غير مدموجة.
استخدم 'git push origin --delete branch-name' أو الصيغة الأقصر 'git push origin :branch-name'. هذا يزيل الفرع من المستودع البعيد.
فروع التتبّع البعيد (مثل origin/main) مراجع محلية تتبّع حالة الفروع في المستودعات البعيدة. تُحدَّث عند fetch أو pull، وتُريك أين تشير الفروع البعيدة.
استخدم 'git branch --show-current' للاسم فقط، أو 'git branch' لرؤية كل الفروع مع تعليم الحالي بـ *. ويُظهر 'git status' الفرع الحالي أيضًا.
لا يسمح Git بحذف الفرع الذي أنت عليه. انتقل أولًا إلى فرع آخر بـ 'git switch other-branch'، ثم احذف الفرع المستهدف.
استخدم 'git branch branch-name commit-hash' لإنشاء فرع يبدأ من أي commit. يمكن أن تكون نقطة البداية hash لـ commit أو وسمًا أو اسم فرع آخر.
فرع الـ upstream (أو فرع التتبّع) هو الفرع البعيد الذي يدفع إليه فرعك المحلي ويسحب منه افتراضيًا. عيّنه بـ 'git branch -u origin/branch-name' أو 'git push -u origin branch-name'.
استخدم 'git branch --sort=-committerdate' لسرد الفروع ذات أحدث commits أولًا. أضف -v لرؤية الـ hash ورسالة الـ commit أيضًا.