Professional Documents
Culture Documents
تعلم git
تعلم git
تأليف:
سيد صالح
م .مختار ّ
جميع الحقوق محفوظة للمؤلف
أساسيّات git
4
ما هي git؟
gitه ي أداة تس تخدمها ف رق العم ل بش لل ع ام و البرمخي ة منه ا بش لل خ اص إلدارة إص دارات
المشروع/العمل الذي يتعاون أعضاء الفريق على إنخازه.
إملانية تتبع التغييرات التي أجراها أعضاء الفريق على ملفات المشروع
ّ و نعني ب "إدارة اإلصدارات"
و ت اريو ا ل تغيي ر إ افة لعض و الفري ق خ الل م ار ل تنفي ذه المختلف ة بحي د يمل ن تحدي د وق
المسؤول المتسبب بهذا التغيير.
س بباً مرخص تخارّياً و بالتالي الستخدامت من قبل مختمع ابي ر م ن المة ّورين تبع ات قانوني ة اان
ّ
1
النزع.
في إشعال فتيل ا
1
https://en.wikipedia.org/wiki/Git#History
5
إملاني ة التع اون ف ي المش اريع البرمخي ة بحي د يمل ن ألكث ر م ن عض و ف ي الفري ق
ّ .3إتا ة
ياع ّأية مساهمات. دون الوق الملف/الملفات في نف العمل على نف
تثبيت :git
gitباختالف نظام التشغيل المستخدم و فيما يلي التفاصيل: تختلف آلية تثبي
Installerيمل ن تحميل ه م ن خ الل مع ال تثبي • أنظم ة وين دوز : Windowsي تم التثبي
من موقع األداة الرسمي.
المخص ص لك ل :Linuxباس تخدام س ةر األوام ر ،و اتب اع أم ر التثبي • أنظم ة لي نك
و التي ملن مراجعتها من خالل موقع األداة الرسمي. توزيعة من توزيعات لينك
الخ اص • أنظمة ماك أو إو :MacOsباستخدام homebrewأو باستخدام معال التثبي
بماك أو إو و الذي يملن تحميل من موقع األداة الرسمي.
الخاصة بنظام التشغيل الذي تعمل عليت ،يملنك تخريب األمر: بعد اتباع تعليمات التثبي
git --version
األداة يد يفت رأ أن يظه ر رق م اإلص دار ال ذي ت م تثبيت ت للت ّو في سةر األوامر للتأكد من تثبي
2
كما تو ّ ح الصورة أدناه.
2
في متن هذا الكتاب سأستعمل سةر أوامر ماك أو إو MacOsنظ اًر ألنني أكتب هذا الكتاب على ،Macbook Proلك ن بش لل ع ام
األسلوب. يملنك استخدام سةر األوامر المتاح في نظام التشغيل الذي تستعملت بنف
6
تعريف حساب gitالمحلّي
يفضل أن نقوم بتعريف الحساب المحلّي الخاص بنا على ،gitو ذلك من
قبل أن نبدأ باستخدام ّ git
خالل تنفيذ األمرين:
"git config --global user.name "Muktar SayedSaleh
به ذه الةريق ة و عن دما نق وم باس تخدام gitبع د قلي ل لحف ي أي ة تغيي رات نق وم به ا ،فس تظهر تل ك
أن المتس بب به ا ه و المس تخدم ص ا ب االس م و البري د اإللكترون ي ال ذين أدخلناهم ا
التغييرات عل ى ّ
أعاله.
تغيي ر اس م المس تخدم وعن وان البري د ف ي المث ال أع اله إل ى اس م المس تخدم ملحوظ ة أول ى :ال ت ن
الخاص بك و عنوان بريدك اإللكتروني.
ملحوظة ثانية :اوننا استعملها الوسيط الع ام --globalفه ذا يعن ي أن الحس اب ال ذي قمن ا بتعريف ت
سيلون هو الحساب المستخدم في جميع مستودعات gitعلى هذا الحاسوب ،م ا ل م نق م بتخص يص
بعض المستودعات بغير ذلك ص ار ًة; و سنأتي على ذار معنى المستودع بعد قليل.
7
البدء باستخدام git
و اآلن ،يملنن ا الب دء باس تخدام gitإلدارة إص دارات المش روع ال ذي نعم ل عليه ا الي اً ،و ذل ك م ن
خالل االنتقال إلى مخل د المش روع ،ث ّم إدخ ال األم ر الت الي ام ا تب ّين الص ورة أدن اه ،و ذل ك لتحويل ت
إلى مستودع ،gitيد ّأننا نستخدم مصةلح "مستودع" Repositoryلإلشارة إلى أي مشروع تدار
إصداراتت باستخدام ،gitو أمر التهيئة هو:
git init
أن ت تعلم فيملن ك الرج وع إل ى ات ابي ملف ات htmlو أ بب فائ دة :إذا ل م تك ن تعل م اي ف تنش
المنشور مسبقاً و الذي يشرح ذلك بالتفصيل ،أما بالنسبة لهدف هذا الكتاب فيملنك إنشاء أي مل ف
عادي إذا أ بب .
ّ نصي
ّ
8
على ّأية ال ،سنستخدم لمثالنا في الشرح ملف HTMLنضع ب ت المحت وت الت الي ،و نحفظ ت باس م
index.html
><html
ً بك في><head><title
> git!</title></headمرحبا
ً بك في><body><h1
> git!</h1></bodyمرحبا
></html
و اآلن إذا ع دنا إل ى س ةر األوام ر ،و استعر نا الملف ات الموج ودة ف ي مخلّ دنا الخدي د فيخ ب أن
و ماك أو إو ،يستخدم األمر lsالستعراأ الملفات الموج ودة ف ي المخل د ،و ملحوظة :في لينك
يقابلت األمر dirفي سةر أوامر ويندوز.
من صفحات هذا الكتاب ،يد يستعمل هذا األمر لرؤية الو ع الحالي و الذي سنستعملت اثي اًر
أن المل ف جدي د فس يظهره لن ا gitعل ى أن ت
لملفات المشروع بالنسبة ل ،gitو ف ي مثالن ا الح الي بم ا ّ
مل ف جدي د ل م ي تم تتبع ت بع د Untrackedو ل م نق م باال تف ا" ب أي "إص دار" من ت ام ا تب ّين لقة ة
الشاشة أدناه.
9
فبالنسبة ل gitتكون الملفات الموجودة في مستودع ما على إ دت التين:
• :Trackedو تشير إلى الملفات التي يعرفها gitو المضافة إلى المستودع من قبل.
• :Untrackedو تشير إلى الملفات الخديدة التي لم تُضف إلى المستودع بعد.
التتب ع م رو اًر
و س نتعلّم بع د قلي ل األم ر المس تعمل لنق ل الملف ات م ن الته ا غي ر المتتبع ة إل ى ال ة ّ
بمر لة اإلدراج ،و هي ما سنناقشت في الفقرة التالية.
10
مههن حالههة و اآلن إذا قمنا بتنفيذ أمر التحقق من حالة ( gitاألمر )git statusفسنرى انتقههال المله
عدم التتبع بشكل كلّي ،إلى حالة اإلدراج stagingكما تبيّن الصورة التالية:
11
ينفذ األمر commitعملية اإليداع ،وتضيف " -m "messageرسالة ،و هل ذا تك ون بيئ ة اإلدراج
ف ي مس تودعنا م ع رس الة تق ول "بس م ا ال ر من ال ر يم ،اإلي داع األول" ام ا يظه ر ف ي ق د أودع
عملي ة إي داع ،و يس ّمى ه ذا ال رقم
أن gitيق وم تلقائي اً بم نح ت رقيم فري د لك ل ّ
الص ورة أدن اه ،و يال ي ّ
"معرف اإليداع" .Commit ID ّ
م ن قب ل تنفي ذ مر ل ة ملحوظ ة :بالنس بة إلي داع ا لتغيي رات عل ى الملف ات الت ي س بق و أن أودع
مني أثناء القيام بعملية اإليداع من خالل تمرير الوسيط -aبحيد تصبح التعليم ة اإلدراج بشلل
االت إي داع ملف ات غي ر الكامل ة ام ايلي ،م ع نص يحتي بتحاش ي اس تخدام ه ذه التعليم ة لتف ادي
مرغوب بإيداعها عن طريق الخةأ.
مرة أخرى!
إيداع نفس الملف ّ
من المل ف أي تغيي ر
س ناً ،اآلن بع د أن قمن ا بإي داع المل ف للم ّرة األول ى ،فل نقم بعم ل ّ
( index.htmlكإ افة س ةر م ثالً أو تغيي ر محت وت الخمل ة النص ّية) و ذل ك به دف رؤي ة اي ف
سيقوم gitبالتعرف على التغيير الحاصل عند تنفيذ األمر git statusام ا تو حة الص ورة أدن اه،
12
و يرج ى مال ظ ة الم ة modifiedو الت ي تعن ي أن المل ف م درج س ابقاً لكن ت اآلن خض ع لتع ديل
"معدلة "modifiedبمعنى ّأنها مختلفة عن آخر إدراج تم لها في .git
جعل نسختت الحالية ّ
المل ف م ع رس الة خة وات عملي ة اإلي داع الس ابقة ،و إج راء إي داع ث ا
ان ل نف يملننا اآلن تك رار نف
تفيد بسبب اإليداع اما تبينت الصورة التالية:
13
معرف ات عملي ات اإلي داع الس ابقة و ت اريو ا ل منه ا ،و الرس الة الت ي تب ّين س بب
و ال ذي يع رأ ّ
أن
اإليداع اما أدخلها المستخدم ال ذي ق ام بعملي ة اإلي داع ام ا يظه ر ف ي الص ورة أدن اه م ع مال ظ ة ّ
ترتيب ظهور عمليات اإليداع علسي (من األ دث لألقدم)
أداة اس مها gitkتت يح لن ا االط الع عل ى الس خالت م ن خ الل فائ دة :يمل ن بش لل اختي اري تثبي
واجهة استخدام مرئية GUIتو حها الص ورة التالي ة م ع تأكي دي ّأنن ا يخ ب أن ن تعّلم gitم ن خ الل
سةر األوامر لضمان الفهم الكامل آللية عملها و االستفادة القصوت منها.
14
التراجع عن عملية إيداع في git
ثم و لسبب أو آلخر نكتشف أننا بحاجة للتراجع عن بعملية إيداع ما أو أكثرّ ،
ّ يحدث أ ياناً أن نقوم
عملي ات اإلي داع بأس لو ين اثن ين أ دهما بس يط و سنناقش ت
عملية اإليداع تلك ،تتيح gitالتراجع عن ّ
الكتيب بإذن ا تعالى.
في هذه الفقرة ،و اآلخر متقدم سنناقشت في الفصل الرابع من هذا ّ
معين ة م ن خ الل
أم ا األم ر البس يط فه و أم ر git revertو ال ذي يق وم ب التراجع ع ن عملي ة إي داع ّ
ّ
القيام بعملية إيداع أخرت معاكسة تماماً بحيد تكون النتيخة العودة بالملفات إل ى الته ا الت ي اان
عليها قبل عملية اإليداع األساسية التي نرغب بالتراجع عنها.
و لك ي نفه م األم ر بش لل عمل ي ،ل نقم ب التراجع ع ن عملي ة اإلي داع الثاني ة الت ي قمن ا به ا ف ي الفق رة
الس ابقة و الت ي قمن ا بموجبه ا بإ افة بع ض الكلم ات إل ى مل ف htmlال ذي أنش أناه ،و للقي ام به ذا
الغ رأ نحت اج لمعرف ة مع ّرف عملي ة اإلي داع Commit IDالمةل وب التراج ع عنه ا و ال ذي يملنن ا
مما يولده األمر git logاما تظهر الصورة أدناه
ببساطة نسخت ّ
15
فائ دة git :ذا ي افاي ة لمعرف ة عملي ة اإلي داع المقص ودة بمخ ّرد إدخ ال ّأول ٨أ رف م ن مع ّرف
ال ترغ ب بنس و اام ل المع ّرف .و ه ذا ينةب ق عل ى جمي ع األوام ر الت ي تس تقبل العملي ة إذا ان
commit IDو منها األمر .revert
16
الفصل الثاني
التفريعات Branches
17
ما هي التفريعات branches؟
من فرق العمل أن يلون ال عضو أو مخموعة أعضاء م ن يحدث في معظم األ يان عند العمل
الفريق مس ؤولين ع ن تة وير ج زء مس تقل و منفص ل م ن المش روع ،و له ذا الغ رأ ق د يرغ ب ه ؤالء
الكافي للتةوير دون التأثير بالعمل على نسخة شبت مستقلّة من المشروع بحيد يتاح لهم أخذ الوق
على باقي أعضاء الفريق ،و هذا تماماً ما يتم استخدام التفريعات Branchesمن أجلت في .git
بمعنى آخر ،تسمح الفروع للمةورين بالعمل على أجزاء مختلفة من المشروع دون التأثير على الفرع
الرئيس ي ،و عن د تم ام العم ل ُي دم الف رع الخدي د م ع المش روع الرئيس ي ،ب ل تس تةيع التب ديل ب ين
الفروع و العمل على مشاريع مختلفة دون أن ي ؤثر ا ل منه ا عل ى اآلخ ر ،فاس تخدام أس لوب التفري ع
هنا طريقة سريعة و خفيفة إلجراء التعديالت على المشروع.
لقد أنشأنا اآلن فرعاً جديداً branchباسم ،hello-world-againو يملنن ا أن نتحق ق م ن وج وده
من خالل تنفيذ األمر ( git branchدون تمرير اسم أي فرع) مرة أخرت
18
كم ا ن رت فيوج د اآلن ف رع جدي د باس م ،hello-world-imagesو ف رع آخ ر اس مت masterو
بخانبت عالمة نخمة * تعني أننا اآلن في هذا الف رع (ف ي الف رع )masterو رّم ا تتس اءل اآلن م ن
أن gitتنش الف رع masterبش لل
للتو؟ و الخ واب ّ
أين جاء الفرع masterو أنا أتعلّم التفريعات ّ
آلي في ال مستودع جديد.
فائدة :بعض توزيع ات gitتس تخدم االس م mainب دالً م ن masterلتالف ي اإليح اء الت اريخي ال ذي
السيد masterفي بعض الثقافات الغر ية.
يعنيت لفي ّ
تنبيت :يخب االنتباه إلى الفرع الذي تتواجد فيت لحظة إنشاء فرع جديد ،ألن الفرع الخديد سيلون في
لحظة إنشائت نسخة مةابقة تماماً للفرع الذي تم إنشاؤه منت.
و هل ذا نك ون ق د نقلن ا مس ا ة العم ل الحالي ة م ن الف رع الرئيس ي إل ى الف رع الخدي د ،و اآلن لنف تح
محر اًر نصياً لنخري بعض التعديالت.
19
فائدة :يملننا استخدام الخيار -bمع األمر checkoutلنطلب من gitأن ينتقل إلى الفرع الجديد في
حال كان موجودا ،و ّإّل أن ينشئ ثم ينتقل إلي مباشرة.
من في هذا المثال سنقوم بإ افة اسمها img_hello_world.jpgإلى مخلد العم ل ث ّم نض منها
صفحة index.htmlبإ افة السةر التالي:
><img src="img_hello_world.jpg" alt="Hello World from Space" /
و للت ذاير فق ط اس تخدمنا --allب دالً م ن أس ماء الملف ات المس تقلة إلدراج جمي ع الملف ات بتعليم ة
وا دة ،و اآلن لو قمنا بالتحقق من الة المستودع فسنرت ما تو حت الصورة التالية:
20
تمرين :لماذا يظهر اال الملفين باللون األخضر اآلن؟
ان ا ج اهزين إلي داع ه ذه التع ديالت يملنن ا إي داعها باس تخدام األم ر git commitال ذي
س ناً ،إذا ّ
تعلمناه سابقاً مع ترك رسالة مناسبة تو ح الهدف من عملية اإليداع:
" git commit -m "Added image to index.html
لم تعد الصورة الخديدة جزءاً من هذا الفرع ،و لو استعر نا الملفات الموجودة في المخلد الحالي مرة
أخرت لرأينا اآلن أن الصورة الخديدة غير موجودة و اذلك الشيفرة التي أ فناها إل ى index.html
الوق ! و هذا يرينا سهولة العمل مع الفروع وايف أنها تسمح بالعمل على أشياء مختلفة في نف
21
فرع اﻹصالحات الطارئة Hot fixes
لنتخي ل اآلن أنن ا ل م نن ت العم ل عل ى الف رع ،hello-world-imagesلكنّن ا و لس بب ه ام نري د
إصالح خةأ طارئ في الفرع الرئيسي masterدون المساو بذلك الف رع الرئيس ي وال ف رع hello-
world-imagesبما أننا لم ننت العمل عليت بع د ،ف ي تل ك الحال ة يملنن ا ببس اطة إنش اء ف رع جدي د
للتعامل مع هذا اإلصالح الةارئ و يملننا تسميتت hot-fixاصةال اً:
git checkout -b hot-fix
و نك ون اآلن ق د أنش أنا فرع اً جدي داً م ن الف رع الرئيس ي و أجرين ا تع ديالت علي ت ،و نس تةيع اآلن
إصالح الخةأ دون التأثير على الفروع األخرت ،و اما تتوقع سيتم األمر بإصالح األخةاء ثم إيداع
هذا اإلصالح في الفرع الخديد ،و لكن ايف نخل ب ه ذا اإلص الح إل ى الف رع الرئيس ي؟ الخ واب م ن
خالل دم الفرعين و هو ما سنناقشت في الفقرات التالية.
22
• االنتقال إلى الفرع الهدف ( )masterا لذي نرغب بدم الفرع اآلخر معت م ن خ الل تعليم ة
.git checkout master
• دم الفرع اآلخر hot-fixمع الفرع الهدف من خالل األمر .git merge hot-fix
ف ي ال ا ون ا ل ش يء عل ى م ا ي رام س يتم ال دم و س تظهر المس اهمات الت ي قمن ا به ا ف ي ف رع
من الفرع الرئيسي اما تبين الصورة أدناه. اإلصال ات العاجلة
23
تعارض عمليات الدمج Merge conflicts
و دون مشاكل و ذلك نظ اًر لعدم وجود عملية دم الفرعين بشلل سل في الفقرة قبل السابقة ،تم
من فريق، نفست ،لكن أ ياناً و عند العمل الملفات في الوق أكثر من شخص يعملون على نف
ال تك ون األم ور به ذه البس اطة ،و ال يس تةيع gitأ يان اً معرف ة الةريق ة المثل ى ل دم مس اهمات
األس ةر ،عن دها المل ف و ف ي نف المس اهمين عن دما يتص ادف وج ود تع ديلين أو أكث ر ف ي نف
Mergeو ال ذي يتةل ب الت دخل الي دوي م ن أ د يح دث م ا يس ّمى بتع ارأ ال دم conflict
المساهمين للقيام بعملية ّل التعارأ Conflict resolveبحيد يملن إتمام الدم بسالسة.
و لش رح ه ذه الحال ة ال ب ّد م ن اص ةناع ال ة تس توجب التع ارأ أوالً ،ث ّم س نرت مع اً اي ف يح دث
التعارأ ،و األهم ايف يملن لّت!
س ناً ،الخ تالق ال ة التع ارأ ق م بعم ل ف رع جدي د ث ّم ع ّدل الس ةر رق م 5م ثالً م ن مل ف
ثم انتقل إلى الفرع الخديد و قم بتعديل
index.htmlفي نف الفرع الحالي ،و قم بحفي المساهمةّ ،
المل ف (الس ةر ٥م ن المل ف )index.htmlث ّم ق م بحف ي الس ةر و ف ي نف مختل ف ف ي نف
المساهمة.
اآلن عن دما تع ود إل ى الف رع الرئيس ي و تح اول دم الف رع الخدي د س يظهر التع ارأ و س ترت الم ة
ة: ورة التالي ت الص تبين
ا ّ ة ام ات المتعار ام الملف Conflictأم
24
حل التعارض Conflict Resolve
سناً اما رأينا في الفقرة الس ابقة فق د ص ل تع ارأ عن دما اولن ا دم الف رعين مع اً نتيخ ة لحقيق ة
الملف ات و بالت الي ل ن يس تةيع git األم اكن م ن نف أنن ا قمن ا ب إجراء تع ديالت مختلف ة ف ي نف
تحدي د طريق ة ل دم المس اهمات مع اً بش لل آل ي ف ي الملف ات المت أثرة بالتع ارأ ،يملنن ا م ن خ الل
األم ر git statusمعرف ة الملف ات الت ي تح وي تعار ات ي د س يظهرها gitو بخانبه ا وص ف
أن الملف خضع لتعديل في اال الفرعين ،اما يظهر في الصورة أدناه.
both modifiedبمعنى ّ
25
يملننا بو وح رؤية أن gitترك التعديلين المتعار ين مع إشارة وا حة السم الفرع الذي جاء من ت
كل تعديل ( headيعني الفرع الذي نحاول الدم إليت master ،في مثالنا أعاله).
و اآلن يملنن ا إبق اء التع ديل المةل وب و ذف التع ديل غي ر المرغ وب ب ت ليع ود المل ف إل ى ال ة
طبيعي ة ،ث ّم نق وم بع د ذل ك بعم ل التعليم ات git addللملف ات الت ي ت م تع ديلها و ل التعار ات
ثم التعليمة git merge –continueاما تظهره الصورة أدناه. فيهاّ ،
26
الفصل الثالد
27
gitأداة عمل ّ
موزع Distributed
gitفي األصل لتت يح ألعض اء ف رق العم ل المس اهمة بش لل مس ّ
تقل تمام اً بحي د يمل ك ا ل صمم
ّ
الخاصة cloneمن المستودع الخ اص بالمش روع ال ذي ي تم العم ل
ّ عضو من أعضاء الفريق نسختت
ثم عند الحاجة لدم المساهمات القادمة من مساهمين مختلفين يعملون على أكثر م ن جه ازعليتّ ،
يملن االعتماد على مس تودع بعي د Remoteوا د أو أكث ر يل ون بمثاب ة المص در الموث وق للش يفرة
اصةال اً Source of truthم ع أن ت ف ي نهاي ة المة اف م ا ه و ّإال نس خة Cloneم ن المس تودع
نفست.
المنص ات أش هرها GitHubو BitBucketو
ّ لتنظ يم ه ذه العملي ة و تس هيلها ظه رت مخموع ة م ن
مفصل.
GitLabو سنقوم في هذا الفصل بالحديد عن GitHubبشلل ّ
تنبيت :اثي اًر م ا يس تعمل المبت دئون GitHubلإلش ارة إل ى gitأو العل ،م ع ّأنهم ا ش يئان مختلف ان
توخي الد ّقة عند استعمال المصةلحات.
تماماً تماماً اما سبق و أو حنا ،لذلك أرجو ّ
28
إنشاء مستودع على GitHub
بعد تسجيل الحساب يمكننا إنشاء مستودع على GitHubمباشرة من خالل اختيار Create new
repositoryو مأل تفاصيل المستودع (اسم و وصف ..إلخ) كما تبين الصورة أدناه.
عاماً ،Publicي د
خاصاً ،Privateأو ّأهم خيار رّما في هذه الشاشة هو خيار جعل المستودع ّ ّ
أن جع ل المس تودع عام اً Publicيعن ي ّأن ت أص بح متا اً لك ل الن او لالط الع علي ت ،و نس خت ،وّ
المساهمة فيت تّى إذا لم تضبط بعض إعدادات الحماية.
اآلن نضغط على زر Create repositoryإلتمام إنشاء المستودع البعيد على GitHubو خالل
زمن ال يذار سننتقل آلياً إلى صفحة المستودع ال ذي قمن ا بإنش ائت ،و لع ّل أه ّم م ا ف ي الص فحة ف ي
ه ذه المر ل ة ه و راب ط المس تودع البعي د ال ذي يظه ر ف ي الص ورة أدن اه و ال ذي سنس تعملت بع د قلي ل
للتو.
لمزامنة مستودعنا المحلّي الذي أعددناه سابقاً ،مع المستودع البعيد الذي أنشأناه ّ
29
تعريف المستودع البعيد محليّا
لمزامنة المستودع المحلّي الذي أعددناه في فقرة سابقة على اسو نا الشخصي ،مع المستودع البعيد
محلي اً ،و ي تم ذل ك
ّ من المس تودعات البعي دة الذي أنشأناه للت ّو عل ى GitHubنحت اج إل ى تعريف ت
من خالل األمر git remoteاما يلي:
>git remote add <remote-name> <github-repo-url
أن
و اآلن يملنن ا اس تعراأ المس تودعات البعي دة م ن خ الل األم ر git remote -vللتأك د م ن ّ
المستودع أ يف بشلل صحيح اما يظهر في الصورة أدناه.
30
للتو ،ل ذلك
ّ اآلن مستودعنا البعيد originو الموجود على GitHubال يحوي ّأية ملفات اونت أنش
محلياً معت من خالل تنفيذ األمر ( git push originبمعن ى ّأنن ا
ّ يملننا مزامنة التعديالت الموجودة
المحلية إلى المستودع البعيد ذي االسم )originاما في الصورة أدناه.
ّ سندفع التعديالت
بمخرد تنفيذ األمر ستظهر الملفات على GitHubاما تظهر لقةة الشاشة أدناه.
ّ و
31
تعديل الملفات في GitHubمباشرة
من الموق ع و دون الحاج ة يت يح GitHubلم ن يرغ ب واجه ة وي ب لتع ديل الملف ات مباش رة
من GitHubامس اهمة مباش رة لمغادرت ت ،و بحي د ي تم ف ي المس اهمات (التع ديالت) الت ي ت تم
على المستودع البعيد ،و لتخر ة ذلك نضغط على أ د الملف ات ث م نخت ار أم ر التع ديل الظ اهر ف ي
الصورة أدناه.
ثم نقوم بإجراء بعض التعديالت و نخت ار الحف ي ،و س يةلب من ا GitHubإدخ ال رس الة المس اهمة
ّ
اأنن ا قمن ا ب ذلك
المناس بة ( )Commit messageو ف ي التع ديل امس اهمة جدي دة Commitو ّ
من خالل األمرين git addو git commitاما نفعل عادة!
32
جلب تعديالت المستودع البعيد إلى المستودع المحلّي Pull
يصةلح في gitعلى استخدام الفعل سحب pullللتعبير عن طلب التع ديالت البعي دة و جلبه ا إل ى
أن ن زامن المس تودع المحلّ ي م ع
المس تودع المحلّ ي ،و اثي اًر م ا يق ال "نس حب التع ديالت" بمعن ى ّ
عل ى المس تودع البعي د م ن قب ل زم الء العم ل ،و لتخر ة ذل ك فل نقم بخل ب التح ديثات الت ي دفع
التع ديل ال ذي أجرين اه عل ى المس تودع البعي د (مس تودع )GitHubف ي الفق رة الس ابقة إل ى المس تودع
المحلّي و ذلك من خالل تنفيذ األمر git pullاما تو ّ ح الصورة أدناه.
33
اآلن و ص ار نش ةاً ،و نس تةيع معرف ة أي الف روع ينبغ ي للف رع test-branchأن يل ون ق د أُنش
نحن فيها بالنظر إلى زر الفرع اما في الصورة أدناه ،يد نرت أنت يذار أننا في الفرع master
34
)1إنشاء فرع جدي د :ينش عض و الفري ق فرع اً جدي داً به دف ع دم الت أثير عل ى الف روع األخ رت
35
االشتقاق في GitHub
تت يح منص ة GitHubلمس تخدميها اش تقاق مس تودعات جدي دة خاص ة أو عام ة م ن مس تودعات
بناء
العامة ،و ذلك بواسةة األمر forkالذي يسمح لك بالبدء بمستودع جديد ً
ّ المستخدمين اآلخرين
عاماً.
على ما تم بالفعل في مستودع مشروع آخر سواء اان المشروع اآلخر مملوااً لك أو ّ
أ د األوام ر ف ي نظ ام ،gitب ل ه ي خاص ية توفره ا منص ة GitHubو على أن forkنفسها ليس
المنصات المشابهة
ثم الضغط على زر Fork
الشتقاق مستودع ما يملنك بلل بساطة الدخول إلى المستودع المةلوب ّ
الذي تو ّ حت الصورة التالية.
36
للتةوير الحقيقي ،و لهذا تتيح GitHub مناسب فقط للتعديالت و المساهمات البسيةة جداً و لي
المنصات المشابهة ميزة االستنساخ Clonningالتي تتيح استنساخ مستودع بعي د إل ى
ّ و غيرها من
محلياً سيحوي
ّ الحاسب المحلي ،و يد نقول استنساخ فنحن نعني ذلك ألن المستودع الذي سينشأ
من المستودع األصلي. كامل المساهمات و األفرع التي تم
يتم االستنساخ من خالل األمر git cloneثم تمرير راب ط المس تودع الم راد استنس اخت ،و للحص ول
على الرابط يملننا الضغط على زر codeفي .GitHub
37
تنبيه هام :قبل االستنساخ تأ ّكد من قراءة مل ف الت رخيص License fileفكثي اًر م ا يلخ أ المة ورون
(المبرمخون) الستعمال ملتبات ،أو أجزاء من ملتبات ،أو ت ى أس ةر مح ددة م ن ملف ات ،س بق و
إ دت رخص البرمخيات مفتو ة المص در دون انتب اه لةبيع ة الت رخيص المص ا ب أن نشرت تح
ألصل الشيفرة معادة االستخدام و انعلاس ات ذل ك عل ى المن ت ال ذي يعم ل علي ت المة ّور ،ي د أن
يحملك عواقب و يضعك تح التزامات قانونية ،نذار منها: ذلك قد ّ
رخص ة معين ة أن ك الرخصة :ق د يعن ي اس تخدامك لش يفرة تح نف - ١نشر منتخك النهائي تح
نف مخب ر -بالق انون -عل ى نش ر منتخ ك النه ائي عن دما يخه ز بش لل مفت وح المص در و تح
الرخصة األصلية.
رخصة معينة أن ك مخب ر -بالق انون- - ٢منع االستخدام التخاري :قد يعني استخدامك لشيفرة تح
أال تستخدم منتخك النهائي بشلل تخاري أو ر حي إطالقاً!
- ٣منع االشتقاق :بمعنى الس ماح لرخ رين باس تعمال ه ذا المن ت "كم ا ه و" دون إتا ة البن اء علي ت
أيضاً. أو تعديلت أو ترجمتت ...إلو ،و قد يلون لهذا األمر أثر رجعي على منتخك أن
- ٤إلزامي ة النس بة :بحي د تك ون مخب اًر بالق انون عل ى ذا ر اس م الش خص أو الكي ان مال ك األج زاء
المقتبسة أو الملتبات المستعملة.
لذلك في المرة القادمة و قبل أن تقوم ب"نسو-لصق" ألي شيفرة برمخية تخدها على االنترن ،تأكد
هامة قد يخهلها الكثيرون.
من قراءة الترخيص بشلل جيد لما لذلك من التزامات قانونية ّ
38
الفصل الرابع
39
ملف التجاهل .gitignore
الشك أنت ستكون أجزاء أو ملفات من المش روع ال ذي تعم ل علي ت ال تري د مش اراتها م ع غي رك مم ن
يةلع على شيفرة المشروع ،و من أمثلة تلك الملفات:
• ملفات السخالت .log files
• الملفات المؤقتة .temporary files
• الملفات المخفية.
• الملفات الشخصية.
• ملفات الكلمات السرّية و مفاتيح المصادقة.
الحساسية.
ّ • غير ذلك من الملّفات ذات
تستةيع أن تةلب من gitأن يتخاهل تلك الملفات أو األجزاء من المشروع الت ي ينبغ ي ل ت تخاهله ا
باس تخدام مل ف ( .gitignoreال ي أن اس م المل ف يب دأ بنقة ة و بالت الي س يلون مخفي اً بش لل
و م اك أو إو) و ل ن يتعق ب gitالملف ات و المخل دات المح ددة ف ي افت ار ي ف ي أنظم ة لي نك
.gitignoreرغم أنت يتتبع ملف .gitignoreنفست.
يخب أن يتم إنشاء الملف .gitignoreفي أعل ى مس توت م ن مخل دات المش روع (ف ي المخل د الخ ذر
rootبتعبير آخر) ،ثم و بعد إنشاء الملف نستخدم أ ّي محرر نص ي ،و نض يف القواع د الت ي تح دد
ألننا قد نكون ف ي االت نحت اجالملفات التي نرغب بتخاهلها ،و ين نقول قواعد فنحن نعني ذلك ّ
فيه ا لتخاه ل الكثي ر م ن الملف ات دفع ة وا دة اتل ك الت ي له ا امت داد مح دد م ثالً أو الت ي تة ابق
معيناً ...إلو ،و فيمايلي القواعد التي نستةيع تعريفها:
أسماؤها نمةاً ّ
أمثلة الشرح -المةابقات النمط
40
لألس ةر الت ي تب دأ بإش ارة # لي # text comment
أي ت أثير ف ي مل ف .gitignoreو
إنما تستخدم لترك تعليقات لتو يح
المةورين عادة
ّ شيء ما من قبل
41
يح دد ال نمط الملف ات ف ي مخل دات /lib/name.file lib/name.file
عدم وجود تةابق: بعينه ا ،لتك ون منس و ة دوم اً إل ى
name.file المخل د الخ ذر ت ى ل و ل م نب دأ
بالشرطة الدالة على المخلد الخذر/test/lib/name.file ،
و هي الشرطة المائلة
42
/lastname/log.file جمي ع المخل دات الت ي تنته ي ب *name/
/firstname/log.file name
43
/lib/name.file
فائ دة :يوج د موق ع لةي ف ج داً اس مت https://gitignore.ioيعة ي قوال ب ج اهزة لملف ات
جر وه!
.gitignoreمناسبة لكل لغة برمخة أو إطار عمل شهير لتسريع إعداد ما يخب تخاهلتّ .
44
السفر في الزمن مع git checkout
أن نعي د الملف ات الموج ودة
نستةيع باستخدام gitأن نعيد عقارب الساعة إلى الوراء مخازياً ،بمعنى ّ
فيه ا لحظ ة مس اهمة م ا تمام اً ،و ذل ك م ن خ الل األم ر git ف ي المس تودع إل ى الحال ة الت ي اان
معرف المساهمة المةلوب العودة إليها.
ثم ذار ّ
ّ checkout
>git checkout <commit-id
األمر Reset
متقدمة للتراجع عن مساهمة أو أكث ر قمن ا به ا ،و قلن ا
األول ّأنت توجد طريقة ثانية ّ
ذارنا في الفصل ّ
للح ديد عنه ا ،أال و ه ي طريق ة األم ر ّأنن ا س نغةيها ف ي الفص ل المتق ّدم ،و اآلن ق د ان الوق
.reset
ُيستخدم األم ر resetعن د الرغب ة ف ي إرج اع المس تودع ف ي الت اريو إل ى مس اهمة س ابقة و ل ت ثالث ة
أنماد:
.1النمط الخشن :--hardو هو أخةر األنماد يد ّأنت يعيد المستودع إلى مساهمة س ابقة
بعد تلك المساهمة. مع إلغاء جميع المساهمات و التغييرات التي دث
>git reset --hard <commit-id
.2النمط الناعم :--softو هو شبيت بالسابق إال ّأنت ال يلغ ي المساهمات التالية ،بل يبقيها و
و تم عمل addلها إنّما لم يتم عمل ( commitو لهذا اسمت سوف ). كأنّها تم
>git reset --soft <commit-id
45
اعتراف :شخصياً فكثي اًر ما أستعمل هذا النمط للتراجع عن بعض المساهمات التي أ ةر للقيام بها
على سبيل التخر ة أو ألسباب أخرت قبل االنتهاء الفعلي من العمل على ميزة ما.
إذا اان في المستودع أر ع مساهمات اما يو ّ ح الشلل أعاله و أ ببنا العودة إلى المساهمة الثانية
فعلياً نتخّلى ع ن المس اهمتين الت اليتين و يص بح ش لل المس تودع الي اً
فإننا ّ
بشلل خشن ّ --hard
كما في الشلل أدناه.
git ف ي موق ع ملحوظ ة :أنص ح بش ّدة لم ن يرغ ب بفه م gitف ي العم ق أن يمض ي بع ض الوق
عم ا يق وم ب ت ا ل أم ر بش لل مرئ ي ،و بالمناسههبة ،هههذا
visualizationيد يعةيك تص ّو اًر ممت ا اًز ّ
الموقع هو مصدر الشكلين أعاله.
46
47
استخدام commit --amend
git ؤخ اًر ،و ه و م ا يتيح ت األم ر
أ يان اً و لس بب م ا ق د نرغ ب بتغيي ر م ا قمن ا بالمس اهمة ب ت م ّ
يغي ر المس اهمة األص ّلية و إنّم ا يخم ع ّأي ة
األم ر ال ّ
أن ه ذا ّ
،commit --amendم ع التنبي ت ّ
موج ودة الي اً ف ي بيئ ة اإلدراج staging environmentم ع آخ ر مس اهمة و ينش م ن اليهم ا
ألن اس تخدامت يعن ي تغيي ر مع ّرف آخ ر مس اهمة commit IDو
الي اً ،ن ذار ه ذا ّ
مس اهمة جدي دة ّ
لذلك وجب التنبيت.
مخموعة أسةر ،يتيح لنا gitذلك من خالل األمر git blameو أرت تس ميتت طريف ة ّ
ألن blame
السلبية إللقاء اللوم على أ د ما .على ّأية ال ،صيغة األمر
ّ باللغة اإلنخليزية تستعمل في الحاالت
هي:
>git blame -L <start>,+<end> -- <file-path
أن startه و رق م الس ةر ،و endه و ع دد األس ةر التالي ة ف ي ال ّأنن ا نرغ ب باالس تعالم
يد ّ
س ة اًر وا داً ،و file-pathه و مس ار المل ف ال ذي نس تعلم عن ت ،تظه ر ع ن اتل ة أس ةر و ل ي
الصورة التالية المالمة الواقعة علي في تعديل السةر رقم ٣من الملف .index.html
ّ
48
git bisectمتى حدث هذا؟
ف ي دوث مش للة م ا أو تغيي ر م ا أ ياناً نرغب و لس بب ما بمعرفة م ا ه ي المس اهمة الت ي تس بب
تحدياً
في المشروع الذي نعمل عليت ،و في الة المشاريع الكبيرة ذات التاريو الةويل قد يش ّلل هذا ّ
إذا اان يعني مراجعة المساهمات وا دة وا دة.
ارزمي ة البح د الثن ائي Binary Searchف ي المس اهمات
آلي ة لتوظي ف خو ّ
ي ت وّفر ّ git
لحس ن الح ّ
للوصول بشلل أسرع بلثير إلى المساهمة المةلو ة و تحديد آلية االستخابة لها.
مخ اني ف ي
إلكتروني اً و بش لل ّ
ّ وزع
الكتي ب عل ى ّني ة الص دقة و به دف أن ي ّ
و بم ا ّأنن ي أكت ب ه ذا ّ
نهاية المةاف ،فسأخالف المعهود قليالً في مثل هذا السياق ،و أ يلك إلى الفيديو التالي الذي يشرح
ألن المتعلّم لهذا األمر يحتاج أن يراه بشلل تفاعلي برأيي.
األمر بمنتهى الروعة و ذلك ّ
تم بحمد ا
إسطنبول ١٠يونيو ٢٠٢٢
49
الفهرس
ّ
أساسيات 4 ............................................................................................... git
ه git؟ 5 ......................................................................................................
ما ي
كيف نشأت gitو لماذا؟ 5 .....................................................................................
لماذا تستخدم git؟ 5 ...........................................................................................
تثبيت 6 ...................................................................................................... :git
المحل 7 ...................................................................................
ي تعريف حساب git
50
مدخل إىل 27 ....................................................................................... GitHub
ّ
gitأداة عمل موزع 28 ........................................................................... Distributed
تسجيل حساب جديد يف 28 ........................................................................ GitHub
إنشاء مستودع عل 29 ................................................................................GitHub
ّ
محليا 30 ........................................................................... تعريف المستودع البعيد
ّ
المحلية إىل المستودع البعيد 30 ................................................... Push إرسال تعديالتنا
ر
مباشة 32 ........................................................................ تعديل الملفات يف GitHub
51