درون گیت: اشیاء و هشینگ
گیت به دلیل نحوه ذخیرهسازی دادهها، سریع و قابل اعتماد است. برای تسلط بر گیت، باید دایرکتوری .git را درک کنید. این پوشه مخفی شامل تمام چیزهایی است که گیت برای ردیابی پروژه شما نیاز دارد.
گیت از چهار نوع اصلی اشیاء (objects) برای مدیریت کار شما استفاده میکند:
- Blobs: اینها محتویات فایل را ذخیره میکنند.
- Trees: اینها ساختار دایرکتوریها و نام فایلها را ذخیره میکنند.
- Commits: اینها اسنپشاتها (snapshots) و متادیتای پروژه شما را ذخیره میکنند.
- Tags: اینها ارجاعاتی به نسخههای خاص را ذخیره میکنند.
گیت همه چیز را با استفاده از هشینگ (hashing) شناسایی میکند. این ابزار از الگوریتم SHA-1 برای تبدیل دادهها به یک شناسه (ID) منحصربهفرد استفاده میکند. این شناسه مانند یک اثر انگشت عمل میکند. اگر حتی یک کاراکتر را در یک فایل تغییر دهید، هش آن کاملاً تغییر میکند.
گیت چگونه یک اسنپشات میسازد:
وقتی فایلی را کامیت میکنید، گیت زنجیرهای از اشیاء را ایجاد میکند.
- Blob متن یا دادههای واقعی فایل شما را ذخیره میکند.
- Tree آن blob را به یک نام فایل و مسیر پوشه مشخص نگاشت (map) میکند.
- Commit درخت را به نویسنده، برچسب زمانی (timestamp) و یک پیام متصل میکند.
گیت تغییرات یا "deltas" را ذخیره نمیکند، بلکه اسنپشاتها را ذخیره میکند. هر بار که کامیت میکنید، گیت اشیاء جدیدی ایجاد میکند. این امر باعث میشود تاریخچه شما تغییرناپذیر (immutable) و بازیابی آن آسان باشد.
درک این ساختار به شما کمک میکند تا خطاها را رفع کنید، دادههای از دست رفته را بازیابی کنید و شاخههای (branches) پیچیده را مدیریت کنید.
این پروژه کوچک را برای مشاهده عملی آن امتحان کنید:
ایجاد یک مخزن (repo): mkdir git-lab cd git-lab git init
ایجاد یک فایل و یافتن هش آن: echo 'Hello Git' > hello.txt git hash-object hello.txt
ذخیره فایل به عنوان یک blob: git hash-object -w hello.txt
بررسی نوع و محتوای شیء: git cat-file -t [YOUR_HASH] git cat-file -p [YOUR_HASH]
ایجاد یک کامیت و مشاهده درخت: git add hello.txt git commit -m 'Initial commit' git ls-tree HEAD
با نگاهی به زیر پوستهی کار، متوجه میشوید که گیت چیزی فراتر از یک ابزار کنترل نسخه است. گیت یک پایگاه داده بسیار سازمانیافته از اشیاء با آدرسدهی محتوا (content-addressed objects) است.
Source: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc
Optional learning community: https://t.me/GyaanSetuAi
