اذهب إلى المحتوى

ما هو Git؟


هدى جبور

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

هذا المقال جزء من سلسلة مقالات حول جيت Git، وإليك روابط جميع المقالات ضمن هذه السلسلة:

  1. ماهو جيت git؟
  2. بدء العمل مع نظام إدارة الإصدارات جيت
  3. إنشاء أول مستودع لك من خلال جيت
  4. كيفية استعادة إصدارات الملفات القديمة في جيت
  5. ثلاث أدوات رسومية للأداة جيت
  6. كيفية بناء خادم جيت
  7. كيفية إدارة الكائنات الثنائية Bainary Blobs باستخدام جيت

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

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

ما هو نظام إدارة الإصدار؟

بدايةً يجب أن نعلم أن جيت هو نظام إدارة الإصدار (وتسمى أيضًا "إدارة النُسخ") version control system واختصارًا VCS. هناك العديد من أنظمة التحكم في الإصدار: مثل CVS و SVN و Mercurial و Fossil وبالطبع جيت.

يُمثل جيت اللبنة الأساسية للعديد من الخدمات، مثل جيت هاب GitHub وجيت لاب GitLab، ولكن يمكنك استخدام جيت لوحدها، أي بعيداً عن أي خدمة.

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

يشير جيسون فان جومستر Jason van Gumster في مقالته التحكم في الإصدار ليس للمبرمجين فقط إلى أن الفنانين يحتاجون أيضًا إلى التحكم في الإصدار، حيث تظهر هذه الحاجة في أعمالنا الفردية أيضًا.

عند التعامل مع المشاريع العلمية أو حتى الفنية عادةً ما يتم تطوير نسخة تجريبية من شيء ما؛ نسخة أولى وثانية وثالثة و بمسميات مختلفة مثل project_justTesting.kdenlive و project_betterVersion.kdenlive، و project_best_FINAL.kdenlive وهكذا حتى نصل إلى النُسخة النهائية الأفضل.

سواءً أكان تعديلًا برمجيًا صغيرًا في حلقة for أو أي تغييرٍ آخر، فإن نظام التحكم بالإصدارات يأتي لتسهيل الأمور وتقديم الأفضل لنا.

لقطات Git

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

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

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

أوامر غيت

جيت هي الأداة السائدة للتحكم في الإصدار هذه الأيام. إليك كيفية استخدام هذه الأداة بشكل فعال.

الأساسيات - عند العمل مع جيت بمفردك أو مع الآخرين

إليك أهم الأوامر الأساسية من أوامر غيت يليها شرحها:

git status

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

git diff

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

يمكنك أن تستخدم مع هذا الأمر الراية ‎--name-only لرؤية أسماء الملفات التي تم تغييرها.

git add

يستخدم لإدراج تعديلات على الملفات المتتبعة وغير المتتبعة.

git commit

يستخدم لإنشاء إيداع جديد يتضمن التغييرات التي أضفتها، وتشبه نقطة الحفظ في الألعاب Save Point حيث يمكن من خلالها العودة إلى نسخة معينة تم الحفظ عندها. في حال أردت إرفاق عملية الإيداع برسالة توضيحية (تسمى رسالة الإيداع) استخدم ‎-m وأضف رسالة ذات معنى معبر.

git push

لإرسال التغييرات إلى المستودع البعيد الذي تم إنشاؤه (من الشائع استخدامه أكثر مع GitLab أو GitHub).

رايات flags مهمة - للحفاظ على كل شيء منظما

git reset HEAD --

يؤدي إلى إزالة كل التغييرات التي لم يتم إيداعها والعودة إلى آخر إيداع، وهذا ما يشير إليه HEAD، وبتعبير أدق فإن HEAD هو مؤشر يشير دائمًا إلى الإيداع الحالي، وقد ينتمي أو لا ينتمي أحيانًا إلى الفرع الحالي.

git add -u

يستخدم لإدراج الملفات المحدثة فقط، والتي تم إيداعها مسبقًا.

git log --graph
--pretty=oneline
--abbrev-commit

لتأريخ الفرع بشكل أرتب وأجمل أنشئ قشرة shell أو استخدم الاختصارات Aliases (الأمر git alias) لتسهيل الوصول، على سبيل المثال git lg.

