Git Cherry-Pick: كيفية اختيار وتطبيق الالتزامات الخاصة

العمل مع الفروع في بيئات تطوير البرمجيات التعاونية أمر أساسي لعزل الميزات وإصلاحات الأخطاء أو التجارب. ومع ذلك، هناك أوقات عندما تحتاج إلى أخذ تغييرات محددة من فرع وتطبيقها على فرع آخر دون دمج الفرع بأكمله. هنا تكون أمر git cherry-pick لا غنى عنه.

هدف هذا البرنامج التعليمي هو تقديم دليل شامل حول كيفية استخدام git cherry-pick بفعالية. ستتعلم بناء الجملة الخاصة بالأمر، وفهم كيفية التعامل مع التضاربات واستكشاف أفضل الممارسات والمصاعب الشائعة لتجنبها. هيا بنا نبدأ!

ما هو Git Cherry-Pick؟

أمر git cherry-pick هو أمر أساسي في Git يمنح المطورين تحكمًا دقيقًا في شفرتهم المصدرية.

على عكس العمليات الأخرى في Git, مثل merge أو rebase, والتي تعمل مع فروع كاملة، يسمح cherry-pick بأخذ التزامات محددة من فرع واحد وتطبيقها على آخر. يوفر هذا الدقة، خاصة في السيناريوهات التي تحتاج فيها إلى دمج تغييرات معينة بدلاً من جميع التعديلات في فرع.

تعمل أمر git cherry-pick عن طريق نسخ محتوى التزامات المحددة وإنشاء تزامات جديدة في الفرع المستهدف، مع الحفاظ على سلامة تاريخ التزام التعديل.

عند استخدام git cherry-pick

تتضمن حالات الاستخدام لـ git cherry-pick

  • نقل إصلاحات الأخطاء: لقد قمت بحل خطأ في فرع التطوير الخاص بك وتحتاج نفس الإصلاح في فرع ثابت أو إصدار. تتيح لك عملية اختيار الكرز نقل إصلاح الخطأ دون جلب التغييرات غير المتعلقة.
  • تطبيق الإصلاحات الساخنة: عندما يتطلب الإنتاج إصلاحًا حرجًا بينما تستمر فروع التطوير في التطور، تسمح عملية اختيار الكرز لك باستخراج وتطبيق الإصلاح على فرع الإنتاج.
  • عزل الميزة للاختبار: قد تحتاج فقط إلى اختبار مجموعة محددة من التعهيدات المتعلقة بميزة أثناء الاختبار. بدلاً من دمج الفرع بالكامل للميزة، يحافظ اختيار الكرز على التعهيدات المطلوبة ويجعل فرع الاختبار نظيفًا وفعالًا.
  • تصحيح الكوميتات الموضوعة بشكل خاطئ: إذا تم دفع كوميت بشكل خاطئ إلى الفرع الخطأ، يمكنك اختياريًا اختيار الكوميت ونقله إلى الفرع المناسب دون إخلال بتاريخ المشروع.
  • إعادة استخدام التغييرات عبر عدة فروع: في الحالات التي تحتاج فيها إلى نفس التحديث عبر عدة فروع، يتيح لك اختياري النقل إعادة تكرار التغييرات في الفروع المختلفة من دون إعادة العمل أو إدخال تعقيدات على الفرع.

صيغة Git Cherry-Pick

فهم بنية أمر git cherry-pick أمر أساسي لاستخدام هذا الأمر بفعالية. إنه لا يتعلق فقط بتحديد الكوميتات ولكن بتطبيقها بدقة لتحقيق النتيجة المرغوبة.

الصيغة الأساسية لاختيار تعهد واحد هي:

git cherry-pick <commit-hash>
  • git cherry-pick: الأمر الذي يبدأ العملية.
  • <commit-hash>: المعرف الفريد (تجزئة SHA-1) للتعهد الذي تريد اختياره. يمكن العثور على هذه التجزئة عن طريق تشغيل git log لعرض سجل التعهد.

عند تنفيذ الأمر أعلاه، يطبق Git التغييرات من التعهد المحدد على الفرع الحالي، مما ينشئ تعهدًا جديدًا بنفس التغييرات ولكن بتجزئة مختلفة.

من المهم ملاحظة أن الأمر ينقل فقط التعهد نفسه، وليس السياق أو تاريخ الأصل من الفرع.

جديد على Git وGitHub؟ ابدأ مع التحكم في النسخ في هذا الدليل المبسط للمبتدئين GitHub وGit.

