همه یک بار فایلی به اسم index-final-v2-درست.php داشته‌ایم. گیت این بی‌نظمی را با یک ایده‌ی ساده حل می‌کند: هر نقطه‌ی مهم کار را با پیامی ثبت می‌کند و می‌توانید هر وقت خواستید به آن برگردید. روی این ایده، کار گروهی، آزمایش بی‌خطر و استقرار منظم ساخته شده است.

برای شروع به مفاهیم کم‌شماری نیاز دارید: مخزن، commit، شاخه و ادغام. با همین‌ها بیشتر کار روزمره‌تان راه می‌افتد.

نصب و تنظیم اولیه#

گیت را از صفحه‌ی رسمی git-scm.com نصب کنید. سپس یک‌بار نام و ایمیل را تنظیم کنید تا هر commit به نام شما ثبت شود:

Bash
git config --global user.name "نام شما"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main

ساخت مخزن و اولین commit#

Bash
mkdir my-site && cd my-site
git init
echo "<?php echo 'سلام';" > index.php

git status
git add index.php
git commit -m "افزودن صفحه‌ی اصلی"

مسیر هر تغییر سه مرحله دارد: ویرایش در پوشه‌ی کار، stage با git add و ثبت با git commit. دستور git status همیشه نشان می‌دهد در کدام مرحله‌اید و پرمصرف‌ترین دستور گیت است. تاریخچه را با git log --oneline ببینید و تغییرات هنوز ثبت‌نشده را با git diff.

پیام commit را برای آدم بنویسید. «تغییرات» پیام بدی است؛ «اعتبارسنجی ایمیل در فرم تماس» پیام خوبی است.

فایل gitignore#

همه‌چیز نباید وارد تاریخچه شود. فایل .gitignore در ریشه‌ی پروژه بسازید:

Text
.env
vendor/
node_modules/
storage/logs/
*.log
.DS_Store

فایل‌های دارای رمز، مثل .env یا wp-config.php با اطلاعات واقعی، هرگز نباید در مخزن باشند، مخصوصاً اگر آن را جایی عمومی بگذارید. پوشه‌ی vendor هم با Composer قابل بازسازی است؛ در Composer و مدیریت وابستگی‌ها بیشتر توضیح داده‌ایم.

شاخه یا branch#

شاخه یعنی یک خط جداگانه‌ی کار. می‌توانید ویژگی تازه را بدون خراب‌کردن نسخه‌ی اصلی بسازید:

Bash
git switch -c feature/contact-form    # ساخت و رفتن به شاخه‌ی تازه
# ... فایل‌ها را ویرایش کنید ...
git add .
git commit -m "ساخت فرم تماس"

git branch                             # فهرست شاخه‌ها
git switch main                        # برگشت به شاخه‌ی اصلی

قاعده‌ی عملی: برای هر کار یک شاخه با نام گویا (feature/...، fix/...) بسازید. شاخه ارزان است و هر کار کوچک شاخه‌ی خودش را می‌خواهد.

ادغام یا merge#

وقتی کار شاخه تمام شد، آن را به شاخه‌ی اصلی بیاورید:

Bash
git switch main
git merge feature/contact-form
git branch -d feature/contact-form    # حذف شاخه‌ی ادغام‌شده

اگر در شاخه‌ی main از زمان جدا شدن شاخه تغییری نبوده باشد، گیت فقط اشاره‌گر را جلو می‌برد (fast-forward). اگر هر دو طرف تغییر داشته باشند، یک commit ادغام ساخته می‌شود.

حل تعارض#

اگر هر دو شاخه یک جای فایل را تغییر داده باشند، گیت می‌ایستد و آن را علامت می‌زند:

Text
<<<<<<< HEAD
$title = 'تماس با ما';
=======
$title = 'ارتباط با ما';
>>>>>>> feature/contact-form

گام‌های حل:

  1. فایل را باز کنید و تصمیم بگیرید کدام نسخه (یا ترکیبی از هر دو) درست است.
  2. سه خط علامت <<<<<<<، ======= و >>>>>>> را حذف کنید.
  3. با git add فایل را stage کنید.
  4. با git commit ادغام را کامل کنید.

