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های بزرگ.