كيفية استخدام Git Cherry-Pick: أمثلة تدريجية

الآن بعد فهم بنية جملة أساسية git cherry-pick، حان الوقت لرؤية الأمر عمليًا.

يوفر هذا القسم أمثلة عملية تقدم لك أمثلة حية توضح سيناريوهات أساسية شائعة وأكثر تعقيدًا حيث يكون cherry-picking مفيدًا. توضح كل مثال كيفية تطبيق التغييرات من commit واحد أو أكثر على فرع آخر.

المثال 1: Cherry-picking commit واحد

لنفترض أنك قمت بعمل إصلاح على فرع ميزة ترغب في تطبيقه على الفرع الرئيسي دون دمج الفرع بأكمله.

  • أولاً، اعثر على تجزئة الهاش للتعهد الذي ترغب في اختياره بتشغيل:
git log
  • حدد تجزئة التعهد.
  • انتقل إلى الفرع الرئيسي:
git checkout main
  • قم بتشغيل أمر اختيار الكرز (افترض أن التجزئة هي abc1234):
git cherry-pick abc1234

عند تشغيل هذا الأمر، سيقوم Git بتطبيق التغييرات من الcommit المحدد بواسطة abc1234 إلى الفرع الحالي الخاص بك (والذي هو main في هذه الحالة). ينشئ Git commit جديد على الفرع الرئيسي يحتوي على نفس التغييرات الموجودة في commit الأصل ولكن ب hash commit جديد.

مثال 2: Cherry-picking عدة commits

في بعض الحالات، قد تحتاج إلى تطبيق عدة commits منفصلة من فرع إلى آخر. لنفترض أن لديك ثلاث commits منفصلة في فرع الميزة الخاص بك تحتاج إلى جلبها إلى الفرع الرئيسي.

  • ابحث عن hash commit لكل commit تريد cherry-pick باستخدام git log:
git log
  • انتقل إلى الفرع الرئيسي:
git checkout main
  • قم بتشغيل أمر cherry-pick، مدرجًا العمليات:
git cherry-pick abc1234 def5678 ghi7890

المثال 3: اختيار عملية من مجموعة عمليات

لنقل أنك قمت بإجراء سلسلة من العمليات في الفرع الميزة وترغب في تطبيقها على الفرع الرئيسي دفعة واحدة دون تحديد كل عملية على حدة. كيف يمكنك فعل ذلك؟

  • استخدم git log لتحديد بداية ونهاية العمليات التي ترغب في اختيارها (على سبيل المثال، abc1234 إلى ghi7890).
  • انتقل إلى الفرع الرئيسي:
git checkout main
  • قم بتشغيل أمر cherry-pick مع نطاق عمليات:
git cherry-pick abc1234...ghi7890

المثال 4: اختيار عملية من فرع بعيد

أحيانًا، يوجد إصلاح حرج في فرع بعيد، وترغب في تطبيقه على الفرع المحلي الخاص بك دون دمج الفرع بأكمله. إليك كيفية القيام بذلك:

  • استرجاع أحدث التغييرات من مستودع البيانات البعيد
git fetch origin
  • قائمة بالتعهدات في الفرع البعيد للعثور على الهاش الذي تحتاج إليه:
git log origin/feature_branch --oneline
  • افترض أن الهاش للتعهد الذي تحتاج إليه هو abc1234.
  • التبديل إلى الفرع الرئيسي المحلي الخاص بك:
git checkout main
  • اختياريًا التعهد من الفرع البعيد:
git cherry-pick abc1234

هذا يتيح لك تطبيق commit من فرع بعيد دون دمج الفرع بأكمله.

هل تحتاج إلى الوصول إلى فرع بعيد؟ تابع هذا الدليل الخطوة بخطوة على Git checkout for remote branches.

مثال 5: استخراج commit وتعديله

إذا قمت بإستخراج commit ولكن تحتاج إلى إجراء تعديلات بسيطة قبل الcommit، يمكنك استخدام وضع التفاعلي في Git. إليك كيفية القيام بذلك:

  • انتقل إلى الفرع المستهدف:
git checkout main
  • قم بإستخراج الcommit وتوقف قبل الcommit:
git cherry-pick -n abc1234

العلم العلمي

  • قم بتعديل الملفات حسب الحاجة.
  • قم بمرحلة وتأكيد التغييرات يدويًا:
git add . git commit -m "Modified cherry-picked commit from feature_branch"