اگر وسط کار پشیمان شدید، git merge --abort شما را به قبل از ادغام برمی‌گرداند. تعارض نشانه‌ی خرابی کار نیست؛ فقط یعنی دو نفر یک جا را عوض کرده‌اند.

برگرداندن تغییرات#

می‌خواهمدستور
تغییر ثبت‌نشده‌ی یک فایل را دور بریزمgit restore فایل
فایل stage‌شده را از stage دربیاورمgit restore --staged فایل
آخرین commit را بردارم و تغییرات بماندgit reset --soft HEAD~1
commit منتشرشده را خنثی کنمgit revert شناسه

دستورهای git reset --hard و git restore تغییرات ثبت‌نشده را برای همیشه پاک می‌کنند. پیش از اجرا مطمئن شوید چه چیزی از دست می‌رود.

مخزن راه‌دور#

برای نسخه‌ی پشتیبان و کار گروهی، مخزن را روی سرویسی مثل گیت‌هاب نگه می‌دارند:

Bash
git remote add origin <آدرس-مخزن>
git push -u origin main
git pull

دستور pull تغییرات دیگران را می‌گیرد و push تغییرات شما را می‌فرستد. پیش از شروع کار روزانه git pull بزنید تا کمتر به تعارض بخورید. ادامه‌ی مسیر، یعنی Pull Request و بازبینی کد، در گیت‌هاب برای کار تیمی آمده است و برای انتشار روی سرور، استقرار سایت با گیت روی هاست اشتراکی را ببینید.

عادت‌های خوب از اول#

  • commit کوچک و پرتکرار بزنید؛ هر commit یک کار.
  • روی main مستقیم کار نکنید.
  • پیش از git add . یک نگاه به git status بیندازید تا فایل ناخواسته وارد نشود.
  • رمز و کلید API را هرگز commit نکنید.
  • اگر افزونه‌ی وردپرس می‌نویسید، از همان روز اول مخزن بسازید؛ در ساخت افزونه‌ی وردپرس از صفر ساختار پوشه‌ها آمده است.

یک گردش کار روزانه#

چیزی که معمولاً از تمرین‌های گیت دور می‌ماند، روال واقعی است. یک روز کاری معمولی این‌طور می‌گذرد: صبح git switch main و git pull برای گرفتن آخرین تغییرات؛ ساخت شاخه‌ی تازه برای کار امروز؛ چند commit کوچک در طول روز؛ و عصر git push شاخه برای نگهداری نسخه‌ی پشتیبان. وقتی کار تمام شد، آن را ادغام می‌کنید یا برای بازبینی می‌فرستید.

Bash
git switch main
git pull
git switch -c fix/login-error
# ... کار و commit ...
git push -u origin fix/login-error

اگر وسط کار ناچار شدید به شاخه‌ی دیگری بروید و تغییرات ناتمام دارید، git stash آن‌ها را موقتاً کنار می‌گذارد و git stash pop برمی‌گرداند. این از commit کردن کد نیمه‌کاره بهتر است.

چند دستور مفید برای کاوش#

  • git log --oneline --graph --all: تاریخچه را با شاخه‌ها به‌صورت نمودار متنی نشان می‌دهد.
  • git blame فایل: نشان می‌دهد هر خط را چه کسی و در کدام commit نوشته.
  • git show شناسه: محتوای یک commit را نشان می‌دهد.
  • git diff main..feature/x: تفاوت دو شاخه را نشان می‌دهد.

این دستورها وقتی باگی پیدا کرده‌اید و می‌خواهید بفهمید از کی شروع شده، خیلی کمک می‌کنند. پیام‌های روشن commit همین‌جا ارزش خودشان را نشان می‌دهند.

خلاصه#

  • گیت تاریخچه‌ی پروژه را با commitهای پیام‌دار نگه می‌دارد.
  • مسیر کار: ویرایش، git add، git commit؛ و git status همیشه دوست شماست.
  • برای هر ویژگی یک شاخه بسازید و با git merge به main بیاورید.
  • تعارض را با ویرایش فایل، add و commit حل کنید؛ merge --abort راه برگشت است.
  • .env، رمزها و vendor را در gitignore بگذارید.
  • برای برگرداندن، بین restore، reset و revert فرق بگذارید و دستورهای مخرب را با احتیاط بزنید.