همه یک بار فایلی به اسم index-final-v2-درست.php داشتهایم. گیت این بینظمی را با یک ایدهی ساده حل میکند: هر نقطهی مهم کار را با پیامی ثبت میکند و میتوانید هر وقت خواستید به آن برگردید. روی این ایده، کار گروهی، آزمایش بیخطر و استقرار منظم ساخته شده است.
برای شروع به مفاهیم کمشماری نیاز دارید: مخزن، commit، شاخه و ادغام. با همینها بیشتر کار روزمرهتان راه میافتد.
نصب و تنظیم اولیه#
گیت را از صفحهی رسمی git-scm.com نصب کنید. سپس یکبار نام و ایمیل را تنظیم کنید تا هر commit به نام شما ثبت شود:
git config --global user.name "نام شما"
git config --global user.email "you@example.com"
git config --global init.defaultBranch mainساخت مخزن و اولین commit#
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 در ریشهی پروژه بسازید:
.env
vendor/
node_modules/
storage/logs/
*.log
.DS_Storeفایلهای دارای رمز، مثل .env یا wp-config.php با اطلاعات واقعی، هرگز نباید در مخزن باشند، مخصوصاً اگر آن را جایی عمومی بگذارید. پوشهی vendor هم با Composer قابل بازسازی است؛ در Composer و مدیریت وابستگیها بیشتر توضیح دادهایم.
شاخه یا branch#
شاخه یعنی یک خط جداگانهی کار. میتوانید ویژگی تازه را بدون خرابکردن نسخهی اصلی بسازید:
git switch -c feature/contact-form # ساخت و رفتن به شاخهی تازه
# ... فایلها را ویرایش کنید ...
git add .
git commit -m "ساخت فرم تماس"
git branch # فهرست شاخهها
git switch main # برگشت به شاخهی اصلیقاعدهی عملی: برای هر کار یک شاخه با نام گویا (feature/...، fix/...) بسازید. شاخه ارزان است و هر کار کوچک شاخهی خودش را میخواهد.
ادغام یا merge#
وقتی کار شاخه تمام شد، آن را به شاخهی اصلی بیاورید:
git switch main
git merge feature/contact-form
git branch -d feature/contact-form # حذف شاخهی ادغامشدهاگر در شاخهی main از زمان جدا شدن شاخه تغییری نبوده باشد، گیت فقط اشارهگر را جلو میبرد (fast-forward). اگر هر دو طرف تغییر داشته باشند، یک commit ادغام ساخته میشود.
حل تعارض#
اگر هر دو شاخه یک جای فایل را تغییر داده باشند، گیت میایستد و آن را علامت میزند:
<<<<<<< HEAD
$title = 'تماس با ما';
=======
$title = 'ارتباط با ما';
>>>>>>> feature/contact-formگامهای حل:
- فایل را باز کنید و تصمیم بگیرید کدام نسخه (یا ترکیبی از هر دو) درست است.
- سه خط علامت
<<<<<<<،=======و>>>>>>>را حذف کنید. - با
git addفایل را stage کنید. - با
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 تغییرات ثبتنشده را برای همیشه پاک میکنند. پیش از اجرا مطمئن شوید چه چیزی از دست میرود.
مخزن راهدور#
برای نسخهی پشتیبان و کار گروهی، مخزن را روی سرویسی مثل گیتهاب نگه میدارند:
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 شاخه برای نگهداری نسخهی پشتیبان. وقتی کار تمام شد، آن را ادغام میکنید یا برای بازبینی میفرستید.
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فرق بگذارید و دستورهای مخرب را با احتیاط بزنید.