هذا مفيد عندما تحتاج إلى ضبط عملية انتقاء النقاط (cherry-picked) قبل إتمامها.

التعامل مع النزاعات أثناء انتقاء النقاط في جيت

النزاعات لا مفر منها عند انتقاء النقاط بين الفروع، خاصة عندما يكون الكود المصدري قد تباين بشكل كبير.

بينما تم تصميم cherry-pick لتطبيق التغييرات بنظافة، قد لا يتمكن دائمًا من تصفية الاختلافات تلقائيًا. في هذه الحالات، يجب حل الصراعات يدويًا. فهم كيفية حدوث الصراعات وكيفية التعامل معها أمر حاسم لإتمام عملية cherry-pick.

كيفية حدوث الصراعات

تحدث الصراعات عادةً عندما تتداخل التغييرات من التعهد المحدد بـ cherry-pick مع التغييرات الموجودة بالفعل في الفرع المستهدف أو تتعارض معها. على سبيل المثال:

  • تم تعديل نفس السطر في كلا الفرعين: إذا تم تعديل نفس السطر من الكود في كل من الفرع المصدر والفرع المستهدف، فإن Git لن يعرف أي الإصدارين يجب تطبيقه.
  • تم حذف الملف في فرع واحد ولكن تم تعديله في فرع آخر:إذا تم حذف ملف في فرع واحد ولكن تم تعديله في الالتزام الذي تم اختياره بشكل فردي، فلن يعرف Git ما إذا كان يجب الاحتفاظ به أو تطبيق التغييرات.
  • تغييرات غير ذات صلة ولكن نفس الملف:حتى عندما تبدو التغييرات غير ذات صلة، إذا حدثت داخل نفس الملف، قد يعلم Git ذلك كنزاع محتمل.

عند حدوث صراع، سيوقف Git عملية cherry-pick، مما يترك دليل العمل في حالة نزاع يجب حلها قبل المتابعة.

حل النزاعات

بمجرد حدوث صراع، سيوفر Git مؤشرات على الملفات الصراعية، وستحتاج إلى حل الاختلافات يدويًا. إليك كيفية حل الصراعات:

1. تحقق من الملفات الصراعية: قم بتشغيل الأمر التالي لرؤية الملفات التي بها صراع:

git status

سيعرض الأمر قائمة الملفات التي بها صراعات.

2. حل الصراعات: يمكنك تحرير الملفات الصراعية يدويًا لحل المشكلات. احذف علامات الصراع (<<<<<<<, =======, >>>>>>>) وحدد التغييرات التي يجب الاحتفاظ بها أو كيفية دمجها.

3. استخدم أداة دمج Git (اختياري): إذا كان حل الصراعات يدويًا أمرًا مؤرقًا، يمكنك استخدام أداة دمج لمساعدتك في تصور وحل الصراعات:

git mergetool

وفقًا لتكوينك، ستفتح الأداة أعلاه أداة دمج بصرية، مما يجعل من السهل مراجعة وحل الصراعات.

4. علم الصراعات بأنها تم حلها: بعد حل الصراعات، علم الملفات بأنها تم حلها باستخدام:

git add <conflicted-file>

5. أكمل عملية الاختيار الانتقائي: بمجرد حل جميع الصراعات وتنظيف الملفات، قم بإنهاء عملية الاختيار الانتقائي عن طريق تشغيل:

git cherry-pick --continue

العديد من بيئات التطوير المتكاملة الحديثة والأدوات، مثل Visual Studio Code وGitHub، توفر ميزات دمج تصادم النسخ المدمجة. تتيح واجهة ويب GitHub لك حل الصراعات مباشرة في طلبات الدمج، مما يجعل التعاون على المستودعات المشتركة أسهل دون الحاجة للتبديل إلى بحث بيئة محلية.

تخطي تعيين بعد حدوث صراع

أحيانًا، قد يكون حل الصراع معقدًا جدًا، أو قد تدرك أن التعيين غير ضروري بعد كل شيء. في مثل هذه الحالات، يمكنك تخطي التعيين تمامًا.

1. أحبط عملية اختيار الكرز الحالية: إذا كان الصراع معقدًا للغاية، وكنت لا ترغب في تطبيق الالتزام، يمكنك تخطيه عن طريق تشغيل:

git cherry-pick --skip

سيتخلص هذا من الالتزام المتعارض وينتقل إلى الالتزام التالي (إذا كنت تقوم بتحديد عدة الالتزامات).

