إدارة المهام بكفاءة: دليل شامل للتبديل بين المشكلات في مستودع Git المحلي

دقائق القراءة: 6

مقدمة إلى عالم Git والمشاريع مفتوحة المصدر

خلال رحلتي في عالم المصادر المفتوحة، واجهت موقفًا بسيطًا (لكنه قد يكون معقدًا) يمكن أن يوقعك في الأخطاء إذا لم تتعامل معه بالشكل الصحيح. هذا هو محور نقاشنا في هذا المقال. المساهمة في مجتمع المصادر المفتوحة تعني المشاركة في تطوير البرمجيات المجانية أو مفتوحة المصدر. هناك العديد من المنظمات التي ترحب دائمًا بالمساهمين في قواعد بياناتها البرمجية.

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

المتطلبات الأساسية

  • تثبيت Git على جهازك.
  • فهم أساسي لمفاهيم Git.

لماذا نستخدم “المشكلات” (Issues)؟

لقطة شاشة توضح واجهة تتبع المشكلات في مستودع Git

يمكن استخدام “المشكلات” (Issues) في المستودعات لتتبع المهام، الأفكار، الأخطاء، أو التحسينات الخاصة بالمشروع الذي تعمل عليه. بشكل أساسي، توفر لك وصفًا تفصيليًا لما تتضمنه المهمة.

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

البدء بالعمل على مشكلة

للبدء بالعمل على مشكلة، تحتاج إلى استنساخ (clone) أو نسخ المستودع المستهدف باستخدام أمر git clone على جهازك المحلي.

git clone <url of repository>

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

git remote add upstream <url of the original repository>

لمعاينة قائمة المستودعات البعيدة (remote) المتاحة والمهام التي يمكن إجراؤها (مثل fetch و push)، اكتب:

git remote -v

لتبقى على اطلاع دائم بأحدث التغييرات، تحتاج دائمًا إلى محاولة جلب (fetch) التغييرات من upstream. بهذه الطريقة، ستحصل على جميع الالتزامات (commits) من كل عضو في الفريق عمل على ميزات مختلفة.

git fetch <upstream>/<master>

بعد ذلك، ستحتاج إلى دمج (merge) التزامات المساهمين الآخرين في المستودع المحلي.

git merge <upstream>/<master>

الهدف من أمر git merge هو جعل النسخة المحلية من الفرع الرئيسي (master branch) مطابقة تمامًا للنسخة الموجودة في upstream.

فروع Git (Git Branch)

بعد ذلك، قم بإنشاء فرع (branch) للمشكلة التي تم تعيينها لك. لماذا يجب عليك إنشاء فرع؟ وما هو الغرض من استخدامه؟ دعنا نستكشف ذلك بمزيد من التفصيل.

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

عند البدء، يوفر لنا Git فرعًا رئيسيًا (master branch). يحتوي الفرع الرئيسي على كود يعمل ومستقر. لتجنب خلط تغييراتك مع كود الإنتاج، تحتاج إلى إنشاء فرع جديد.

لإنشاء فرع، تحتاج إلى إدخال أمر Git التالي:

git checkout -b <descriptive-branch-name>

ينشئ هذا الأمر فرعًا جديدًا بناءً على الفرع الحالي، على الرغم من أنه يمكنك أيضًا تحديد الفرع الذي تريد إنشاء فرعك الجديد منه.

git checkout -b <descriptive-branch-name> <target-branch-name>

لسرد جميع الفروع المتاحة في مستودعك، اكتب:

git branch

عند اكتمال المهمة التي تعمل عليها، قم بدفع (push) التغييرات من المستودع المحلي للمراجعة. بعد ذلك، أنشئ طلب سحب (pull request) لإعلام مسؤولي المشروع بالحالة الحالية للمهمة المعينة.

git push -u origin <descriptive-branch-name>

كيفية التبديل إلى المشكلة التالية

الآن، كيف يمكنني التبديل للعمل على المشكلة التالية؟

قم بإنشاء فرع مختلف باسم وصفي، على النحو التالي:

git checkout -b <descriptive-branch-name> <target-branch-name>

بمجرد إنشاء فرعنا الجديد، يمكننا استخدام أمر مساعد من أداة hub (إذا كانت مثبتة). سيساعدنا هذا الأمر في جلب الكود من upstream، وسيقوم أيضًا بتشغيل عملية الدمج (merge).

