بسم الله الرحمن الرحيم
اليوم الدرس الرابع من شرح جِت، وهو امتداد للدرس الأخير (الدرس الثالث، كتاب ProGit، دورة حياة الملف)، فإن لم تقرأه فاقرأه، فكل درس يستند على أخيه السابق له.
ملفات معدلة في مرحلة الإعداد
علمنا أن الملف في أول أمره لا يراقبه جِت، ولمراقبته نكتب الأمر git add متبوعًا باسم الملف المُراد، وهكذا يدخل مرحلة الإعداد stage area، وثم نكتب الأمر git status لنرى حالة الملف، أين هو وهل عُدِّل؟
وبعد مرحلة الإعداد، بعد الانتهاء من التعديل نقذف به إلى المستودع، وذلك بأمر الإيداع، والإيداع المرحلة الأخيرة. السؤال، إذا عدلت ملفًا مراقبًا tracked ما الذي سيحصل؟
سأعدل الملف المُراقب file.txt (راجع الدرس الثالث)، وأضيف إليه نصًّا، ثم سأكتب الأمر git status لأرى حالته، سترى هذا:
On branch master
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: file.txt
no changes added to commit (use "git add" and/or "git commit -a")
ترى الملف ظهر لك تحت قسم (تغييرات لم تُعَدّ للإيداع Changes not staged for commit)، أي أن الملف الذي طرأ عليه التغيير مراقب وقد عُدِّل ولم يُعَدّ للإيداع، وأقصد بـ(لم يُعَد للإيداع) أنه ما دخل منطقة الإعداد stage area التي تسبق مرحلة الإيداع. ألم أقل أن لكل ملف ثلاث مراحل، وأن أمر الإضافة (git add) يُحيل الملف المهمل untracked مراقبًا tracked يراقبه جِت ويقذف به إلى مرحلة الإعداد، ثم بعد هذه المرحلة تأتي مرحلة الإيداع؟
عند تعديلك لملف مراقب فأنت ملزم أن تقذف به إلى مرحلة الإعداد أولًا، لتخبر جِت أنك ستدخل هذا الملف في الإيداع الآتي. كل إيداع commit تنفذه هو إصدار، أو نسخة جديدة تقذف بها إلى المستودع، قد تعود لها عند الحاجة. قبل أول إيداع ستكون كل الملفات مهملة ثم ستأمر جِت بمراقبتها، وبأمرك له باستعمال الأمر git add فإن الملف يدخل منطقة الإعداد stage area، تمهيدًا له قبل استقراره في المستودع، أي قبل الإيداع الذي سيحصل، فإن الأمر git add يؤذن بقيام المراحل الثلاث، والإيداع، المرحلة الأخيرة، أن تودعه إلى المستودع فيستقر فيه.
بعد الإيداع تبقى الملفات المراقبة مراقبةً، إن غيرت فيها ظهرت لك تحت قسم (تغييرات لم تُعَدّ للإيداع)، فيلزم أن تدخلها مرحلة الإعداد أولا بالأمر git add. وكما أظنك لاحظتَ، الأمر git add لا يجعل الملف المهمل مراقبًا فحسب وإنما له استعمال ثانٍ: يدخل الملف مرحلة الإعداد.
اعذرني على التفصيل الملل، فأول الدروس عليك استيعابها استيعابًا وافيًا ولو أطلت فيها، وكما قالت العرب: (العناء في الابتداء)، وبعد الابتداء يسهل المسير ويذهب العناء.
تغيير بعد دخوله منطقة الإعداد
سنكتب الأمر:
git status
لنرى الملفات في مرحلة الإعداد. هب أنك تود تغيير سطر في الملف قبل إيداعه، وذهبت وغيرت السطر المراد، ثم أعدت كتابة الأمر:
git status
سترى أن الملف صار في منطقتين!
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: file.txt
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: file.txt
في منطقة الإعداد وفي منطقة (تغييرات لم تُعَدّ للإيداع)، فلمَ يا مبعسس!
اعلم رعاك الله أنك لما تكتب git add فإن جِت يضيف الملف على هيئته التي كان عليها وقت كتابة الأمر، وأنك إذا أودعت الملف الآن فإن جِت سيحفظ الملف على نفس هيئته التي كان عليها عند تنفيذ الأمر git add.
ولو غيرت شيئا في الملف بعد تنفيذ git add فأنت ملزم بتكرار الأمر مرة ثانية بعد التعديل. أي أنك أضفت الملف إلى مرحلة الإعداد، ثم غيرت في الملف، ثم مرة ثانية ستكتب الأمر git add لتضيفه إلى مرحلة الإعداد من جديد.
وإن لم تفعل؟
لن يسجل جِت التغيرات التي طرأت على الملف، وسيسجل الملف على هيئته التي كان عليها عند دخوله منطقة الإعداد.
سنضيف الملف مرة ثانية إلى منطقة الإعداد:
git add
ثم سنرى هل ذهب من منطقة (تغييرات لم تُعَدّ للإيداع) أم لا
وكما ترى، لم يعد فيها، والآن لو أودعنا النسخة إلى المستودع بالأمر git commit فإن جِت سيسجل ما أحدثته في الملف!
عرض التغيرات في منطقة الإعداد وخارجها
تقدم ذكر الأمر git status لرؤية الملفات التي طالها التغيير، لا يظهر لنا إلا اسم الملف دون تفاصيل التغيير، وأنت قد ترغب بمعرفة تفاصيل التغيير، مثلًا ما الذي تغير؟ وفي أي مكان؟ ما التغييرات التي طرأت على الملفات في منطقة الإعداد؟ وما التغييرات التي طرأت على الملفات الخارجة عنها؟
يمكننا جِت من ذلك باستعمال أمر git diff، ليعرض لنا السطور المضافة والمحذوفة، وكلمة diff اختصار لكلمة اختلافات differences.
سأنشئ الملف file_number2 ثم أضيفه إلى منطقة الإعداد ثم إلى مرحلة الإيداع، طبق معي الخطوات كما تعلمت في الدرس السابق!
ثم سأدخِل الملف منطقة الإعداد وأعدله، وسأعدل أيضا الملف file دون إضافته إلى منطقة الإعداد، ثم سأكتب الأمر:
git status
مخرجات الأمر:
On branch master
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: file_number2
Untracked files:
(use "git add <file>..." to include in what will be committed)
file
no changes added to commit (use "git add" and/or "git commit -a")
ثم هذا الأمر:
git diff
ومخرجاته:
diff --git a/file_number2 b/file_number2
index e69de29..9daeafb 100644
--- a/file_number2
+++ b/file_number2
@@ -0,0 +1 @@
+test
اعلم حفظك الله أن عمل الأمر git diff يقوم على المقارنة، فهو يقارن بين حالين للملف. لما تكتب الأمر دون إضافة مُحَدِّد argument فهو يعرض التغييرات الحاصلة في الملفات التي لم تُعد للإيداع unstage، أي ما زالت خارج منطقة الإعداد، مثل الملف file. ويقارن الملف بآخر حال كان له في آخر إيداع.
أما لو أردت رؤية التغييرات الحاصلة في منطقة الإعداد فعليك إضافة المُحدِّد argument الذي اسمه staged– إلى الأمر:
git diff --staged
أول سطر:
diff --git a/file_number2 b/file_number2
يخبرك بالملف الذي يُقارَن.
ثاني سطر:
index e69de29..9daeafb 100644
يخبرك بمُعَرِّف الملف قبل وبعد التغيير. أما الرقم الأخير (100644) يخبرك بأذونات permissions الملف ونوعه، فالرقم 100644 يدل على أنه ملف عادي يستطيع مالكه قراءته وتعديله أما باقي المستعملين فلا. سأفرد له مقالًا مستقبلًا إن شاء اللّٰه.
وقد ترى قيمًا أخرى، مثلًا:
قيمة 100755: يدل على أنه ملف عادي يُنفَّذ executable، ينفذه المالك له ويعدله ويرى محتواه أما باقي المستعملين فلا يستطيعون إلا رؤية محتواه وتنفيذه.
قيمة 120000: يدل على أنه رابط يشير إلى ملف أو مجلد آخر.
قيمة 040000: تدل على أنه مجلد.
ثالث ورابع سطر:
--- a/file_number2
+++ b/file_number2
الأول (عنده إشارة الناقص) هو الملف الأصلي، والثاني (عنده إشارة الزائد) هو الملف المعدل.
خامس سطر:
@@ -0,0 +1 @@
يدل على النطاق الذي حدث فيه التغيير، قبل وبعد، من السطر كذا إلى السطر كذا. الذي بالزائد هو النطاق القديم، أما الذي بالناقص فهو النطاق الجديد.
علامة الزائد إضافة، وعلامة الناقص حذف، فكل إشارة ناقص تدل على تغيير أو حذف حدث في السطر، أما علامة الزائد فتدل على إضافة.
أما السطر الأخير هو الشيء الذي أضيف في الملف
الخاتمة
ها قد وصلنا إلى نهاية المقال، وها أنا أخط بقلمي الخطوط الأخيرة لهذا المقال الشائق، وأرجو إني قد وفِّقت في الشرح.
وفي نهاية الأمر لا يسعني سوى أن أشكرك على حسن قراءتك لهذا المقال، وأني لبشر أصيب وأخطِئ، فإن وفِّقت في طرح الموضوع فمن اللّٰه عز وجل وإن أخفقت فمن نفسي والشيطان.
أرجو منك تقييم كفاءة المعلومات من أجل تزويدي بالملاحظات والنقد البناء في خانة التعليقات أو عبر حساب الموقع، والسلام عليكم ورحمة اللّٰه تعالى وبركاته.