كل ما تريد معرفته عن Git

الحمد لله الذي علَّم بالقلم، علَّم الإنسان ما لم يعلم، والصلاة والسلام على خير معلِّم الناس الخير سيدنا محمد - صلَّى الله عليه وسلم … أما بعد ،،
هل لاحظت أن Git أصبح جزءًا لا يتجزأ من العمل مع الكود البرمجي لدرجة أن الناس نادرًا ما يدرجونه ضمن التقنيات التي يستخدمونها أو في سيرهم الذاتية؟
الافتراض السائد هو أنك تعرفه بالفعل، أو على الأقل تعرف ما يكفي لاستخدامه، لكن هل تعرفه حقًا؟!
كمطورين، يدور روتين حياتنا اليومية حول قراءة وكتابة ومراجعة الأكواد، و Git بلا شك أحد أهم الأدوات التي نستخدمها، إن إتقان الميزات والوظائف التي يقدمها Git يعد أحد أفضل الاستثمارات التي يمكنك القيام بها لتطوير نفسك كمبرمج.
يمكنك اعتبار Git كأنه "آلة زمن" خاصة بالكود البرمجي؛ فهو يُمكّنك من استعراض تاريخ الكود، مما يسمح لك بالعودة إلى لحظة محددة في الماضي لمراجعة حالة الكود البرمجي في تلك الفترة.
إضافة إلى أنه يوفر ميزة تتبع التغييرات التي أجريت على الكود، حيث يمكنك معرفة من قام بالتعديل، ومتى تم ذلك، مما يُسهل التعاون في المشاريع الجماعية.
والأهم من ذلك، أنه يمنحك القدرة على التراجع عن أي تعديلات قمت بها واستعادة النسخ السابقة من الكود بسهولة، مما يجعله أداة قوية لإدارة التغييرات وحماية العمل من الأخطاء.
أهم المفاهيم
لفهم قوة وكفاءة Git بشكل كامل، من الضروري التعمق في بعض التفاصيل التقنية التي تجعله مميزًا، إليك شرحاً مفصلاً لأهم المفاهيم الأساسية التي تساعد في فهم آلية عمل Git:
المستودع (repository)
يعرف اختصارا ب "Repo"، وهو عبارة عن مجلد يحتوي على جميع ملفات المشروع بالإضافة إلى تاريخ التغييرات التي أجريتها على هذه الملفات. يمكن أن يشمل المستودع عدة فروع، وكل فرع يمثل مسارًا مختلفًا للتطوير.
عندما تقوم بتهيئة Git في مجلد باستخدام الأمر git init، يصبح هذا المجلد مستودعًا يحتوي على كل الإصدارات والتعديلات التي تمت على المشروع.
باختصار، المستودع يحفظ جميع مراحل التطوير ويسهل الرجوع لأي نقطة زمنية في تاريخ المشروع.
الإيداعات (Commits)
هي طريقة لحفظ التغييرات التي تجريها على مشروعك، كل إيداع لديه معرف خاص به يساعد Git على تتبع التغييرات بترتيب حدوثها.
يمكنك التفكير في الإيداع كصورة لحالة مشروعك في لحظة محددة، بعد نقل الملفات إلى منطقة التهيئة، يمكنك استخدام الأمر git commit لحفظ حالة الملفات في تلك اللحظة.
هذا يعني أنك ستتمكن دائمًا من الرجوع إلى الإيداع في وقت لاحق أو مقارنة التغييرات بين إيداعين.
من المهم أن تفهم أن الإيداع ليس نشرًا للتطبيق، بل هو مجرد حفظ نسخة يمكنك العمل عليها أو اختبارها، وبمرور الوقت، تشكل الإيداعات تاريخًا شاملًا لمراحل تطوّر مشروعك.
منطقة التهيئة (Staging area)
هي مكان مؤقت تضع فيه التغييرات التي قمت بها على ملفاتك قبل حفظها بشكل نهائي في المستودع، يمكنك التفكير فيها كمسودة تُعد فيها التعديلات قبل اتخاذ القرار بحفظها، لإضافة الملفات إلى هذه المنطقة، تستخدم الأمر git add.
هذه المرحلة تساعدك على مراجعة التغييرات والتأكد منها قبل أن تصبح جزءًا من المشروع، فهي تتيح لك التحكم الكامل فيما يتم حفظه وما يبقى للتعديل لاحقًا.
الفروع (Branches)
تساعدك على العمل على تغييرات جديدة في المشروع دون التأثير على الكود الرئيسي. بشكل افتراضي، الفرع الرئيسي يسمى "main" (أو "master" سابقًا).
إذا كنت تريد إضافة ميزة جديدة أو إصلاح مشكلة، يمكنك إنشاء فرع جديد باستخدام الأمر.
git branch <branch-name>
هذا يعني أن التغييرات التي تجريها ستكون معزولة عن الكود الأساسي، مما يسمح لك بالتجربة دون الإضرار بالمشروع.
الفروع تعمل بشكل منفصل، حيث يمكنك إجراء تعديلات على فرع خاص بك دون أن تؤثر على فروع الآخرين، وكل فرع يمثل مجموعة من الإيداعات التي تسجل التغييرات التي قمت بها منذ بدء العمل على المشروع.
الدمج (Merging)
هو عملية إدماج التغييرات التي أجريتها في فرع معين مع الفرع الرئيسي "main" (أو أي فرع آخر).
بمجرد الانتهاء من التعديلات في فرعك، يمكنك استخدام الأمر git merge لدمج هذه التغييرات مع الفرع الرئيسي.
ببساطة، الدمج هو عملية إعادة توحيد مسارات التطوير المختلفة في المشروع إلى مسار واحد.
يقوم Git بجمع الإيداعات من فرعين ودمجها في فرع واحد، مما يضمن أن جميع التغييرات متزامنة وموجودة في نفس الفرع.
المستودعات البعيدة (Remote Repositories)
هي مستودعات موجودة على خوادم خارجية مثل GitHub أو GitLab أو Bitbucket، وتتيح لك التعاون مع الآخرين في مشروعك.
أثناء العمل محليًا على جهازك، يمكنك الإتصال بالمستودعات البعيدة باستخدام الأمر git remote، هذا يسمح لك بمشاركة التغييرات وسحب التحديثات من مستودع مركزي.
المستودع البعيد هو مستودع لا يوجد على جهازك، ويمكنك ربطه بمشروعك لتتمكن من إرسال التغييرات إليه أو استلام التحديثات منه.
الأوامر "Push" و"Pull"
تسمح لك بالتفاعل مع المستودعات البعيدة، بعد الاتصال بمستودع بعيد، يمكنك استخدام الأمر push لإرسال التغييرات من جهازك إلى المستودع البعيد، مما يتيح للآخرين رؤية الكود الخاص بك والتعاون عليه.
وبالمثل، يمكنك استخدام الأمر pull لجلب التحديثات من المستودع البعيد إلى نسختك المحلية، لضمان أن لديك أحدث التعديلات.
عندما تقوم بعملية pull، فأنت تقوم بجلب التغييرات من الخادم البعيد ودمجها مع الكود الموجود على جهازك، أما عند استخدام push، فأنت تقوم بنقل التغييرات التي أجريتها محليًا إلى المستودع البعيد.
الأمر "fetch"
هذا الأمر يشبه الأمر pull من حيث أنه يتيح لك جلب التحديثات من مستودع بعيد، ولكنه لا يقوم بدمج هذه التغييرات تلقائيًا في الفرع الحالي.
هذا يمنحك مرونة لمراجعة التغييرات أولاً قبل دمجها في الكود الخاص بك.
باستخدام fetch، يمكنك الاطلاع على التحديثات والتأكد من أنها مناسبة قبل اتخاذ قرار بدمجها، مما يوفر لك سيطرة أكبر على عملية التطوير.
الأمر "clone"
يُستخدم لإنشاء نسخة من مستودع Git موجود بالفعل، عند تنفيذ الأمر git clone، يتم إنشاء مجلد جديد على جهازك يحتوي على جميع ملفات المستودع وتاريخه الكامل.
هذه هي الطريقة الأسهل لبدء التعاون في مشروع، حيث يقوم clone بتنزيل جميع محتويات المستودع من خادم بعيد مثل GitHub إلى جهازك المحلي.
يعتبر clone نسخة كاملة من المستودع البعيد، ولكن إذا لم تكن لديك الأذونات اللازمة، فلن تتمكن من إرسال تغييراتك إلى المستودع الأصلي (الذي تم نسخه).
حل التعارضات (Conflict resolution)
يحدث أحيانًا عندما يعمل عدة أشخاص على نفس الجزء من الكود أن تنشأ تعارضات، ولكن Git يحتوي على أدوات مدمجة لتحديد هذه التعارضات وإبرازها، مما يتيح للمطورين حلها يدويًا قبل إتمام عملية الدمج.
لا داعي للقلق، فعند محاولة دمج أو إعادة ترتيب (rebase) الفروع وظهور تعارضات، فهذا يعني ببساطة أن هناك تغييرات متعارضة في إصدارات مختلفة من نفس الملف.
يمكن عادةً حل هذه التعارضات بسهولة عن طريق فهم الهدف من كل تغيير وتحديد كيفية دمج كلا التعديلين معًا.
في بعض الأحيان، قد تحتاج إلى مراجعة الإيداعات (commits) المتعلقة بكل تغيير للحصول على السياق الكامل وحل التعارض بشكل صحيح.
الأمر "stash"
يسمح لك بحفظ التغييرات التي تعمل عليها مؤقتًا دون الحاجة إلى إنشاء إيداع (commit).
إذا كنت تعمل على ملفات معينة وتريد التوقف مؤقتًا أو الانتقال للعمل على شيء آخر دون فقدان التغييرات، يمكنك استخدام الأمر git stash لتخزين التغييرات بشكل مؤقت.
هذا مفيد عندما ترغب في تبديل الفروع أثناء العمل على جزء غير مكتمل من المشروع، حيث يمكنك حفظ التغييرات واستئناف العمل عليها لاحقًا دون الحاجة إلى إيداع عمل غير مكتمل.
الأمر "checkout"
يُستخدم هذا الأمر للتنقل بين الفروع المختلفة في المشروع؛ في المشاريع الكبيرة، قد يكون هناك العديد من الفروع النشطة في نفس الوقت.
باستخدام git checkout يمكنك تغيير الفرع الذي تعمل عليه حاليًا.
هذا الأمر يقوم بتحديث الملفات في دليل العمل إلى أحدث نسخة من الفرع الذي اخترته، وأي إيداعات جديدة ستتم على هذا الفرع حتى تقرر الانتقال إلى فرع آخر.
التفرع (Forking)
إن الفرع (Branch) في Git يُعتبر انحرافًا مؤقتًا عن الكود الأساسي للمشروع، بهدف دمج التغييرات مرة أخرى لاحقًا، أما التفرع (Fork) فهو انحراف دائم عن المشروع الأصلي.
في المشاريع مفتوحة المصدر، يحدث التفرع عندما يقرر مطور أخذ كود المصدر الخاص بمشروع معين وتطويره لأهداف مختلفة عن أهداف المسؤولين عن المشروع.
منصة GitHub تسهل عملية التفرع بشكل كبير، حيث يمكنك بنقرة واحدة نسخ مستودع Git موجود والبدء في العمل عليه وفقًا لرؤيتك الخاصة.
التفرع يعني أنك تمتلك نسخة كاملة من مشروع شخص آخر في حسابك على GitHub، بحيث يكون هناك مستودعان لنفس المشروع: واحد في حساب المطور الأصلي وآخر في حسابك.
طلب السحب (Pull Request)
هو طريقة شائعة في Git للتعاون بين المطورين؛ بدلاً من دفع (push) التغييرات مباشرةً إلى المستودع المركزي، يمكنك إرسال طلب سحب.
على سبيل المثال، إذا كنت قد أكملت ميزة جديدة وترغب في دمجها في الكود الأساسي للمشروع، يمكنك تقديم طلب سحب، مما يتيح لمديري المشروع مراجعة التغييرات والموافقة عليها أو رفضها.
طلب السحب لا يتيح فقط لمديري المشروع اتخاذ القرار، بل يفتح أيضًا نقاشًا بين أعضاء الفريق حول التعديلات المقترحة.
هذا الأمر مهم بشكل خاص في المشاريع مفتوحة المصدر، حيث يعد Git المكان الرئيسي لتفاعل المساهمين.
من خلال طلبات السحب، يمكن للمطورين التعاون ومراجعة الكود بسهولة قبل دمجه في المستودع الرئيسي.
عملية "Cherry-picking"
تُستخدم هذه العملية لانتقاء تغييرات محددة من فرع ودمجها في فرع آخر، وذلك عندما لا يكون من المناسب أو الممكن دمج الفرع بأكمله.
هذه الطريقة مفيدة إذا كنت بحاجة إلى دمج إيداعات معينة فقط دون سحب كل التغييرات.
ومع ذلك، من المهم استخدام "Cherry-picking" بحذر، لأنه قد يؤدي إلى تكرار الإيداعات وتباين في تاريخ المشروع إذا تم استخدامه بشكل غير صحيح.
الأمر "log"
يسمح لك هذا الأمر بمشاهدة تاريخ الإيداعات التي قمت بها في المشروع.
باستخدام الأمر git log، يمكنك عرض قائمة بالإيداعات السابقة، بما في ذلك مُعرّفاتها الفريدة (IDs) والرسائل المرتبطة بكل إيداع.
هذا يساعدك على تتبع التغييرات التي تمت على الكود وفهم تفاصيل كل إيداع، مثل من قام به ومتى تم إجراؤه.
يعتبر git log أداة مفيدة لمراجعة تاريخ المشروع وفهم مسار التطوير.
نصائح هامة
فيما يلي مجموعة من النصائح التي يجب معرفتها لاستخدام Git، سواء كنت مبتدئًا أو تستخدمه منذ فترة، ستساعدك هذه النصائح على تحسين مهاراتك والحفاظ على مستواك المتميز.
قم بعمل إيداعات (Commits) صغيرة ومنتظمة
فكر في الإيداعات كما لو كنت تحفظ تقدمك في لعبة فيديو. بالطبع لن تلعب لساعات دون أن تحفظ تقدمك، أليس كذلك؟ نفس الفكرة تنطبق على البرمجة.
عندما تعمل على مشروع، حاول أن تقوم بعمل إيداع (Commit) للتغييرات التي تجريها على شكل أجزاء صغيرة وسهلة الإدارة.
لماذا هذا مهم؟ لأنه إذا حدث خطأ ما، سيكون من الأسهل تحديد السبب وإصلاحه. كما أنه يوفر عليك التوتر الناتج عن محاولة التعامل مع الكثير من التغييرات دفعة واحدة.
أيضا حاول أن تكتب رسائل إيداع واضحة. بدلاً من كتابة شيء غامض مثل "تم الإصلاح"، جرب أن تكتب رسالة توضح بالضبط ما قمت به، مثل "إصلاح مشكلة تسجيل الدخول".
هذا سيساعدك لاحقًا إذا إحتجت للعودة ومراجعة التغييرات التي أجريتها.
استخدم الفروع (Branches) بذكاء
لنفترض أنك تريد إضافة ميزة جديدة إلى مشروعك، لكنك لا ترغب في التأثير على الكود الرئيسي أو المخاطرة بإفساده. هنا تأتي أهمية الفروع.
فكر في الفروع على أنها نسخ منفصلة من الكود البرمجي. يمكنك العمل على هذه النسخة وإجراء التعديلات دون تغيير الكود الرئيسي.
إذا كنت راضيًا عن التعديلات، يمكنك دمجها في الكود الرئيسي. وإذا حدثت مشكلة، يمكنك ببساطة حذف الفرع ولن يؤثر ذلك على الكود الرئيسي.
أيضا حاول اختيار أسماء واضحة للفروع تعكس العمل الذي تقوم به. على سبيل المثال، إذا كنت تعمل على إضافة ميزة تسجيل الدخول، يمكنك تسمية الفرع "feature/login".
هذا سيجعل من السهل معرفة الغرض من كل فرع في المستقبل.
التعامل مع تعارضات الدمج (Merge Conflicts)؛ لا داعي للقلق!
قد تكون سمعت عن تعارضات الدمج من قبل، وربما تشعر بالخوف منها، لكنها ليست معقدة كما قد تبدو.
تعارض الدمج يحدث عندما يقوم أكثر من شخص بتعديل نفس الجزء من الكود. في هذه الحالة، يطلب منك Git التدخل واختيار التعديلات التي ترغب في الاحتفاظ بها.
سيعرض Git الأجزاء المتعارضة من الكود، ومن ثم يمكنك أن تقرر أي جزء تريد الاحتفاظ به أو دمج التغييرات المختلفة معًا.
اعتبر تعارضات الدمج فرصة لمراجعة الكود بتمعن واتخاذ القرار المناسب حول كيفية دمج التغييرات المختلفة.
استخدم gitignore للحفاظ على ترتيب مشروعك
في بعض الأحيان، قد يحتوي المشروع على ملفات لا ترغب في أن يقوم Git بتتبعها، مثل الملفات المؤقتة أو ملفات الإعدادات المحلية (Local configs)، وهنا يأتي دور ملف gitignore.
ملف gitignore يسمح لك بتحديد الملفات التي تريد أن يتجاهلها Git ولا يقوم بتتبعها، على سبيل المثال، يمكنك استبعاد ملفات الإعدادات التي لا تحتاج إلى مشاركتها مع الآخرين.
مهم جدا أن تتأكد من إضافة الملفات الشائعة مثل "env" التي تحتوي على متغيرات بيئة التشغيل (Environment variables) وأيضا "node_modules" إلى ملف gitignore، حتى يبقى مستودعك نظيفًا وخاليًا من الملفات غير الضرورية.
اسحب (Pull) قبل أن ترفع (Push)
قد تصادف أحيانًا رسالة خطأ عند محاولة رفع (push) تغييراتك إلى المستودع. السبب غالبًا هو أن زملاءك قد أجروا تغييرات لم تحصل عليها بعد.
الحل بسيط، تأكد دائمًا من عمل سحب (pull) للتغييرات من المستودع قبل أن تقوم بدفع (push) تغييراتك. هذا يضمن أن الكود لديك محدث ومُزامن مع آخر التغييرات، مما يقلل من فرص حدوث التعارضات ويسهل عملية الدمج.
أهم الأوامر
إليك أبرز الأوامر الأكثر شيوعًا واستخدامًا في Git، حتى إن كنت تعتمد على برامج جاهزة لإدارة وظائف Git مثل SourceTree أو VSCode، فإن فهمك العميق لهذه الأوامر سيكشف لك العديد من الجوانب المهمة والمفيدة.
# Clone a Repository
git clone <repository_url>
# Stage Changes for Commit
git add <file(s)>
# Commit Changes
git commit -m "Commit message"
# Push Changes to the Remote Repository
git push
# Force Push Changes (use with caution)
git push --force
# Reset Working Directory to Last Commit
git reset --hard
# Create a New Branch
git branch <branch_name>
# Switch to a Different Branch
git checkout <branch_name>
# Merge Changes from Another Branch
git merge <branch_name>
# View Status of Working Directory
git status
# View Commit History
git log
# Undo Last Commit (use with caution)
git reset --soft HEAD^
# Discard Changes in Working Directory
git restore <file(s)>
# Pull changes from remote repo
git pull <remote_name> <branch_name>
# Fetch changes from remote repo
git fetch <remote_name>
الفرق بين git و github
إن Git و GitHub تقنيتان مكملتان لبعضهما، حيث يعد Git نظامًا للتحكم في الإصدارات، بينما GitHub هو خدمة استضافة سحابية تساعد فرق العمل على إدارة مستودعات الأكواد البرمجية (repositories).
تم إطلاق GitHub في عام 2008 لتسهيل البرمجة التعاونية باستخدام Git، وهو ما جعلها منصة رائدة في المجال وجذبت ملايين المستخدمين عالميًا.
بالإضافة إلى ميزات Git التقليدية، توفر GitHub ميزات إضافية مثل تتبع الأخطاء، وإدارة المهام، والتكامل المستمر (CI).
تعمل GitHub بنظام freemium، حيث تتوفر ميزات مجانية مع خيار الاشتراك للوصول إلى الميزات المتقدمة. وهي مملوكة لشركة Microsoft منذ 2018.
ورغم وجود خدمات منافسة مثل GitLab و Bitbucket، تظل GitHub الأكثر شعبية عالميًا.
خاتمة
للوهلة الأولى، قد يبدو Git نظامًا معقدًا ويصعب التعامل معه، لكن بمجرد أن تفهم آلياته وتعتاد استخدامه، ستدرك مدى أهميته وستسأل نفسك كيف كنت تدير مشاريعك البرمجية بدونه.
إن Git يعد بمثابة صمام أمان قوي لمشروعك، حيث يتيح لك استرجاع الإصدارات السابقة، وتتبع التغييرات، والتعامل مع الأخطاء بكل سهولة، مما يجعله أداة لا غنى عنها في تطوير البرمجيات.
في هذا المقال، حاولت تقديم شرح لأهم المفاهيم الأساسية، بالإضافة إلى استعراض الأوامر الأكثر شيوعًا في Git التي قد تحتاج استخدامها عند إدارة المستودعات والتعاون في تطوير البرمجيات.
هناك العديد من الأوامر الأخرى والتعديلات التي قد تجدها مفيدة كجزء من عملك مع Git. لمعرفة المزيد حول جميع الخيارات المتاحة لك، يمكنك تشغيل الأمر التالي للحصول على معلومات مفيدة:
git --help
كما يمكنك أيضًا قراءة المزيد حول Git والاطلاع على وثائقه من الموقع الرسمي لـ Git.
وفقنى الله وإياك إلى ما يحبه ويرضاه ،،