hub sync

يسترجع هذا الأمر التغييرات من upstream ويدمجها مع الفرع الذي تم إنشاؤه حديثًا.

يمكنك دائمًا التحقق من التغييرات بين فرعك و upstream باستخدام أمر git status:

git status

الآن يمكنك المتابعة والعمل على الفرع الجديد. فقط تذكر أن تلتزم بتغييراتك (commit) وتدفعها (push) إلى الفرع البعيد (remote branch) كما فعلنا سابقًا.

أخطاء شائعة وكيفية معالجتها

قد ترتكب أخطاء أثناء العمل على مشكلات متعددة، مما قد يؤدي إلى حذف التزامات (commits) من فرع ما. إليك مثال توضيحي لما يمكن فعله لمحو الالتزامات غير المرغوب فيها من فرع:

الخطوة 1: التبديل إلى الفرع

انتقل إلى الفرع الذي ترغب في إزالة الالتزامات غير المرغوب فيها منه:

git checkout <descriptive-branch-name>

الخطوة 2: مراجعة سجل الالتزامات

قم بتشغيل سجل الالتزامات التي تمت على الفرع. سيساعدك هذا في تحديد الالتزامات التي ترغب في الاحتفاظ بها بناءً على “تجزئة الالتزام” (Commit Hash) الفريدة (مجموع اختباري SHA1 مكون من 40 حرفًا لمحتويات الالتزام)، والتي عادة ما تكون بهذا الشكل: da034f6ff3e856b5ba155bc01def0847a1c4ed7e.

git log

تجدر الإشارة أيضًا إلى أنه إذا كنت تبحث عن الاحتفاظ بأحدث التزام (على سبيل المثال، الأخير)، يمكنك ببساطة القيام بذلك:

git log -n 1

الخطوة 3: التخلص من الالتزامات غير المرغوب فيها وتطبيق التزامات محددة

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

أولاً، تخلص من جميع الالتزامات على الفرع باستخدام:

git reset --hard <upstream>/<master>

ببساطة، يخبر الأمر أعلاه Git بالتخلص من جميع التغييرات المرحلية (staged) وغير المرحلية (un-staged). سينسى كل شيء على الفرع المحلي الحالي ويجعله مطابقًا تمامًا لـ upstream/master.

ثانيًا، قم بتطبيق هذا الالتزام الفردي على الفرع باستخدام الأمر:

git cherry-pick Hash //where Hash is a commit hash from other branch

يختار هذا الأمر مرجعًا واحدًا (أي التزامًا) افتراضيًا من فرع ويطبقه على فرع آخر.

الخطوة 4: تحديث الفرع البعيد (Remote Branch)

عند تشغيل git status، سيبلغك بأن فرعك <origin>/<descriptive-branch-name> قد تباعد (diverged). بما أن هذا أمر متوقع، نحتاج إلى إجبار المستودع البعيد على احتواء التغييرات التي اخترناها فقط (cherry-picked). لإنجاز ذلك، نحتاج إلى استخدام أمر يساعد على محو السجل البعيد واستبداله بسجل مختلف:

git push --force origin

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

الآن، عند تشغيل git status، سيبلغك بأن الفرع محدث (up to date) مع <origin>/<descriptive-branch-name>. هذا يوضح لك أن العملية قد تمت بنجاح.

الخلاصة التقنية

في هذا المقال، استعرضنا الجوانب الأساسية لإدارة المهام (Issues) والتبديل بينها في مستودعات Git المحلية، وهو أمر حيوي للمساهمين في المشاريع مفتوحة المصدر. من خلال فهم كيفية استنساخ المستودعات، وتتبع التغييرات من المصدر الأصلي (upstream)، وإنشاء الفروع (branches) للعمل على مهام محددة، يمكن للمطورين الحفاظ على سير عمل منظم وفعال. كما تطرقنا إلى كيفية التعامل مع الأخطاء الشائعة مثل حذف الالتزامات غير المرغوب فيها، مع التأكيد على أهمية الحذر عند استخدام أوامر قوية مثل git reset --hard و git push --force. إن إتقان هذه المفاهيم يضمن تجربة تطوير سلسة ويقلل من التعارضات، مما يعزز الإنتاجية ويحافظ على سلامة قاعدة الكود.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *