تا حالا شده فکر کنی "چی میشد اگه میتونستم از کل پروژهام عکس بگیرم و هر وقت خواستم برگردم به نسخههای قبلی؟" خب، تو دنیای واقعی که نمیشه این کار رو کرد، ولی تو دنیای کدنویسی میتونی! با گیت، هر لحظه میتونی از پروژهات اسنپشات بگیری. دقیقاً مثل اینه که داری یه عکس حرفهای از کدها و فایلهات میگیری. حالا اگه یه جای کار خراب شد، اصلاً نگران نباش، میتونی هر وقت خواستی برگردی به نسخههای قبلی و با خیال راحت تغییرات رو دنبال کنی.
برای اینکه دستورات رو بهتر یاد بگیریم با یه سناریو میریم سراغ دستورات. خب، تو و تیمت وارد یه استارتاپ شدین که قراره یه تحول توی بازار ارزهای دیجیتال ایجاد کنه: یه صرافی ارز دیجیتال به اسم "رمزارزمن" که میخواد همه رقبا رو کنار بزنه (بجز نوبیتکس البته :دی) و اولین انتخاب هر کسی باشه که میخواد بیتکوین، اتریوم یا حتی شتکوین بخره. همهچیز عالیه، ولی یه مشکل اساسی داریم—بدون مدیریت درست کدها و کنترل تغییرات، کل پروژه میتونه به فنا بره. 😱
فکرش رو بکن! اگه کنترل درستی نداشته باشیم، ممکنه وسط تراکنشها، یه جای اشتباه رو تغییر بدیم و یهو کل داراییهای کاربرها از دست بره، یا حتی بدتر: هک بشیم! اینجاست که گیت مثل یه سوپرقهرمان وارد میشه و همه این مشکلات رو حل میکنه. گیت مثل گاوصندوق دیجیتالیه که همه نسخههای کد رو امن نگه میداره. حالا آمادهای؟ بزن بریم با اولین قدم: راهاندازی گیت برای پروژه "رمزارزمن"!
خب، قدم اول برای راهاندازی یه صرافی دیجیتال اینه که یه پوشه درست کنی که همه فایلها و کدهای پروژهات رو توش ذخیره کنی. این پوشه مثل خونه اصلی پروژهته، و همهچیز باید منظم و مرتب باشه، چون قراره تراکنشها، کلیدهای امنیتی، و کدهای حساس صرافی رو داخلش نگهداری کنی.
ساخت پوشه پروژه
اول از همه، نیاز به یه پوشه داری که بتونه میزبان پروژهت باشه. هر اسمی میتونی انتخاب کنی، ولی چون پروژه ما در مورد یه صرافی دیجیتاله، بهتره یه اسم مناسب و حرفهای انتخاب کنیم. بیایم اسم پوشه رو "ramzarzman" بذاریم:
mkdir ramzarzman cd ramzarzman
بوم! حالا وارد پوشه پروژهات شدی. اینجا جاییه که قراره همه کدها، تنظیمات و فایلهای حساس و حیاتی پروژه صرافیت ذخیره بشه. فرض کن این پوشه مثل اتاق سرور صرافی توئه و همهچیز اینجا نگهداری میشه.
راهاندازی گیت
حالا که پوشه رو ساختی، باید گیت رو راهاندازی کنی تا همه تغییرات پروژه رو تحت نظر داشته باشه. گیت مثل یه سیستم امنیتی میمونه که تمام تغییرات رو ثبت و ذخیره میکنه. وقتی گیت رو راهاندازی کردی، دیگه نگران از دست دادن تغییراتت نیستی.
برای این کار کافیه دستور زیر رو تو ترمینال اجرا کنی:
git init
بعد از اجرای این دستور، یه پیام مشابه این دریافت میکنی:
Initialized empty Git repository in /path/to/your/ramzarzman/.git/
این یعنی گیت یه پوشه مخفی به اسم git. ساخته که تمام اطلاعات پروژه توش نگهداری میشه؛ مثل تاریخچه تغییرات، شاخهها، و کلی چیز دیگه که بهت کمک میکنه همهچیز رو تحت کنترل داشته باشی.
چرا پوشه git. مخفیه؟ 🤔
شاید الان بپرسی: "چرا پوشه git. رو نمیبینم؟" خب، چون این پوشه بهصورت پیشفرض مخفیه. ولی اگه میخوای ببینیش، کافیه این دستور رو اجرا کنی:
ls -a
حالا میبینیش! ولی یادت باشه که این پوشه حکم گنج پروژهت رو داره. نباید بهش دست بزنی، چون اگه اتفاقی این پوشه رو پاک کنی، تاریخچه کل پروژهت از دست میره و دیگه هیچچیز رو نمیتونی بازیابی کنی.
اگه پوشه `.git` رو حذف کنم چی میشه؟ 😱
فرض کن یه روز تصادفی این پوشه رو پاک کردی. اگه این کارو بکنی، کل مخزن گیت پروژهت از بین میره. تاریخچه تغییراتت، (commit)ها، و همه اطلاعات مهم پروژه ناپدید میشن. پس بهتره مواظب باشی و همیشه این پوشه رو حفظ کنی.
اگه دوست داری امتحان کنی (البته من توصیه نمیکنم)، میتونی این دستور رو اجرا کنی:
rm -rf .git
ولی یادت باشه که با اجرای این دستور، پروژهات رو به حالت اولیه برمیگردونی و دیگه هیچ تاریخچهای تو گیت نداری.
راهاندازی مجدد گیت
حالا فرض کنیم که اشتباهی پوشه `.git` رو پاک کردی. نگران نباش! هنوز میتونی گیت رو مجدد راهاندازی کنی و پروژهت رو نجات بدی:
git init
اینطوری گیت دوباره راهاندازی میشه، ولی تاریخچه قبلی رو از دست دادی. همیشه مواظب باش که این پوشه مهم رو حذف نکنی.
بسیار عالی! حالا میخوایم این بخش رو با یه سناریوی جذابتر برای پروژه صرافی "رمزارزمن" بازنویسی کنیم تا هم سادهتر بشه و هم لذتبخشتر. بیایم کل پروسه رو به نحوی تشبیه کنیم که مثل مدیریت پول و تراکنشها در صرافی باشه.
حالا که مخزن گیت رو برای صرافی دیجیتال "رمزارزمن" راه انداختیم، وقتشه که بفهمیم این سیستم چطوری کار میکنه. در واقع، گیت یه workflow داره که بهت کمک میکنه تغییرات پروژهات رو قدم به قدم مدیریت کنی. فرض کن تو هر روز داری روی کدهای صرافی کار میکنی، باگها رو رفع میکنی، ویژگیهای جدید اضافه میکنی، و در نهایت، هر روز چندین تغییر رو میخوای ذخیره و ثبت کنی. بیایم ببینیم این پروسه چطوری تو گیت انجام میشه. این عکس پایین قسمت های دیگه ای هم داره که فعلا ترجیح میدم همین موارد رو داشته باشیم، در ادامه کامل تر میکنیم این عکس رو تا تمام قسمت های این flow رو درک کنین.
Working Directory
این همون جاییه که فایلها و پروژههایت رو داخلش داری. هر تغییر اولیهای که روی فایلها میدی، توی این دایرکتوری اتفاق میافته، مثلا اینجا منظور دایرکتوری ramzarzman هست
Staging Area
وقتی میخوای تغییراتت رو آماده کنی برای (commit)، باید اونها رو به منطقه موقت ببری. اینجا تغییرات رو قبل از commit کردن میتونی ببینی
local repository
مخزن گیت محلی همون جاییه که گیت تمام commit ها رو بهصورت لوکال (محلی) ذخیره میکنه. اینجا نسخههای مختلف پروژهات نگهداری میشن. هر commit در گیت یه اسنپشات از پروژهته که بهت کمک میکنه بفهمی چه تغییراتی رو کی و کجا انجام دادی. خیلی مهمه که برای هر commit، یه پیام مختصر ولی واضح بنویسی تا وقتی به تاریخچه پروژه نگاه میکنی، سریع متوجه بشی چه کاری انجام شده.
هر commit توی گیت یه شناسه منحصر به فرد داره و شامل اطلاعات زیر میشه:
- چه تغییراتی انجام شده.
- چه کسی تغییرات رو انجام داده.
- چه زمانی تغییرات انجام شده.
- یه اسنپشات کامل از وضعیت پروژه در اون لحظه.
خب اینجا ما از ۲ تا دستور مهم استفاده کردیم بریم ببینیم چی هست
دستور git status:
با این دستور میتونین وضعیت فایل ها رو ببین که توی چه مرحله ای هستن و چه کارهایی میتونین انجام بدین.
اینجا میبینیم که ۲ فایل هستن که در واقع untrack file هستن، در واقع یعنی تحت کنترل با گیت نیستن.
دستور Git Add:
با این دستور تغییرات رو از working directory به staging area میبری. این اولین قدم برای commit کردن تغییراته.
خب با دستور . git add ما تمام فایل هایی که توی working directory بود رو منتقل کردیم به staging area
دستور Git Commit:
بعد از اینکه تغییرات رو به staging area بردی، با دستور commit اونها رو به مخزن محلی اضافه میکنی. این باعث میشه تغییرات توی گیت ثبت بشه.
فرض کن دوباره نیاز شد یه باگ دیگه توی transactions.yaml رو رفع کنی و یه فایل جدید به اسم vallet.txt بسازی این بار هم باید فایل رو استیج (stage) کنی و بعدش یه commit جدید ثبت کنی:
خب همونطور که میبینین ما یه فایل moddified داریم و یه فایل جدید که هنوز تحت کنترل با گیت نیست.
حالا فایل ها رو با دستور git add منتقل میکنیم به staging area
میبینیم که فایل ها سبز رنگ هستن و یه فایل جدید و یه فایل تغییر یافته داریم.
و در قدم آخرم یه commit انجام میدیم و تغییرات رو میفرستم روی گیت.
حالا یه روز تصمیم میگیری فایل قدیمی config_old.yaml که دیگه لازم نیست رو پاک کنی.
برای حذف فایلهای اضافی از گیت، دو روش ساده وجود داره:
روش ۱: حذف فایل و استیج کردن به صورت دستی
rm config_old.yaml git add config_old.yaml git commit -m "حذف فایل تنظیمات قدیمی"
روش ۲: استفاده از دستور git rm
با این روش، فایل هم از دایرکتوری کاری و هم از گیت پاک میشه:
git rm config_old.yaml
git commit -m "حذف فایل تنظیمات قدیمی"
خب من از قبل این فایل رو اضافه کردم و با روش دوم اونو حذفش میکنیم.
هر دو روش حذف فایل رو به عنوان یک اسنپشات جدید ثبت میکنن، ولی روش دوم سریعتره چون نیاز به استیج کردن جداگانه نداره.
تو هر پروژهای، فایلهایی هستن که نمیخوای گیت پیگیریشون کنه. ممکنه این فایلها شامل لاگها، فایلهای کامپایل شده، یا فایلهای خودکاری باشن که توسط سیستم تولید شدن. اگه این فایلها رو به مخزن گیتت اضافه کنی، فقط پروژهات سنگین و بههمریخته میشه. اینجا میخوایم ببینیم چطور گیت رو وادار کنیم که یه سری فایلها رو نادیده بگیره
قدم ۱: ساختن فایل gitignore.
برای اینکه به گیت بگی چه فایلهایی رو نادیده بگیره، یه فایل ویژه به اسم gitignore. میسازی. این فایل هیچ اسمی نداره، فقط همون پسوند gitignore. رو داره و باید تو روت پروژه قرار بگیره.
خب، فرض کنیم تو پروژه "رمزارزمن" لاگهای تراکنشهات زیاده و نمیخوای گیت پیگیریشون کنه. یه فایل لاگ میسازیم و بعدش به گیت میگیم اینو نادیده بگیره:
1. اول، یه پوشه لاگ و یه فایل لاگ داخلش درست میکنیم:
حالا پوشه لاگ رو ساختیم و یه فایل لاگ هم توش قرار دادیم.
2. حالا باید فایل gitignore. رو بسازیم و بگیم پوشه `logs/` رو نادیده بگیره. میتونی این فایل رو توی ادیتورت باز کنی و فایلهای دیگهای رو هم که نمیخوای گیت پیگیریشون کنه، بهش اضافه کنی. مثلاً:
قدم ۲: استیج کردن و commit کردن فایل gitignore.
بعد از اینکه فایل gitignore. رو بهروزرسانی کردی، یادت نره که اون رو استیج و commit کنی تا بخشی از پروژهت بشه. اگه git status رو اجرا کنی، میبینی که دیگه گیت پوشه /logs و فایلهای log. رو پیگیری نمیکنه.
قدم ۳: نادیده گرفتن فایلهایی که قبلاً commit شدن
حالا فرض کن که تصادفی یه فایل یا پوشه مثل /bin رو که شامل فایلهای کامپایل شده هست رو commit کردی. حتی بعد از اضافه کردن اون به gitignore.، گیت همچنان اون رو دنبال میکنه چون قبلاً تو مخزن ثبت شده.
اول بریم مشکل رو ایجاد کنیم بعدم حلش کنیم.
خب الان یادمون میاد این دایرکتوری رو نباید توسط گیت tarck بشه و میایم به gitignore. اضافش میکنیم، یه سری تغییرات مجدد روی فایل میدیم میبینیم هنوزم تغییرات توسط گیت داره ردگیری میشه
خب برای حل این مشکل باید از دستور git rm استفاده کنیم اما از سوئیچ cached باید استفاده کنیم. این سوئیچ میگه که فایل توی working directory باقی بمونه اما از staging area حذف بشه
حالا گیت دیگه تغییرات توی پوشه `bin/` رو پیگیری نمیکنه
خب، تا اینجا چندین (commit) ثبت کردیم، ولی اینcommit کجا میرن و چطوری میتونیم اونها رو ببینیم؟ بیایم با هم بررسی کنیم که چطور میتونیم تاریخچه commit های پروژه "رمزارزمن" رو مشاهده کنیم و ازش استفاده کنیم.
قدم ۱: استفاده از دستور git log
برای مشاهده تمام commit های قبلی پروژهات، از دستور git log استفاده میکنیم.
این دستور یه لیست کامل از تمام commit ها رو به ترتیب از جدیدترین تا قدیمیترین بهت نشون میده. برای هر commit، اطلاعات زیر رو مشاهده میکنی:
گیت بهت میگه که روی کدوم branch (در اینجا `master`) هستی. بعداً درباره branch ها بیشتر صحبت میکنیم.
وقتی تعداد زیادی commit داشته باشی، گیت ممکنه اونا رو صفحه به صفحه نشون بده. میتونی با فشار دادن space به صفحات بعدی بری و با q از نمای لاگ خارج بشی.
مشاهده خلاصه لاگ ها
اگه نمیخوای کل لاگ رو با تمام جزییات ببینی و فقط یه مرور کلی از commit ها داشته باشی، میتونی از سوئیچ oneline-- استفاده کنی:
بهطور پیشفرض، گیت commit رو از جدیدترین به قدیمیترین نشون میده. اگه بخوای commit های قدیمیتر رو اول ببینی، میتونی از فلگ reverse-- استفاده کنی:
میبنیم که اولین commit بالای لیست و جدیدترین commit پایین لیست نمایش داده میشه.
حالا که commit های زیادی ثبت کردی، شاید بخوای ببینی دقیقاً چه تغییراتی تو یکی از commit ها اتفاق افتاده. اینجاست که دستور git show به کارت میاد.
استفاده از git show
فرض کن میخوای جزییات یه commit خاص رو ببینی. برای این کار میتونی از دستور زیر استفاده کنی:
git show <commit-id>
خب سوال اینه چطور commit id رو به دست بیاری، وقتی دستور git show رو مینویسی کافیه tab رو بزنی تا لیست کامل رو برات نشون بده
حاالا یا میتونی با استفاده از شناسه منحصر به فرد اون commit جزئیاتش رو ببینی، میتونی چند کاراکتر اول اون شناسه رو برداری، به شرطی که اون شناسه بهطور یکتا مشخصکننده اون commit باشه:
git show c692e66
یا با استفاده از HEAD: اگه میخوای به آخرین commit اشاره کنی، فقط کافیه HEAD رو تایپ کنی. برای رفتن به commit قبلی یا چند commit قبلتر، میتونی از HEAD~1 (یه قدم به عقب)، HEAD~2، و غیره استفاده کنی:
git show HEAD~1
این دستور جزییات commit رو بهت نشون میده که شامل نویسنده، تاریخ، و تغییرات انجام شده تو اون commit.
مشاهده فایل کامل در یک commit
اگه نمیخوای فقط تغییرات رو ببینی و میخوای کل فایل رو به شکلی که تو یه commit خاص بوده ببینی، میتونی مسیر فایل رو مشخص کنی:
مثلاً، اگه میخوای محتوای فایل `.gitignore` توی commit قبلی رو ببینی، از دستور زیر استفاده کن:
git show HEAD~1:.gitignore
لیست کردن تمام فایلها در یک commit
اگه میخوای لیست تمام فایلها و دایرکتوریهایی که توی یه commit وجود داشتن رو ببینی، از دستور git ls-tree استفاده کن:
گاهی ممکنه یه فایل رو برای commit استیج کنی و بعد متوجه بشی که "اوه، این نباید تو commit بعدی بره!" شاید این فایل بخشی از یه وظیفه دیگه باشه یا نیاز به کار بیشتری داشته باشه. تو این مواقع، میتونی فایل رو آناستیج کنی و اون رو از commit خارج کنی.
چطور فایل رو آناستیج کنیم
تو نسخههای قدیمی گیت، از دستور `git reset` برای آناستیج کردن استفاده میشده، ولی این دستور یه کم گیجکننده هست، پس حالا از git restore استفاده میکنیم.
برای آناستیج کردن یه فایل، از دستور زیر استفاده کن:
git restore --staged <file>
مثلاً فرض کن تصادفی transactions.yaml رو استیج کردی ولی نمیخوای توی commit بعدی باشه. فقط کافیه این دستور رو اجرا کنی:
git restore --staged transactions.yaml
این دستور تغییرات رو از(staging area) به (working directory) برمیگردونه، یعنی دیگه اون فایل برای commit آماده نیست. برای تأیید، میتونی وضعیت رو با این دستور چک کنی:
چه اتفاقی برای فایلهای جدید میافته؟
اگه یه فایل کاملاً جدید رو آناستیج کنی چی؟ فرض کن یه فایل جدید به اسم `users.yaml` به staging area اضافه کردی ولی بعد میفهمی نمیخوای هنوز اون رو commit کنی. میتونی از این دستور استفاده کنی:
git restore --staged users.yaml
از اونجایی که این فایل قبلاً توی هیچ commit ی نبوده، گیت اون رو از منطقه موقت حذف میکنه و بهعنوان فایل غیر ردیابی شده (untrack)نشون میده.
خب امیدوارم این توضیحات مفید بوده باشه براتون، سعی کردم تمام قسمت ها رو با مثال توضیح بدم. توی قسمت های بعدی سراغ کارهای دیگه ای که میتونیم با گیت انجام بدین میریم.