Working Directory (WD)

محل کاری پروژه که تغییرات فعلی شما در آن است. تغییرات تا زمان Stage شدن ثبت نمی‌شوند.

  • تشخیص فایل‌های جدید و تغییر یافته
  • متادیتای فایل‌ها (مجوزها، زمان‌ها، لینک‌های سمبولیک) بر تشخیص تغییرات اثر می‌گذارد
  • git status مقایسه WD با Index و HEAD را انجام می‌دهد

Staging Area (Index)

Index یک فایل باینری (.git/index) است که به عنوان لایه میانی بین WD و repository عمل می‌کند:

  • مسیر فایل‌ها
  • SHA-1 blob hash
  • حالت فایل
  • شماره stage برای conflictها
  • امکان Stage جزئی با git add -p

Repository (.git)

شامل تمامی داده‌های تاریخی پروژه است:

  • Database objectها (blob, tree, commit, tag)
  • References: branchها، tagها، remoteها
  • HEAD pointer
  • Hooks: pre-commit، post-commit، pre-push و غیره
  • Logs: reflog، پیگیری حرکت HEAD

Blob

ذخیره محتوای فایل‌ها بدون نام و مسیر. با SHA-1 شناسایی می‌شود و در commitهای مختلف تکراری ذخیره نمی‌شود.

Tree

نماینده دایرکتوری است. مسیر → حالت → SHA-1 blob یا sub-tree را نگه می‌دارد و امکان snapshot سلسله‌مراتبی پروژه را فراهم می‌کند.

Commit

Snapshot پروژه شامل:

  • Tree hash
  • Parent commit(s)
  • اطلاعات نویسنده و committer
  • پیام commit
  • امضای GPG (اختیاری)

Tag

اشاره‌گر انسانی به commit. می‌تواند lightweight یا annotated با metadata و امضا باشد.

Refs & HEAD

  • HEAD اشاره‌گر branch یا commit فعلی است
  • Branchها در .git/refs/heads ذخیره می‌شوند
  • Remote-tracking branchها در .git/refs/remotes
  • Symbolic vs direct refs

ذخیره‌سازی بر اساس محتوا

هر object با SHA-1 (در آینده SHA-256) شناسایی می‌شود. صحت داده‌ها تضمین می‌شود و تکرار جلوگیری می‌شود.

Loose Objects

Objectها به صورت منفرد در .git/objects/xx/yyyy ذخیره می‌شوند و zlib compressed هستند.

Packfiles و Delta Compression

Objectهای مشابه در packfileها جمع شده، با delta فشرده می‌شوند، فضای دیسک کاهش می‌یابد و انتقال شبکه بهینه می‌شود.

بررسی صحت (Integrity)

SHA تضمین می‌کند که کوچکترین تغییر باعث تغییر ID object می‌شود. با git fsck بررسی می‌شود.

مفاهیم پیشرفته ذخیره‌سازی

  • بازاستفاده از objectها در commitهای مختلف
  • Delta chains در packfileها برای ذخیره بهینه
  • Shallow clone و اثر آن بر objectهای گمشده

ساخت Commit

Stage → Blob → Tree → Commit → بروزرسانی branch pointer. شامل metadata و والدین commit.

DAG (Commit Graph)

Commitها یک DAG تشکیل می‌دهند. Merge commit دارای چند والد است. اشاره‌گر branch با commit جدید حرکت می‌کند.

مثال Commit Object

Commit = {
  tree: SHA-1(TreeRoot),
  parents: [SHA-1(Parent1), SHA-1(Parent2)],
  author: 'Abolfazl',
  committer: 'Abolfazl',
  message: 'Add new feature',
  gpgsig: 'اختیاری'
}

Rebase و بازنویسی تاریخچه

برای خطی کردن تاریخچه commit استفاده می‌شود. توجه کنید: بازنویسی تاریخچه مشترک ممکن است collaboration را خراب کند.

Reflog و بازیابی

حرکت branchها را ثبت می‌کند، امکان rollback و recovery commitهای orphan یا stash وجود دارد.

Hooks و اتوماسیون

استفاده از pre-commit، post-commit، pre-push برای اعمال قوانین کیفیت، اجرای تست‌ها و اتوماسیون workflow.

مدیریت فایل‌های بزرگ (Git LFS)

فایل‌های بزرگ در خارج از repository ذخیره می‌شوند و در repo با pointer جایگزین می‌شوند. اندازه repo کاهش یافته و انتقال شبکه بهینه می‌شود.

Integrity و بازیابی

با git fsck صحت objectها بررسی می‌شود. بازسازی repository از object hash ممکن است.

توصیه‌های حرفه‌ای

  • Commitهای اتمیک و منطقی
  • Workflow شاخه‌ای برای ویژگی‌ها و releaseها
  • Tagهای annotated برای releaseها
  • Commitهای کوچک و incremental برای traceability
  • پشتیبان‌گیری قبل از rebase یا force push
  • Shallow clone برای repoهای بزرگ

نکات عملکردی

Delta compression، بهینه‌سازی packfile، shallow/sparse clone و partial checkout برای repoهای بزرگ.