سواء كنت تكتب برنامجا أو مستندات ، فغالبًا ما ستنتهي مع إصدارات متعددة من نفس الملف. قد ترغب في أرشفة مجموعة واحدة من التغييرات غير الضرورية في الوقت الحالي ، ثم أرسال مجموعة أخرى من التغييرات إلى زملائك للمراجعة. في مرحلة معينة ، يصبح تتبع جميع هذه الإصدارات أمرًا غير ممكن.
يمكن أن تساعدك أدوات مثل Dropbox أو Google Drive ، والتي قد تعرفها بالفعل ، قليلاً. تتيح لك هذه الأدوات مشاركة ملفاتك بسهولة ، أو استعادة محتواها إلى نقطة زمنية سابقة. فيما يلي مثال:
لسوء الحظ ، يمكنك فقط رؤية إصدارات مختلفة لـ ملف واحد. أيضًا ، من الصعب معرفة الإصدار الذي قد ترغب في استعادته حيث لا يوجد أي مؤشر على كيفية اختلاف الإصدارات الفردية. من غير الممكن إدارة مشروع كبير باستخدام هذا النهج.
لذلك ، يميل المبرمجون إلى استخدام أدوات أكثر قوة تسمى نظام التحكم في الإصدار(version control system) (VCS). في الوقت الحالي ، يعد Git الأكثر شيوعًا ، وسنتعلم المزيد عنه في هذا الدرس.
نادراً ما يتم إنشاء البرامج الحقيقية من قبل شخص واحد. عقلان أفضل من واحد ، لذلك من الأفضل العمل على مشروع في فريق.
يحتاج كل عضو في الفريق إلى مشاركة تقدمه مع الآخرين. يمكن استخدام Git بالضبط لهذا الغرض: يمكنك إعداد مستودع(repository) مشترك عبر الإنترنت سيتزامن معه أعضاء فريقك.
سنعتمد على سطر الأوامر(command-line). إذا كنت لا تشعر بالثقة في العمل معه بعد ، فراجع المقدمة.
تذكر: لا تكتب $
في البداية.
يتم عرضه هنا للإشارة إلى بداية كل أمر.
تم وصف عملية تثبيت Git هنا. إذا كنت قد تخطيت الدرس من قبل ، فقد ترغب في العودة إليه الآن.
يجب تخزين كل مشروع تريد التحكم في إصداراته في ملف خاص به.
قم بإنشاء ملف جديد الآن وانتقل إلى داخله (استخدم الأمر cd
).
ثم ، قم بإنشاء مستودع(repository) Git جديد باستخدام الأمر git init
:
$ mkdir lessongit
$ cd lessongit
$ git init
Initialized empty Git repository in ./.git/
في البداية ، يبدو أنه لم يحدث شيء.
قام هذا الأمر بإنشاء ملف مخفي باسم .git
وبعض
المعلومات حول تاريخ المستودع(repository) هناك.
يمكنك رؤية الملف باستخدام ls -a
(Linux) أو dir /a
(Windows).
ملف .git
هو ملف مخفي لأنه يتم إدارته بواسطة Git فقط
ولا يجب عليك تغيير أي شيء بداخله.
المستودع(repository) فارغ الآن - ليس لديه أي ملفات أو تاريخ.
يمكنك أن ترى بنفسك من خلال استدعاء git status
، وهو أمر يعرض معلومات
حول حالة المستودع(repository):
$ git status
On branch main
Initial commit
nothing to commit (create/copy files and use "git add" to track)
“On branch main” يشير إلى ما يسمى بالفروع ، وسنعود إلى ذلك لاحقًا. “Initial commit” يعني أنه لا يوجد (commit) مخزنًا بعد. و “nothing to commit” يقول أنه لا توجد ملفات يتم حفظها وإصدارها في الملف.
سننتقل الآن للحظة إلى محرر نص عادي (وليس Microsoft Word ولكن على سبيل المثال Notepad) أو -اختيارياً- محرر كود (VS Code).
الآن قم بإنشاء ملف نصي (text) جديد هناك ، واكتب / انسخ نص قصيدة قصيرًا داخله واحفظه في المجلد الذي قمت فيه بتشغيل git init
في سطر الأوامر (command-line) الخاص بك. أسم الملف poem.txt
ولا تنسى حفظه بعد إجراء التعديلات.
يجب أن يحتوي الملف على خمسة أسطر على الأقل حتى يكون لدينا ما يكفي للعمل معه.
ثم ، حاول تنفيذ git status
مرة أخرى: يبلغك Git أنه يوجد ملف جديد
وأنه غير مُدار بواسطة Git بعد.
$ git status
On branch main
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
poem.txt
nothing added to commit but untracked files present (use "git add" to track)
إذا لم تبدو حالة المجلد كما هي بالنسبة لك
تحقق مرتين من أنك قمت بإنشاء الملف في نفس المجلد الذي قمت فيه بتشغيل git init
يمكنك التحقق من ذلك من خلال سرد محتوى المجلد (ls أو dir) في الجهاز.
نحتاج إلى جعل Git يتتبع كل ملف جديد صراحةً. دعونا نفعل ذلك للملف باستخدام قصيدتك:
$ git add poem.txt
ثم تحقق من حالة المستودع(repository) مرة أخرى:
$ git status
On branch main
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: poem.txt
الأسطر باللون الأخضر ("التغييرات المراد الالتزام بها")
سيتم تضمينها في الدفعة التالية من التغييرات (التزام commit
) التي ستقوم بإنشائها.
دعنا ننشئ ال(commit) الأول ونضيف رسالة التزام "First commit" عبر لاحقة "-m":
$ git commit -m "First commit"
[main (root-commit) 1a009f4] First commit
1 file changed, 6 insertions(+)
create mode 100644 poem.txt
تهانينا! لقد تم الانتهاء من ال(commit) الأول في المستودع(repository)!
ماذا سيحدث إذا لم تضيف "message -m" - اقرأ النص أدناه. خلاف ذلك ، يمكنك تخطيه.
العمل مع المحررين
بدون "message -m" بعد إدخال هذا الأمر ، سيتم فتح محرر حيث يمكنك كتابة وصف قصير لهذا الالتزام ، تلخيص التغييرات التي تم إجراؤها بإيجاز. في Windows ، إذا قمت بذلك إعداد Git بشكل صحيح، سيتم استخدام Notepad كمحرر ؛ ما عليك سوى كتابة شيء ما ، وحفظه (Ctrl+S) وإغلاقه (Alt+F4).
في Linux أو macOS ، يظهر محرر يسمى Nano مباشرةً في نافذة سطر الأوامر. يمكنك التعرف عليه من خلال اختصار لوحة المفاتيح للمساعدة في السطرين السفليين. اكتب شيئًا ما ، واحفظه باستخدام Ctrl+O ، تأكيد اسم الملف (Enter) والخروج من المحرر باستخدام Ctrl+X.
إذا لم تقم بإعداد Git وفقًا لذلك ، يتم استدعاء Vim مباشرةً في نافذة سطر الأوامر
وسيتم استخدامه كمحرر افتراضي.
إنه محرر معقد نسبيًا وتعلم استخدامه يتجاوز نطاق
هذا الدرس. يمكنك التعرف عليهاذا لاحظت سطر أو سطرين في الأسفل يُظهران مسارًا
إلى الملف الذي تقوم بتحريره حاليًا.
في هذه الحالة ، اضغط أولاً على
Esc ، ثم اكتب :q!
(نقطتان ، حرف Q صغير ، علامة تعجب)
ثم أكد بالضغط على Enter.
ثم قم بإعداد Git بشكل صحيح وحاول git commit
مرة أخرى.
يمكنك تجاهل الأسطر الموجودة التي تبدأ بـ #
، فهي فقط للمعلومات.
سيتجاهلها Git أيضًا. أخيرًا ، احفظ الملف وأغلق المحرر.
حاول مراجعة حالة المستودع(repository) مرة أخرى
$ git status
On branch main
nothing to commit, working tree clean
يشير هذا التقرير القصير إلى أنه لم يتغير شيء منذ آخر (commit). هذا متوقع لأننا قمنا للتو بال(commit) بجميع تغييراتنا!
الآن دعونا نلقي نظرة على ما تغير في آخر (commit).
في سطر الاوامر نفّذ git show
:
$ git show
commit 1a009f4267d5a6ab7ece87cb7514f5b803692e39
Author: baloola <baloola@example.com>
Date: Mon Mar 20 14:51:34 2017 +0100
First commit
diff --git a/poem.txt b/poem.txt
new file mode 100644
index 0000000..558d133
--- /dev/null
+++ b/poem.txt
@@ -0,0 +1,9 @@
+لا تحلموا بعالم سعيد
+
+فخلف كل قيصر يموت
+
+قيصر جديد
+
+وبعد كل ثائر يفوت
+احزان بلا جدوى ودمعة سدى
لاحظ الـ Git commit ID الذي يسمح لك بالعودة إلى هذه الحالة من مشروعك في أي وقت في المستقبل. كما يتم سرد اسم المؤلف وتاريخ إنشاء هذا ال(commit) ورسالة ال(commit) ، بالإضافة إلى ملخص التغييرات: ملف جديد poem.txt يحتوي على نص باللون الأخضر تمت إضافته.
عندما يكون إخراج الأمر طويلاً جدًا ، يمكنك تصفحه باستخدام المفاتيح (↓، ↑، PgUp، PgDn). في مثل هذه الحالة ، اخرج من وضع التصفح بالضغط على q لـ إنهاء.
(Text encoding) في Windows
إذا كنت تواجه مشكلة في عرض الأحرف الخاصة مثل الأحرف ذات العلامات الصوتية ،
أدخل الأمر التالي قبل git show
:
> set LC_ALL=C.UTF-8
سيقوم هذا الأمر بضبط اعدادات نافذة سطر الأوامر الحالية فقط. سيتعين إدخاله مرة اخرى لأي نافذة جديدة تفتحها.
قم بإجراء تغيير صغير في قصيدتك ؛ استبدل كلمة واحدة ، غيّر علامات الترقيم ، أو أضف بيتًا جديدًا. ثم تحقق من حالة مستودع(repository) Git مرة أخرى.
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: poem.txt
no changes added to commit (use "git add" and/or "git commit -a")
يتم عرض الملف باللون الأحمر مرة أخرى. لقد تغير شيء ما في الداخل!
للحصول على التفاصيل ، قم بتنفيذ الأمر git diff
.
$ git diff
diff --git a/poem.txt b/poem.txt
index 558d133..24e2384 100644
--- a/poem.txt
+++ b/poem.txt
@@ -6,4 +6,6 @@
احزان بلا جدوى ودمعة سدى
++احزان بلا جدوى ودمعة سدى
++
++احتاج دوزنة
يتم عرض التغييرات على أساس كل سطر. تشير الأسطر باللون الأحمر التي تبدأ بـ - إلى الأسطر الأصلية التي تمت إزالتها ؛ الأسطر باللون الأخضر التي تبدأ بـ + تظهر الأسطر المضافة حديثًا.
حتى إذا تغيرت كلمة واحدة أو حرف واحد فقط في أي سطر معين ، سيتم سرد السطر بأكمله على أنه تمت إزالته وإضافته (بما في ذلك التغيير الصغير). يمكن تخصيص هذا التفسير إذا لزم الأمر ، ولكن من الجيد التعود على السلوك الافتراضي.
من السهل رؤية ما تغير بالضبط منذ آخر (commit).
إذا توقف برنامجك عن العمل ، ولكن الإصدار الأخير الذي تم ال(commit) به لا يزال يعمل ،
استخدم git diff
–
يجب أن يكون أحد التغييرات المدرجة قد أدخل الخطأ!
يشير السطر الذي يبدأ بـ @@ إلى الموقع في الملف حيث تحدث التغييرات. في المثال أعلاه ، يبدأ مقتطف من الملف الأصلي من السطر رقم 1 وهو 6 أسطر طويلة ؛ يبدأ الكتلة المطابقة في الإصدار المتغير من السطر 1 أيضًا ، لكنه 9 أسطر طويلة.
إذا كنت راضيًا عن التغييرات ، فقم بضمها لل(commit) التالي:
$ git add poem.txt
كما هو معتاد ، تحقق من status
للمستودع(repository) ؛ سيتم تضمين الملف باللون الأخضر
ضمن ال(commit) التالي.
$ git status
On branch main
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: poem.txt
قبل الانتهاء من ال(commit) التالي ، دعونا نتحدث عن أفضل الممارسات
في صياغة رسائل ال(commit).
هناك اتفاقيات شائعة يتبعها معظم المبرمجين:
يُلخص السطر الأول التغييرات ، ويترك السطر الثاني فارغًا ،
والأسطر التالية تسرد أسباب التغيير أو تصف
التغييرات نفسها بمزيد من التفصيل.
يجب أن يحتوي كل سطر على أقل من 70 حرفًا ؛
يمكن أن يكون طول التعليقات (الأسطر التي تبدأ بـ #
) بمثابة دليل هنا.
لا يستحق الأمر الخوض في التفاصيل بشأن التغييرات التي تعتبر تافهة أو واضحة ؛
بدلاً من ذلك ، ركز على السياق الأوسع وأسباب التغييرات.
أي شيء يمكن أن يساعد أي شخص سيحاول فهم التغييرات في ال(commit) ؛
قد يشملك أنت بعد بضعة أشهر.
ستكون رسالة ال(commit) الخاصة بي على النحو التالي:
Split long lines
Typically, each verse of a poem goes on its own line. I think
that it's easier to read like this. (Although, the real reason was
to demonstrate git diff.)
إذا كنت تواجه مشكلة في تلخيص تغييراتك باستخدام 70 حرفًا فقط ، فقد تكون تقوم بالعديد من الخطوات في وقت واحد. على سبيل المثال ، "تغيير النص X وإضافة المتغير Y" قد يكون من الأفضل فصل هذا ال(commit) كمراجعتين منفصلتين.
أخيرًا ، استخدم git commit
لإنشاء ال(commit) الثاني ،
ثم تحقق منه باستخدام git show
:
$ git show
commit 81cbabb3bd3cd2f3896dd41b20012c44dbd69031
Author: baloola <baloola@example.com>
Date: Mon Mar 20 14:51:34 2017 +0100
Split long lines
Typically, each verse of a poem goes on its own line. I think
that it's easier to read like this. (Although, the real reason was
to demonstrate git diff.)
diff --git a/poem.txt b/poem.txt
index 558d133..24e2384 100644
--- a/poem.txt
+++ b/poem.txt
@@ -8,4 +8,16 @@
احزان بلا جدوى ودمعة سدى
++احزان بلا جدوى ودمعة سدى
++
+-احتاج دوزنة
++
++وتراً جديد
++
++لا يضيف إلى النشيد سوى النشاز
++
++احتاج دوزنة
++
++لغة تفتش عن اراض خصبة
++
++شمساً تغير طعم فاكهة الشتاء
++
++أحتاجُ مِفرزةً من الشعراءِ و الجوعى
++
++لنُعلن سُخطنا أو ننتهي منا باغنيةٍ تذاع
يوضح هذان المخططان (Diagram) أدناه بالضبط ما فعله كل أمر تم عرضه حتى الآن ، وكيف تنتقل التغييرات من "not staged" إلى "commited" والعكس في حالة الضرورة.
مخطط يوضح عملية عرض التغييرات وال(commit) بها:
الآن بعد أن أنشأنا أول مجموعة من (commit) قليلة في المستودع(repository) ،
دعونا نوضح المزيد من الأوامر التي ستساعدنا في فهم
تاريخ مستودع Git بالكامل.
الأمر الأول هو git log
.
$ git log
commit 81cbabb3bd3cd2f3896dd41b20012c44dbd69031
Author: baloola <baloola@example.com>
Date: Mon Mar 20 14:51:34 2017 +0100
Split long lines
Typically, each verse of a poem goes on its own line. I think
that it's easier to read like this. (Although, the real reason was
to demonstrate git diff.)
commit 1a009f4267d5a6ab7ece87cb7514f5b803692e39
Author: baloola <baloola@example.com>
Date: Mon Mar 20 14:51:34 2017 +0100
First commit
يقوم git log
بطباعة جميع عمليات ال(commit) بدءًا من الأحدث وصولاً إلى
ال(commit) الأولي عند النسخة الاصلية (origin) للمستودع(repository).
عندما يكون هناك الكثير من عمليات ال(commit) بحيث لا تتناسب مع شاشة واحدة من نافذة سطر الأوامر الخاص بك ، يمكنك التصفح ذهابًا وإيابًا باستخدام PgUp/PgDn. أخيرًا ، اخرج بالضغط على q.
يوجد العديد من الخيارات التي تخصيص مخرجات git log
.
يتم وصفها جميعًا (بطول كبير)
في المستندات المضمنة (الأمر git help log
).
إذا تم عرض المساعدة في نافذة سطر الأوامر ، اضغط على q
للخروج.
المزيج المفضل شخصيًا هو git log --oneline --graph --decorate --cherry-mark --boundary
.
لعرض جميع التفاصيل حول أي (commit) ،
نفّذ git show 5ff0b
، واستبدل 5ff0b
بالأحرف القليلة الأولى لـ Git commit ID.
هذه هي أساسيات Git التي سنحتاجها في الدروس التالية.
كلما قمت بأداء git add file
و git commit
،
يتم حفظ الإصدار الحالي للملف وسيكون متاحًا حتى إذا قمت بحذف الملف لاحقًا.
يمكنك دائمًا عرض أي إصدار سابق لأي ملف في مستودعك ،
ومراجعة جميع التغييرات التي تم إجراؤها منذ آخر مرة تم حفظ المشروع فيها.
ربما بدا كل هذا معقدًا بشكل غير ضروري للمبتدئين. في الواقع ، ستكون مشاريعنا بسيطة نسبيًا وسهلة الإدارة حتى بدون استخدام Git. ولكن من الجيد أن تتعلم استخدامه من البداية ؛ عندما تصل إلى المشاركة في مشاريع أكبر ، سيتم استخدام Git بالفعل سيكون مفيدًا جدًا.
لذا ، من الآن فصاعدًا ، كلما قمت بإجراء تغيير صغير ولكن ذي معنى في برنامجك ،
طالما أن البرنامج يعمل على الأقل بنفس جودة أدائه السابق ،
استخدم git add
و git commit
لحفظ التغيير في Git.