قراءة git history مع Claude
عودةً إلى الدرس 3.7، تعلّمتَ أن الـ repo هو مجلد إضافةً إلى history كامل لكل تغيير أُجري عليه على الإطلاق. ذلك الـ history ليس مجرد فضول — بل هو غالبًا الإجابة عن «لماذا الكود هكذا؟». وهو الإجابة عن «ما الذي انكسر؟» حين يعمل شيء أمس ولا يعمل اليوم.
الـ history مجرد شيء آخر في مجلدك. تستطيع السؤال عنه بلغة واضحة، وسينظر Claude.
لستَ بحاجة إلى تعلّم git log أو git blame أو git diff أولًا. (ستتعلمها في النهاية — هذا في المستوى الثامن. لكن ليس بعد.)
ماذا يتيح لك الـ history أن تسأل
يحمل history الـ repo إجابات عن أسئلة لم تكن لتصل إليها بطريقة أخرى:
- ما الذي تغيّر في هذا الملف مؤخرًا؟
- من لمس هذا السطر آخر مرة، وماذا كان يحاول أن يفعل؟
- كيف كانت هذه الـ function تبدو قبل أن تُعاد كتابتها؟
- ما الذي تغيّر بين الأمس واليوم؟
- ماذا كان في آخر commit؟
كان كل واحد من هذه يتطلب أمر git منفصلًا وشيئًا من التحديق. الآن جميعها الشكل نفسه من السؤال.
الخطوة
توجّه Claude إلى المشروع وتسأل:
ما الذي تغيّر في src/lib/progress.ts خلال الأسبوع الماضي، ولماذا؟
what changed in src/lib/progress.ts in the last week, and why?
سيقوم Claude بما يلي:
- ينظر إلى الـ history الحديث للملف.
- يفتح الـ commits ذات الصلة.
- يقرأ الـ diffs وأي رسائل كتبها المطورون تصف التغيير.
- يلخّصها لك: «ثلاثة تغييرات — إضافة منطق المطالبة بنقاط XP، وإصلاح bug كان يجعل تراكب الترقية بين المستويات يظهر مرتين، وإعادة تسمية مساعِد. كلّ منها أجريتَه أنت في هذه الأيام، ولهذه الأسباب».
ينتقل الـ history من غامض إلى مقروء في turn واحد.
أشكال أسئلة مفيدة
سؤال المحقّق — «ما الذي انكسر؟»:
كان هذا يعمل الأسبوع الماضي والآن صار معطوبًا. ما الذي تغيّر في src/auth.ts منذ ذلك الحين؟
this was working last week and now it's broken. What changed in src/auth.ts since then?
سؤال علم الآثار — «لماذا هو هكذا؟»:
لماذا تعالج function الـ `formatPrice` ثلاث صيغ عملات مختلفة؟ متى أُضيفت كل واحدة منها؟
why does the `formatPrice` function handle three different currency formats? When did each one get added?
سؤال الـ blame — «من ولماذا؟»:
من غيّر هذا السطر آخر مرة: `if (user.role === 'admin' || user.role === 'owner')` — وماذا كان يحاول أن يصلح؟
who last changed this line: `if (user.role === 'admin' || user.role === 'owner')` — 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 لإنقاذك. الدرس التالي هو أهمّ عادة في هذا المستوى بأكمله: كيف تتحقق.