العمل مع مستودع بعيد

إليك أهم الأوامر يليها شرحها:

git fetch --all

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

git pull --rebase <remote><branch>

يستخدم لدمج جميع الإيداعات بدءًا من آخر إيداع مشترك لك من الفرع البعيد دون إنشاء إيداع دمج.

git stash

يستخدم لحفظ التغييرات التي لم يتم إيداعها محليًا (المرحليّة وغير المرحليّة) مما يسمح لك بإجراء التغييرات وتبديل الفروع وتنفيذ أوامر جيت الأخرى.

git stash pop

لإعادتها، حيث أن pop يزيل التغييرات من stash ويعيد تطبيقها على نسخة العمل.

gi t add [-A or . or -- <filename>]

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

git commit -m "commit message"

تم شرحه مسبقًا.

git push origin <branch>

دفع الفرع الحالي إلى المستودع البعيد الذي يحمل العنوان "origin" والفرع المسمى branch.

git checkout -b <new_branch>

اختصار:

git branch

والأمر:

git checkout

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

git checkout master && git pull --rebase

يستخدمان في حال أردنا الوصول إلى أحدث إيداع في مشروع لا تتابعه إلا نادرًا.

git reset --hard origin/master

يستخدم عند الحاجة إلى الوصول إلى حالة معروفة.

تنبيه: يؤدي هذا إلى مسح جميع التغييرات، حتى الإيداعات، بدءًا من الإيداع الأخير و وصولًا إلى المستودع البعيد origin في الفرع master.

git push origin master

عندما تُجري بعض العمليات الصحيحة، يمكنك استخدامه لإرسال تغييراتك إلى المستودع البعيد المسمى origin في الفرع master.

تعليمات الحصول على المساعدة

git <cmd> -h

لمراجعة مختصرة للرايات الخاصة بالأمر المحدد.

git <cmd> --help

لمشاهدة جميع الخيارات المتاحة للأمر المحدد.

الفروع الأساسية

تمثل الفروع سلسلة من الارتباطات وإليك أهم الأوامر للتعامل معها يليها شرحها:

git branch --all

قائمة بجميع الفروع المحلية والبعيدة.

git checkout <branch>

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

git checkout -b <branch> master

إنشاء فرع قائم على الفرع master ثم الانتقال إليه.

git checkout master && git merge <branch>

دمج التغييرات في الفرع master.

سلسلة أوامر: سلسلة أوامر نستخدمها بشكل يومي مع غيت

استخدم الأمر cd للانتقال إلى مشروعك المحلي الذي تريد بدء إصداره باستخدام (المجلد الذي يحتوي ملفات المشروع على جهازك).

بعد ذلك كل ما عليك فعله هو تنفيذ الأمرgit init لأول مرة لإعداد المجلد وتتبع الإصدار:

git init
git status
git add --all
git status
git commit -m "meaningful initial commit message"
git show

بعد ذلك تبدأ بتعديلاتك على ملفاتك المحلية، ثم تقوم بإيداعها على فترات منتظمة:

git diff
git commit -a -m "Another commit message. -a performs the add step for you"
git status
git log --graph --pretty=oneline --abbrev-commit

بعد فترة، قد يصبح لديك 3 إيداعات، وبالتالي سيكون من الأفضل اعتبارها إيداعًا واحدًا:

git log --graph --pretty=oneline --abbrev-commit
git reset --soft HEAD~3
git diff --cached
git commit -a -m "Better commit message for last 3 commits"

وأخيرًا ، ربما تحتاج لحذف بعض الملفات غير الضرورية في المجلد الحالي:

git status
git diff --cached
git add -u
git commit -m "Another commit message. -u adds updates, including deleted files"
git status
git log --graph --pretty=oneline --abbrev-commit
git push origin master

التطوير الموزع باستخدام جيت

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

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

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

واجهات جيت

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

يُعتبر جيت أداة مجانية تمامًا وبإمكان الجميع استخدامه، ويأتي على شكل حزم كل منها مخصص للعمل على نظام تشغيل مختلف ("مثل" Linux و BSD و Illumos وأنظمة تشغيل أخرى شبيهة بيونكسـ Unix)، ويمكنك معرفة إصدار حزمة جيت المثبتة لديك بالشكل التالي:

