مقدمه

برای استفاده موثر از گیت، باید مدل ذهنی آن را درک کنید. برخلاف بسیاری از سیستم‌های کنترل نسخه دیگر که فقط دو ناحیه اصلی (پوشه کاری و مخزن) دارند، گیت یک ناحیه میانی بسیار قدرتمند را معرفی می‌کند. درک این سه ناحیه یا سه حالت، کلید تسلط بر گیت و جریان کاری آن است.

فایل‌های پروژه شما در هر لحظه می‌توانند در یکی از این سه ناحیه اصلی قرار داشته باشند:

  • پوشه کاری (Working Directory)
  • منطقه آماده‌سازی (Staging Area)
  • مخزن گیت (Git Directory / Repository)

در این درس، به تفصیل هر یک از این نواحی و چگونگی جابجایی تغییرات بین آن‌ها را بررسی خواهیم کرد.

تشریح سه ناحیه اصلی گیت

بیایید هر یک از این سه بخش را با دقت بیشتری بررسی کنیم تا نقش آن‌ها در چرخه حیات فایل‌ها مشخص شود.

۱. پوشه کاری - Working Directory

این ناحیه همان پوشه پروژه شما روی سیستم‌تان است که فایل‌ها و کدهای خود را در آن مشاهده و ویرایش می‌کنید. Working Directory یک نسخه از پروژه است که از دیتابیس گیت (مخزن) استخراج (checkout) شده است. شما تمام کارهای روزمره خود مانند افزودن، ویرایش و حذف فایل‌ها را در این ناحیه انجام می‌دهید.

فایل‌های موجود در این پوشه می‌توانند دو حالت داشته باشند: tracked (رهگیری‌شده) یعنی فایل‌هایی که گیت از وجود آن‌ها آگاه است و تغییراتشان را زیر نظر دارد، و untracked (رهگیری‌نشده) یعنی فایل‌های جدیدی که هنوز به گیت معرفی نشده‌اند.

۲. منطقه آماده‌سازی - Staging Area

این ناحیه، مفهومی منحصربه‌فرد و قدرتمند در گیت است. Staging Area (که گاهی به آن Index هم گفته می‌شود) مانند یک پیش‌نویس یا سبد خرید برای کامیت بعدی شما عمل می‌کند. شما تغییراتی را که می‌خواهید در اسنپ‌شات (کامیت) بعدی ثبت شوند، به این منطقه اضافه می‌کنید.

قدرت این ناحیه در این است که به شما اجازه می‌دهد کامیت‌های خود را با دقت بسازید. برای مثال، ممکن است شما روی دو قابلیت مختلف در یک فایل کار کرده باشید. با استفاده از Staging Area، می‌توانید فقط تغییرات مربوط به قابلیت اول را به این منطقه اضافه (stage) کرده و کامیت کنید و تغییرات قابلیت دوم را برای یک کامیت دیگر نگه دارید. این کار باعث ایجاد تاریخچه‌ای تمیز و معنادار می‌شود. برای افزودن تغییرات از پوشه کاری به این منطقه، از دستور git add استفاده می‌کنیم.

۳. مخزن گیت - The .git Directory

این ناحیه، دیتابیس دائمی پروژه شماست. همانطور که در درس قبل گفتیم، پوشه مخفی .git تمام آبجکت‌های پروژه (فایل‌ها، کامیت‌ها) و فراداده‌ها (metadata) را در خود ذخیره می‌کند.

وقتی شما دستور git commit را اجرا می‌کنید، گیت محتویات Staging Area را برداشته، یک اسنپ‌شات دائمی از آن تهیه کرده و این اسنپ‌شات را در مخزن (پوشه .git) ذخیره می‌کند. از این لحظه به بعد، آن تغییرات بخشی از تاریخچه پروژه شما محسوب می‌شوند.

جریان کاری پایه در گیت

با توجه به سه ناحیه‌ای که توضیح دادیم، جریان کاری استاندارد در گیت به صورت یک چرخه تکرارشونده است:

  1. تغییر (Modify): شما فایل‌های خود را در پوشه کاری ویرایش می‌کنید.
  2. آماده‌سازی (Stage): شما تغییراتی را که می‌خواهید در کامیت بعدی ثبت شوند، با دستور git add به منطقه آماده‌سازی منتقل می‌کنید.
  3. ثبت (Commit): شما اسنپ‌شات آماده‌شده در منطقه آماده‌سازی را با دستور git commit به صورت دائمی در مخزن گیت ثبت می‌کنید.

این چرخه (Modify → Stage → Commit) اساس تمام فعالیت‌های شما در گیت خواهد بود.

بررسی وضعیت فایل‌ها با git status

مهم‌ترین دستوری که در این چرخه به شما کمک می‌کند، دستور git status است. این دستور وضعیت فایل‌ها را در سه ناحیه مختلف به شما نشان می‌دهد و به شما می‌گوید کدام فایل‌ها تغییر کرده‌اند، کدام‌ها در Staging Area هستند و کدام‌ها هنوز توسط گیت رهگیری نمی‌شوند.

بیایید یک مثال عملی را دنبال کنیم. یک ریپوزیتوری خالی با git init بسازید. حالا یک فایل جدید به نام file1.txt ایجاد کنید. اگر دستور git status را اجرا کنید، خروجی مشابه زیر خواهد بود:

On branch main

No commits yet

Untracked files:
  (use "git add ..." to include in what will be committed)
        file1.txt

nothing added to commit but untracked files present (use "git add" to track)

گیت به درستی تشخیص داده که file1.txt یک فایل رهگیری‌نشده (Untracked) است. حالا با دستور git add آن را به Staging Area اضافه می‌کنیم:

git add file1.txt

دوباره git status را اجرا کنید. خروجی تغییر می‌کند:

On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached ..." to unstage)
        new file:   file1.txt

اکنون فایل در بخش "Changes to be committed" قرار دارد، یعنی در Staging Area است و آماده ثبت نهایی. درک خروجی دستور git status به شما کمک می‌کند تا همیشه بدانید در کجای این فرآیند سه‌مرحله‌ای قرار دارید.