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>]
[ ] اختياري| أو<arg> قيمة تُستبدل... قابل للتكرار--flag خيار

الخيارات

انقر على أي خيار لتوسيعه

مبتدئ (7)

اسرد الفروع المطابقة لنمط أو أنماط بدل الـ shell. دون نمط، يسرد كل الفروع المحلية. الخيار ‎--list مطلوب عند التصفية - وإلا فسّر Git النمط على أنه اسم فرع جديد يُنشأ.

موصى بهضروري للتصفية بنمط؛ ومن دونه ينشئ النمط فرعًا

مثال

git branch --list "feature-*"

اسرد فروع التتبّع البعيد والفروع المحلية معًا. يُظهر كل الفروع الموجودة محليًا وكل الفروع البعيدة التي يعرفها مستودعك.

موصى بهرؤية الفروع المحلية وفروع التتبّع البعيدة معًا بعد fetch

مثال

git branch -a

اسرد فروع التتبّع البعيد فقط. هي مراجع محلية (refs/remotes/...) تمثّل حالة الفروع في المستودعات البعيدة لحظة آخر fetch.

عند الحاجةيعرض فروع التتبّع البعيدة فقط؛ شغّل git fetch أولًا

مثال

git branch -r

احذف فرعًا. يجب أن يكون مدموجًا بالكامل في فرع الـ upstream الخاص به، أو في HEAD إن لم يُعيَّن upstream. حذف آمن يحميك من فقدان العمل.

موصى بهتنظيف آمن: يرفض إذا كان في الفرع عمل غير مدموج

مثال

git branch -d feature-complete

انقل/أعد تسمية فرع مع إعداداته وreflog الخاص به. إن كنت على الفرع، يمكنك حذف الاسم القديم.

موصى بهيعيد تسمية فرع ويحتفظ بسجلّه (reflog)؛ ويفشل بأمان إذا كان الاسم موجودًا

مثال

git branch -m old-name new-name

اعرض الـ hash والعنوان لكل فرع، ومقدار تقدّمه أو تأخره عن الـ upstream. استخدم -vv لطباعة اسم فرع الـ upstream أيضًا (ومسار worktree مرتبط).

موصى بهيعرض -vv الـ upstream وأعداد التقدّم والتأخّر بلمحة

مثال

git branch -v

اطبع اسم الفرع الحالي. في حالة HEAD منفصل لا يُطبع شيء. مخرجات نظيفة مثالية للسكربتات والأتمتة.

عند الحاجةيطبع اسم الفرع فقط؛ مفيد في السكربتات وسطر الأوامر

مثال

git branch --show-current

متوسط (10)

احذف فرعًا بالإجبار حتى لو فيه تغييرات غير مدموجة. اختصار لـ ‎--delete --force. استخدمه بحذر، فقد تصبح commits غير قابلة للوصول.

غير موصى بهيحذف عملًا غير مدموج — فقط عندما تتأكد أن الـ commits يمكن التخلّص منها

مثال

git branch -D abandoned-feature

أعد تسمية فرع بالإجبار، مع الكتابة فوق الهدف إن وُجد. اختصار لـ ‎--move --force. ويضيع الفرع المكتوب فوقه.

غير موصى بهيكتب فوق فرع موجود بصمت؛ استخدم -m إلا إذا كنت تقصد الاستبدال

مثال

git branch -M main master

انسخ فرعًا مع إعداداته وreflog الخاص به. ينشئ فرعًا جديدًا عند الـ commit نفسه للمصدر. ويبقى الفرع الأصلي (بخلاف ‎--move).

عند الحاجةينسخ فرعًا مع إعداداته؛ نادرًا ما تحتاجه يوميًا

مثال

git branch -c feature feature-backup

اسرد الفروع التي يمكن الوصول إلى رؤوسها من الـ commit المحدد (HEAD إن لم يُحدَّد). هذه الفروع دُمجت بالكامل ويمكن حذفها بأمان بـ -d.

موصى بهيعرض الفروع المدموجة بالكامل التي يمكن حذفها بأمان

مثال

git branch --merged main

اسرد فقط الفروع التي لا يمكن الوصول إلى رؤوسها من الـ commit المحدد (HEAD إن لم يُحدَّد). هذه الفروع فيها عمل لم يُدمج بعد وتحتاج إلى انتباه قبل الحذف.

عند الحاجةيعرض الفروع التي فيها عمل لم يُدمج بعد

مثال

git branch --no-merged

اضبط علاقة التتبّع بين فرع محلي وفرع بعيد. يتيح هذا عمل git pull/push دون تحديد اسم المستودع البعيد والفرع.

موصى بهيربط فرعًا بالبعيد ليعمل pull وpush العاديان

مثال

git branch -u origin/main

أزل معلومات تتبّع الـ upstream لفرع. بعدها سيتطلب git pull وgit push تحديد المستودع البعيد والفرع صراحةً.

عند الحاجةيزيل ربط التتبّع، مثلًا بعد اختفاء الفرع البعيد

مثال

git branch --unset-upstream

أنشئ فرعًا محليًا جديدًا يتتبّع فرعًا بعيدًا. يُضبط الـ upstream للفرع الجديد تلقائيًا لـ git pull/push.

عند الحاجةيضبط الـ upstream عند الإنشاء؛ وهو الافتراضي أصلًا من فرع بعيد

مثال

git branch --track feature origin/feature