$ git --version
git version 2.5.3

إن واجهات جيت الأكثر شهرة معظمها قائم على الويب: مواقع مثل bitbucket و gitlab و github و sourceforge و Savannah جميعها توفر إمكانية استضافة الشيفرة على الإنترنت والهدف الرئيسي لهذه المواقع هو تعظيم المحتوى مفتوح المصدر للعامة، إضافةً إلى أنها توفر (وبدرجات مختلفة) واجهات المستخدم الرسومية المبنية على المتصفحات لتسهيل استخدام جيت.

واجهة GitLab تظهر بالشكل التالي:

0_gitlab.png

إضافة إلى ذلك من الممكن أن يكون لخدمة جيت أو للمطورين المستقلين؛ واجهة مخصصة لا تعتمد على الويب، وبالتالي هي مفيدة في حال لم تكن ترغب بالعمل من خلال المتصفحات. أوضح مثال على ذلك هو مدير الملفات، على سبيل المثال يمكن لمدير ملفات KDE مثل Dolphin التحقق من حالة ملفات المستودع git status وتوليد أوامر الإيداع commit والسحب والدفع.

0_dolphin.jpg

تطبيق Sparkleshare يستخدم جيت كأساس لواجهة مشاركة الملفات الخاصة كما هو الحال مع تطبيق Dropbox.

0_sparkleshare_1.jpg

للمزيد من المعلومات راجع الصفحة الرسمية التالية Git wiki التي تعرض قائمة كاملة بمشاريع واجهة جيت الرسومية.

من يجب أن يستخدم جيت؟

السؤال الأفضل والأكثر دقة يجب أن يكون متى؟ ولماذا؟

متى يجب أن أستخدم جيت، وما الذي يجب أن أستخدمه من أجله؟

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

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

لكن ما هو النص؟ عندما تقوم بكتابة شيءٍ ما من خلال استخدام أحد التطبيقات المكتبية مثل Libre Office، فغالبًا قد لا تضع النص كما هو، أي ربما قد يكون النص الذي تكتبه موضوعاً ضمن ملفات XML، وربما أيضًا قمت بضغط ملفات XML مع بعضها البعض ضمن مجلد واحد من خلال أحد برامج الضغط مثل ZIP، وذلك لجمعها مع بعضها لتسهيل الرجوع إليها أو لضمان أن جميع الأشياء المهمة التي تريدها موجودة في ملف واحد عندما تريد إرسالها لشخص ما.

إن أنواع الملفات التي نحفظ بها مشاريعنا والتي نعتقد أنها أنواع معقدة لحفظ البيانات مثل Kdenlive، أو SVG من inkscape هي في الواقع مكونة من ملفات XML، وتستطيع جيت إدارتها بسهولة.

إذا كنت تستخدم "يونكس" Unix، فيمكنك معرفة مما يتكون منه الملف باستخدام الأمر file كما يلي:

$ file ~/path/to/my-file.blah

my-file.blah: ASCII text

$ file ~/path/to/different-file.kra: Zip data (MIME type "application/x-krita")

وإذا أردت التأكد من ذلك، يمكنك عرض محتويات الملف باستخدام الأمر head كما يلي:

$ head ~/path/to/my-file.blah

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

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

"<sky>ugly greenish-blue</sky>"

فإن تعديله إلى:

"<sky>blue-with-fluffy-clouds</sky>"

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

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

في حال كنت تعمل على مشروع يتضمن ملفات نصية وكائنات تمثل بيانات ثنائية حجمها كبير (كما في حالة ألعاب الفيديو التي تحتوي شيفرات مصدرية متساوية لكل من البيانات الرسومية والصوتية)، فهنا بإمكانك القيام بأحد الأمرين التاليين: إما ابتكار حل خاص بك، على سبيل المثال استخدام المؤشرات على محرك أقراص شبكة مشترك، أو استخدام أدوات إضافية مثل أداة جوي هيس الممتازة git annex، أو مشروع Git-Media.

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

ترجمة -وبتصرف- للمقال ?What is Git لصاحبه Seth Kenlon.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...