2. أحبط عملية اختيار الكرز بأكملها: إذا كنت ترغب في إحباط عملية cherry-pick تمامًا، يمكنك تشغيل:

git cherry-pick --abort

سيقوم هذا الأمر بإعادة دليل العمل إلى الحالة التي كانت عليها قبل بدء عملية اختيار الكرز.

ترغب في تنظيف سجل تعليمات الالتزام الخاص بك؟ تعرف على كيفية دمج عدة تعليمات الالتزام في واحدة مع هذا دليل سكواش جيت.

أفضل الممارسات لاستخدام جيت تشيري-بيك

إساءة استخدام cherry-pick يمكن أن تؤدي إلى تاريخ معقد وارتباك في تحكم الإصدارات الخاص بمشروعك. لتجنب هذه المخاطر، يضمن التمسك بأفضل الممارسات أنك تستخدم cherry-pick بفعالية دون إدخال تعقيد غير ضروري إلى قاعدة الشيفرة الخاصة بك.

ابقها صغيرة ومحددة

تكون عملية اختيار الكرز أكثر فعالية عند استخدامها لتعليمات الالتزام الصغيرة والمحددة التي تعالج مهام محددة بشكل جيد، مثل إصلاحات الأخطاء أو تحسينات الميزات البسيطة.

تجنب اختيار التعديلات الكبيرة والمعقدة التي تجمع معًا عدة تغييرات، حيث يمكن أن تسبب هذه التعديلات صراعات وتجعل إدارة قاعدة الشفرة أكثر صعوبة. كلما كان التعديل موجهًا أكثر، كلما كان من الأسهل تطبيقه دون آثار جانبية غير مقصودة.

وثّق اختياراتك

للحفاظ على تاريخ واضح، قدم دائمًا سياقًا مناسبًا عند اختيار التعديلات. يمكن القيام بذلك من خلال رسائل التعديل المفصلة أو التعليقات في الوثائق.

الفكرة الرئيسية هي أنه يجب أن تشرح سبب الحاجة إلى اختيار التعديل. هذا أمر مهم بشكل خاص عند اختيار التعديلات عبر فروع طويلة الأمد أو بيئات تعاونية، حيث يساعد القادمين بعدك على فهم سبب تطبيق التغييرات الانتقائية.

قم بمراجعة تاريخ التعديلات

قبل اختيار الكرز، قم بمراجعة تاريخ الالتزام بالتغييرات في الفروع المصدر والهدف. يساعد هذا الخطوة في تحديد ما إذا كان الالتزام الذي تنوي اختياره يعتمد على تغييرات أخرى. يمكن أن تؤدي الاعتمادات المفقودة إلى وظائف غير كاملة أو وجود علل، لذا تأكد من أن عملية اختيار الكرز لا تقدم ميزات أو تحديثات نصف مطهوة.

تجنب الاستخدام المفرط لاختيار الكرز

على الرغم من أن اختيار الكرز مريح لتطبيق التغييرات المحددة، إلا أن استخدامه بشكل مفرط يمكن أن يؤدي إلى تاريخ مجزأ مع الالتزامات المكررة عبر الفروع. يمكن أن يجعل هذا الأمر صعبًا تتبع أصل بعض التغييرات أو فهم السياق التطويري الأوسع.

قم دائمًا بتقييم ما إذا كان دمجًا أو إعادة القاعدة هو استراتيجية أكثر ملائمة قبل اختيار الكرز. استخدم cherry-pick بحذر وبغرض لتجنب إضافة فوضى في تاريخ الالتزام.

تعاني من الملفات غير الضرورية في Git؟ تعلم كيفية استخدام .gitignore بفعالية مع this Git ignore tutorial.

حل المشكلات الشائعة مع Git Cherry-Pick

حل مشاكل تنشأ عند استخدام cherry-pick يتطلب فهمًا واضحًا للآليات الأساسية لـ Git. في هذا القسم، سأغطي بعض المشاكل الشائعة التي قد تواجهها أثناء cherry-picking وكيفية حلها.

Cherry-picking للتزام لا يوجد

أحيانًا، قد تحاول cherry-pick لالتزام ليس متاحًا من الفرع الحالي أو تم دمجه بالفعل. وهذا عادة ما ينتج عنه رسالة خطأ تفيد بعدم إمكانية العثور على الالتزام أو تطبيقه.