اسرد فقط الفروع التي ينحدر commit رأسها من الـ commit المحدد (أي تحتويه). مفيد لمعرفة الفروع التي فيها إصلاح أو ميزة محددة. الافتراضي HEAD إن لم يُحدَّد commit.

عند الحاجةيعرف أي الفروع تحتوي بالفعل على إصلاح أو commit معيّن

مثال

git branch --contains a1b2c3d

رتّب الفروع حسب المفتاح المعطى. استخدم البادئة - للترتيب التنازلي. مفاتيح شائعة: committerdate، authordate، refname.

عند الحاجةيعرض ‎--sort=-committerdate الفروع النشطة مؤخرًا أولًا

مثال

git branch --sort=-committerdate

اختيار الخيار المناسب

عرض الفروع

طرق مختلفة لسرد الفروع وفحصها

الأمريعرض المحليةيعرض البعيدةمعلومات إضافيةحالة الاستخدام
git branchنعمNoالفرع الحالي معلَّم بـ *نظرة سريعة على الفروع المحلية
git branch -rNoنعممراجع التتبّع البعيدرؤية ما على الخادم
git branch -aنعمنعمكل المراجعصورة كاملة لكل الفروع
git branch -vنعمNoآخر commit لكل فرعرؤية نشاط الفروع بلمحة
git branch -vvنعمNoUpstream + التقدّم/التأخرالتحقق من المزامنة مع المستودع البعيد
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قطع الصلة بالمستودع البعيدإيقاف تتبّع فرع بعيد محذوف

أمثلة على سير العمل

1
git branch feature-login

أنشئ فرعًا جديدًا للميزة

2
git switch feature-login

انتقل إلى الفرع الجديد

3
(make changes and commits)

اعمل على الميزة بعدة commits

4
git switch main && git merge feature-login

ادمج الميزة المكتملة في main

5
git branch -d feature-login

احذف فرع الميزة بعد الدمج

1
git branch --merged

اسرد الفروع المدموجة

2
git branch -d branch-name

احذف الفروع المدموجة بأمان واحدًا واحدًا

3
git fetch --prune

أزل مراجع التتبّع البعيد القديمة

4
git branch -r

تحقّق من نظافة الفروع البعيدة

1
git fetch origin

احصل على أحدث معلومات الفروع البعيدة

2
git branch -r

اسرد الفروع البعيدة المتاحة

3
git branch --track feature origin/feature

أنشئ فرعًا محليًا يتتبّع البعيد

4
git switch feature

انتقل إلى فرع التتبّع الجديد

1
git branch -m old-name new-name

أعد تسمية الفرع المحلي

2
git push origin -u new-name

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

3
git push origin --delete old-name

احذف الاسم القديم للفرع من المستودع البعيد

1
git log --oneline -1

احصل على hash الـ commit الذي تبحث عنه

2
git branch --contains <commit-hash>

اعثر على الفروع المحلية التي تحتوي هذا الـ commit

3
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 origin

HEAD منفصل بعد 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' بانتظام لإيجاد الفروع المدموجة وحذفها.

الأسئلة الشائعة

A:

'git branch <name>' ينشئ فرعًا جديدًا فقط دون الانتقال إليه. 'git checkout -b <name>' ينشئ فرعًا جديدًا وينتقل إليه في أمر واحد. والمكافئ الحديث هو 'git switch -c <name>'.

A:

استخدم 'git branch -m old-name new-name' لإعادة تسمية فرع. إن كنت على الفرع الذي تريد إعادة تسميته، يكفي 'git branch -m new-name'. أما الفروع البعيدة فعليك دفع الاسم الجديد وحذف القديم.

A:

‎-d حذف آمن لا يعمل إلا إن كان الفرع مدموجًا بالكامل في الـ upstream الخاص به (أو في HEAD إن لم يُعيَّن upstream). أما ‎-D فحذف بالإجبار يزيل الفرع أيًّا كانت حالة دمجه. لا تستخدم ‎-D إلا إن كنت متأكدًا من التخلّي عن commits غير مدموجة.

A:

استخدم 'git push origin --delete branch-name' أو الصيغة الأقصر 'git push origin :branch-name'. هذا يزيل الفرع من المستودع البعيد.

A:

فروع التتبّع البعيد (مثل origin/main) مراجع محلية تتبّع حالة الفروع في المستودعات البعيدة. تُحدَّث عند fetch أو pull، وتُريك أين تشير الفروع البعيدة.

A:

استخدم 'git branch --show-current' للاسم فقط، أو 'git branch' لرؤية كل الفروع مع تعليم الحالي بـ *. ويُظهر 'git status' الفرع الحالي أيضًا.

A:

لا يسمح Git بحذف الفرع الذي أنت عليه. انتقل أولًا إلى فرع آخر بـ 'git switch other-branch'، ثم احذف الفرع المستهدف.

A:

استخدم 'git branch branch-name commit-hash' لإنشاء فرع يبدأ من أي commit. يمكن أن تكون نقطة البداية hash لـ commit أو وسمًا أو اسم فرع آخر.

A:

فرع الـ upstream (أو فرع التتبّع) هو الفرع البعيد الذي يدفع إليه فرعك المحلي ويسحب منه افتراضيًا. عيّنه بـ 'git branch -u origin/branch-name' أو 'git push -u origin branch-name'.

A:

استخدم 'git branch --sort=-committerdate' لسرد الفروع ذات أحدث commits أولًا. أضف -v لرؤية الـ hash ورسالة الـ commit أيضًا.