عودةً إلى الدرس 3.7، تعلّمتَ أن الـ repo هو مجلد إضافةً إلى history كامل لكل تغيير أُجري عليه على الإطلاق. ذلك الـ history ليس مجرد فضول — بل هو غالبًا الإجابة عن «لماذا الكود هكذا؟». وهو الإجابة عن «ما الذي انكسر؟» حين يعمل شيء أمس ولا يعمل اليوم.
الـ history مجرد شيء آخر في مجلدك. تستطيع السؤال عنه بلغة بسيطة، وسينظر Claude.
لستَ بحاجة إلى تعلّم git log أو git blame أو git diff أولًا. (ستتعلمها في النهاية — هذا في المستوى الثامن. لكن ليس بعد.)
ماذا يتيح لك الـ history أن تسأل
يحمل history الـ repo إجابات عن أسئلة لم تكن لتصل إليها بطريقة أخرى:
- ما الذي تغيّر في هذا الملف مؤخرًا؟
- من لمس هذا السطر آخر مرة، وماذا كان يحاول أن يفعل؟
- كيف كانت هذه الـ function تبدو قبل أن تُعاد كتابتها؟
- ما الذي تغيّر بين الأمس واليوم؟
- ماذا كان في آخر commit؟
كان كل واحد من هذه يتطلب أمر git منفصلًا وشيئًا من التحديق. الآن جميعها الشكل نفسه من السؤال.
الخطوة
تفتح المشروع في Claude على سطح المكتب وتسأل، مباشرةً في المحادثة:
what changed in server/messages.js in the last week, and why?
سيقوم Claude بما يلي:
- ينظر إلى الـ history الحديث للملف.
- يفتح الـ commits ذات الصلة.
- يقرأ الـ diffs وأي رسائل كتبها المطورون تصف التغيير.
- يلخّصها لك: «ثلاثة تغييرات — إضافة الـ function
saveMessage، وإصلاح bug كان يجعل messages.json يُكتَب فوقه بدلًا من الإلحاق به، وإعادة تسمية مساعِد. كلّ منها أجريتَه أنت في هذه الأيام، ولهذه الأسباب».
ينتقل الـ history من غامض إلى مقروء في turn واحد.
أشكال أسئلة مفيدة
سؤال المحقّق — «ما الذي انكسر؟»:
the contact form was working last week and now it's broken. What changed in server/index.js since then?
سؤال علم الآثار — «لماذا هو هكذا؟»:
why does saveMessage read the whole file before writing? When did that get added?
سؤال الـ blame — «من ولماذا؟»:
who last changed this line in server/messages.js: `fs.writeFileSync('messages.json', ...)` — and what were they trying to fix?
(كلمة «blame» (أي «اللوم») مصطلح في git، لا حكم أخلاقي. يُسمّى الـ feature git blame لأنه يخبرك بمن هو المسؤول، لا بمن هو المُلام. حاول ألّا تأخذ الأمر على محمل شخصي حين تكتشف أنه أنتَ قبل ستة أشهر.)
سؤال اللحاق بالركب — «ما الجديد؟»:
I haven't looked at this project in a month. What's changed since I was last here?
ذلك الأخير كنز حين تعود إلى مشروع نسيته. بدلًا من فتح عشرين ملفًا عشوائيًا، تطلب من Claude تلخيص آخر شهر من الـ commits وتوجيهك في 30 ثانية.
ماذا يحتوي الـ history فعليًا
حين يقرأ Claude الـ git history، فإنه يسحب من بضعة أشياء مختلفة — وكلها مجرد ملفات في المجلد المخفي .git/. لستَ بحاجة إلى معرفة كيف يعمل، لكن يستحق الأمر معرفة ما بداخله:
- Commits — لقطات لكل ملف عند كل نقطة حفظ، مع رسالة تصف التغيير.
- Diffs — لأي اثنين من الـ commits، الأسطر الدقيقة التي أُضيفت أو أُزيلت.
- Branches — نسخ متوازية مختلفة من المشروع قد تكون أُعيد دمجها معًا أو لم تُدمَج.
- المؤلّفون والتواريخ — كل commit يعرف من أجراه ومتى.
حين تسأل «لماذا هذا السطر هنا؟»، يجد Claude الـ commit الذي أدخل السطر، ويقرأ الرسالة التي كتبها المطوّر، وينظر إلى الـ diff المحيط، ويخبرك بالقصة. إنه عمليًا سفر عبر الزمن للكود.
النقطة التي تربك الناس
فخّان.
الأول، «ما الذي تغيّر؟» غالبًا أنفع من «ما الموجود؟». حين يظهر bug فجأة، لا يكون السبب عادةً في الملف بصورته القائمة اليوم — بل في الفرق بين اليوم والأمس. الغريزة المُدرَّبة تقول «اقرأ الكود». الغريزة الأفضل تقول «اقرأ الـ diff».
الثاني، الـ history جيد بقدر جودة الرسائل التي كتبها المطورون. commit بعنوان «إصلاحات» (فعلناها جميعًا) لا يساعد كثيرًا. سيقرأ Claude الـ diff على أي حال ويعيد بناء ما حدث من تغيير الكود نفسه، لكنه سيكون تخمينًا. لا تتوقّع «لماذا» واضحًا إن لم يترك مؤلّف الـ commit واحدًا.
الـ history النظيف رسالة حبّ إلى المستقبل. سندخل في كتابته جيدًا في المستوى الثامن.
تدريب
في أي repo لديك، جرّب:
what's the last thing that changed in this project?
ستستردّ: التاريخ، والملف (الملفات)، وجملة عمّا تغيّر. من هناك، تابِع — «لماذا؟»، «من؟»، «أرني الـ diff». أنت تقود آلة زمن.
ما التالي
حتى الآن كنا نثق بإجابات Claude كثيرًا — ماذا يفعل هذا الملف، من أين يُستدعى هذا، ما الذي تغيّر. ماذا لو كان مخطئًا؟ وضع القراءة لا يملك permission prompt لإنقاذك. الدرس التالي هو أهمّ عادة في هذا المستوى بأكمله: كيف تتحقق.