1. لم يتم العثور على الالتزام: يحدث هذا عندما لا يوجد تعيين الالتزام الذي تحاول انتقاؤه في سياق مستودعك الحالي أو الفرع. تأكد من أنك تشير إلى التعيين الصحيح من خلال التحقق من سجل التعيين باستخدام git log على الفرع الذي يوجد به التعيين. الحل:

  • تحقق مرتين من تعيين الالتزام للتأكد من صحته.
  • تحقق من أن التعيين موجود على فرع تمتلك الوصول إليه.
  • إذا كان التعيين موجودًا في فرع بعيد، تأكد من أن الفرع قد تم جلبه بواسطة git fetch.

2. الالتزام بالفعل المطبق: إذا تم دمج الالتزام بالفعل أو نقله يدويًا إلى الفرع المستهدف، سيمنعك Git من تكراره. هذا الحماية تحافظ على نظافة التاريخ وتجنب التغييرات الزائدة. الحل:

  • استخدم git log للتحقق مما إذا كان الالتزام قد تم بالفعل في الفرع المستهدف.
  • إذا لزم الأمر، تخطى عملية cherry-pick نظرًا لأن التغييرات قد تم تطبيقها بالفعل.

اختيار الفريزة بعد عملية إعادة القاعدة أو الدمج

يمكن أن يثير اختيار الفريزة بعد عملية إعادة القاعدة أو الدمج تعقيدات بسبب تاريخ الالتزامات المعدل لفروعك. إعادة القاعدة تعيد كتابة تاريخ الالتزامات بينما الدمج يجمع بين الفروع، وكلاهما قد يؤثر على قابلية تطبيق عملية الفريزة.

1. الصراعات بسبب النقلة من التزامات: بعد النقل، يتم إعادة كتابة تاريخ التزامات النقلة، مما قد يتسبب في مشاكل إذا حاولت نقل التزامات تم تعديلها أثناء عملية النقل. قد تواجه صراعات عندما يحاول cherry-pick تطبيق التغييرات التي لا تتوافق مع التاريخ المعاد كتابته. الحل:

  • قم بمراجعة تاريخ التزام بعد النقل باستخدام git log للتأكد من أن التزام الذي تقوم بنقله لم يتم تعديله بالفعل.
  • حل الصراعات كما تفعل في عملية cherry-pick القياسية، باستخدام git status والتعديل اليدوي.

2. الالتزامات المكررة بعد دمج: دمج الفروع يمكن أن يؤدي إلى حالة تحدث فيها الالتزام الذي ترغب في اختياره مسبقًا إلى تضمينه بالفعل في تاريخ الدمج. اختياره مرة أخرى يمكن أن يؤدي إلى الالتزامات المكررة، مما يمكن أن يعقد تاريخك ويجعل من الصعب تتبع التغييرات. الحل:

  • قبل اختيار الالتزام، تفقد تاريخ الالتزام على كلا الفرعين لتأكيد ما إذا تم دمج الالتزام بالفعل.
  • تجنب اختيار الالتزام نفسه إذا كان قد تم بالفعل في الفرع المستهدف.

هل تحتاج إلى التراجع عن التغييرات في Git؟ تعرف عندما يجب استخدام git reset مقابل git revert في هذا دليل على إعادة ضبط والتراجع في Git.

الاستنتاج

git cherry-pick هو طريقة قوية لتطبيق الcommits المحددة من فرع واحد إلى آخر دون دمج الفرع بأكمله. سواء كنت تقوم بنقل إصلاح خلل أو تحديث ميزة أو تطبيق التغييرات بشكل انتقائي، فإنه يساعد على الحفاظ على تاريخ Git الخاص بك نظيفًا ومركزًا.

في هذا الدليل، غطيت كيفية cherry-pick لcommits فردي ومتعددة، حل النزاعات، ومتابعة أفضل الممارسات لتجنب الأخطاء الشائعة. من خلال استخدام cherry-pick بحكمة، يمكنك تحسين سير عملك بينما تحافظ على تنظيم مستودعك.

إذا كنت ترغب في تعميق مهاراتك في Git، تحقق من Foundations of Git كنقطة بداية قوية. يمكنك أيضًا استكشاف Introduction to GitHub Concepts أو اتباع نهج منهجي مع GitHub Foundations skill track.

الآن بعد أن تعرفت على كيفية cherry-pick كمحترف، تقدم وجربه في مشروعك القادم!

Source:
https://www.datacamp.com/tutorial/git-cherry-pick