تاريخ يمكنك العودة إليه
يسجّل Git تاريخ المشروع كسلسلة من الإيداعات (commits): لقطات لكل الملفات المتتبَّعة، لكل منها مؤلف ووقت ورسالة. به ترى ما تغيّر ولماذا، وتجرّب فكرة بلا خوف، وتعود إلى نسخة كانت تعمل. والمجلد الخاضع لـGit هو مستودع. ويعتمد العمل الكمي على هذا كثيرًا: فالنتيجة لا يوثق بها إلا إذا استطعت أن تقول بالضبط أي نسخة من الكود أنتجتها.
# Start tracking a project (once)
git init
# See what changed, stage it, record it
git status
git add main.py README.md
git commit -m "Add the first backtest loop"
# Look back
git log --oneline
git diff # changes not yet stagedثلاثة أماكن يعيش فيها التغيير
ينتقل التغيير عبر ثلاث مناطق. تعدّل الملفات في شجرة العمل. ينسخ git add التغييرات المختارة إلى منطقة الإعداد (اللقطة التالية قيد التحضير). ويسجّل git commit اللقطة المُعدّة في تاريخ المستودع. وهذا يتيح لك إيداع التغييرات المترابطة وحدها معًا حتى لو عدّلت ملفات كثيرة. ويعرض git status كل ملف في منطقته: معدَّل أو مُعدّ أو غير متتبَّع (جديد ولم يعرفه Git بعد).
# git status --porcelain prints two status letters, a space, then the path
status = """ M main.py
A notes.md
?? scratch.txt
D old.py"""
for line in status.splitlines():
code, path = line[:2], line[3:]
print(repr(code), path)
# ' M' main.py (modified, not staged)
# 'A ' notes.md (new, staged)
# '??' scratch.txt (untracked)
# 'D ' old.py (deleted, staged)الفروع
الفرع اسم متحرك لخط من الإيداعات. أنشئ فرعًا لكل فكرة أو إصلاح (git switch -c fee-model)، وأودع عليه بحرية، وحين يعمل أعِده إلى الخط الرئيسي بـgit merge (عادةً من فرع main). يمكن أن تحتوي أسماء الفروع على حروف وأرقام و- و_ و/ و.، لكن لا مسافات ولا أيًّا من ~ ^ : ? * [ \، ولا يمكن أن تبدأ أو تنتهي بـ/ أو تنتهي بـ.. ويخبرك Git بالتعارضات حين يعدّل فرعان الأسطر نفسها، وتحلّها يدويًا.
# Try an idea on its own branch, then bring it back
git switch -c fee-model
git commit -am "Use tiered fees"
git switch main
git merge fee-model
# List branches (the current one has a star)
git branchما يجب استبعاده وكيف تتراجع
يسرد ملف .gitignore الأنماط التي لا ينبغي لـGit تتبعها: .venv/ (مجلد يُكتب بشرطة مائلة أخيرة) و*.log (أي ملف يطابق حرفًا بديلًا) وsecrets.env. استبعد البيئات الافتراضية وذاكرات التخزين المؤقت وملفات البيانات الكبيرة، وقبل ذلك كله الأسرار كمفاتيح الواجهات البرمجية: فكل ما يُودَع يبقى في التاريخ حتى لو حذفته لاحقًا. وللتراجع، يتخلص git restore file من التعديلات غير المودعة في ملف، ويضيف git revert <commit> إيداعًا جديدًا يلغي إيداعًا قديمًا، وهذا آمن في الفروع المشتركة. ويتبادل git push وgit pull الإيداعات مع نسخة بعيدة كالتي على GitHub.
# .gitignore
.venv/
__pycache__/
*.log
secrets.env
# Undo safely
git restore main.py # drop uncommitted edits to one file
git revert 3f2a9c1 # new commit that cancels an old one
# Share
git push origin main
git pullgit log --oneline مقروءًا. وإذا وصل مفتاح أو كلمة مرور إلى إيداع فاعتبره مسرّبًا: ألغِه ثم أزله من التاريخ.git initوgit statusوgit addوgit commit -m "..."وgit log --oneline.- فرع لكل فكرة:
git switch -c nameثمgit merge. - استخدم
.gitignoreلـ.venv/وذاكرات التخزين المؤقت والبيانات والأسرار؛ وتراجع بـrestoreأوrevert.
التالي: دفاتر Jupyter، لاستكشاف البيانات تفاعليًا وكيف تبقيها مرتبة تحت Git.
المختبر: ما الذي يُقيَّم
- صنّف ملفات تقرير
git statusباستخدامparse_status25 نقطة - اقرأ قائمة
git log --onelineباستخدامparse_log25 نقطة - تحقق من اسم فرع وفق قواعد Git باستخدام
is_valid_branch_name25 نقطة - طبّق
.gitignoreعلى قائمة ملفات باستخدامnot_ignored25 نقطة