Git: تفاوت میان نسخهها
صفحهای تازه حاوی «Git Git چیست؟ Git یک سیستم کنترل نسخه (Version Control System) است که برای مدیریت تغییرات فایلها و پروژهها استفاده میشود. Git به برنامهنویسان و تیمهای توسعه کمک میکند تا تغییرات پروژه را ثبت کنند، به نسخههای قبلی برگردند و همزمان روی یک پروژه کار...» ایجاد کرد |
بدون خلاصۀ ویرایش |
||
| خط ۱: | خط ۱: | ||
Git | == گیت (Git) == | ||
Git | '''Git''' یک سیستم کنترل نسخه (Version Control System) است که برای مدیریت تغییرات فایلها و پروژهها استفاده میشود. Git به برنامهنویسان و تیمهای توسعه کمک میکند تا تغییرات پروژه را ثبت کنند، به نسخههای قبلی برگردند و همزمان روی یک پروژه کار کنند. | ||
Git بیشتر در پروژههای برنامهنویسی، طراحی سایت و توسعه نرمافزار استفاده میشود. | Git بیشتر در پروژههای برنامهنویسی، طراحی سایت و توسعه نرمافزار استفاده میشود. | ||
Git چه کاربردی دارد؟ | == Git چه کاربردی دارد؟ == | ||
مهمترین کاربردهای Git عبارتاند از: | مهمترین کاربردهای Git عبارتاند از: | ||
* ثبت تغییرات فایلها و پروژه | |||
* مشاهده تاریخچه تغییرات | |||
* بازگشت به نسخههای قبلی | |||
* ایجاد شاخههای مختلف برای توسعه قابلیتهای جدید | |||
* ادغام تغییرات چند شاخه | |||
* همکاری چند نفر روی یک پروژه | |||
* اتصال پروژه به سرویسهایی مانند GitHub، GitLab و Bitbucket | |||
* نگهداری نسخههای مختلف یک پروژه | |||
== مفاهیم اصلی Git == | |||
مفاهیم اصلی Git | |||
قبل از یادگیری دستورات Git بهتر است چند مفهوم اصلی را بشناسیم. | قبل از یادگیری دستورات Git بهتر است چند مفهوم اصلی را بشناسیم. | ||
Repository | === Repository === | ||
مخزن یا '''Repository''' محلی است که Git اطلاعات مربوط به پروژه و تاریخچه تغییرات آن را نگهداری میکند. | |||
مخزن یا Repository محلی است که Git اطلاعات مربوط به پروژه و تاریخچه تغییرات آن را نگهداری میکند. | |||
یک Repository میتواند روی کامپیوتر یا روی سرویسهایی مانند GitHub قرار داشته باشد. | یک Repository میتواند روی کامپیوتر یا روی سرویسهایی مانند GitHub قرار داشته باشد. | ||
Commit | === Commit === | ||
هر بار که مجموعهای از تغییرات را در Git ثبت میکنیم، یک '''Commit''' ایجاد میشود. | |||
هر بار که مجموعهای از تغییرات را در Git ثبت میکنیم، یک Commit ایجاد میشود. | |||
هر Commit مانند یک نقطه در تاریخچه پروژه است و میتوان اطلاعات تغییرات انجامشده را در آن مشاهده کرد. | هر Commit مانند یک نقطه در تاریخچه پروژه است و میتوان اطلاعات تغییرات انجامشده را در آن مشاهده کرد. | ||
Branch | === Branch === | ||
'''Branch''' یا شاخه به ما اجازه میدهد بدون تغییر مستقیم نسخه اصلی پروژه، روی یک قابلیت یا تغییر جدید کار کنیم. | |||
Branch یا شاخه به ما اجازه میدهد بدون تغییر مستقیم نسخه اصلی پروژه، روی یک قابلیت یا تغییر جدید کار کنیم. | |||
برای مثال میتوان یک Branch برای توسعه قابلیت جدید و یک Branch برای نسخه اصلی پروژه داشت. | برای مثال میتوان یک Branch برای توسعه قابلیت جدید و یک Branch برای نسخه اصلی پروژه داشت. | ||
Merge | === Merge === | ||
از '''Merge''' برای ترکیب تغییرات یک Branch با Branch دیگر استفاده میشود. | |||
از Merge برای ترکیب تغییرات یک Branch با Branch دیگر استفاده میشود. | |||
Remote | === Remote === | ||
'''Remote''' به یک Repository که در یک محل دیگر، معمولاً روی اینترنت، قرار دارد گفته میشود. | |||
Remote به یک Repository که در یک محل دیگر، معمولاً روی اینترنت، قرار دارد گفته میشود. | |||
برای مثال Repository موجود در GitHub میتواند Remote پروژه محلی ما باشد. | برای مثال Repository موجود در GitHub میتواند Remote پروژه محلی ما باشد. | ||
دستورات پایه Git | == دستورات پایه Git == | ||
=== git init === | |||
برای تبدیل یک پوشه به Repository از دستور زیر استفاده میشود: | برای تبدیل یک پوشه به Repository از دستور زیر استفاده میشود: | ||
<syntaxhighlight lang="bash"> | |||
git init | git init | ||
</syntaxhighlight> | |||
بعد از اجرای این دستور، Git یک پوشه مخفی با نام .git ایجاد میکند. | بعد از اجرای این دستور، Git یک پوشه مخفی با نام <code>.git</code> ایجاد میکند. | ||
این پوشه اطلاعات مربوط به تاریخچه و تنظیمات Repository را نگهداری میکند. | این پوشه اطلاعات مربوط به تاریخچه و تنظیمات Repository را نگهداری میکند. | ||
git status | === git status === | ||
برای مشاهده وضعیت فعلی پروژه استفاده میشود: | برای مشاهده وضعیت فعلی پروژه استفاده میشود: | ||
<syntaxhighlight lang="bash"> | |||
git status | git status | ||
</syntaxhighlight> | |||
این دستور نشان میدهد: | این دستور نشان میدهد: | ||
* چه فایلهایی تغییر کردهاند | |||
* چه فایلهایی برای Commit آماده شدهاند | |||
* چه فایلهایی هنوز توسط Git دنبال نمیشوند | |||
* در حال حاضر روی چه Branch ای قرار داریم | |||
=== git add === | |||
git add | |||
برای اضافه کردن تغییرات به مرحله آمادهسازی (Staging Area) استفاده میشود. | برای اضافه کردن تغییرات به مرحله آمادهسازی (Staging Area) استفاده میشود. | ||
برای اضافه کردن یک فایل: | برای اضافه کردن یک فایل: | ||
<syntaxhighlight lang="bash"> | |||
git add index.html | git add index.html | ||
</syntaxhighlight> | |||
برای اضافه کردن چند فایل: | برای اضافه کردن چند فایل: | ||
<syntaxhighlight lang="bash"> | |||
git add index.html style.css script.js | git add index.html style.css script.js | ||
</syntaxhighlight> | |||
برای اضافه کردن تمام تغییرات: | برای اضافه کردن تمام تغییرات: | ||
<syntaxhighlight lang="bash"> | |||
git add . | git add . | ||
</syntaxhighlight> | |||
=== git commit === | |||
برای ثبت تغییرات آمادهشده در تاریخچه Git استفاده میشود: | برای ثبت تغییرات آمادهشده در تاریخچه Git استفاده میشود: | ||
<syntaxhighlight lang="bash"> | |||
git commit -m "Add homepage" | git commit -m "Add homepage" | ||
</syntaxhighlight> | |||
عبارت داخل -m توضیح کوتاهی درباره تغییرات Commit است. | عبارت داخل <code>-m</code> توضیح کوتاهی درباره تغییرات Commit است. | ||
بهتر است پیام Commit کوتاه، واضح و مرتبط با تغییرات باشد. | بهتر است پیام Commit کوتاه، واضح و مرتبط با تغییرات باشد. | ||
git log | === git log === | ||
برای مشاهده تاریخچه Commitها استفاده میشود: | برای مشاهده تاریخچه Commitها استفاده میشود: | ||
<syntaxhighlight lang="bash"> | |||
git log | git log | ||
</syntaxhighlight> | |||
برای نمایش خلاصهتر: | برای نمایش خلاصهتر: | ||
<syntaxhighlight lang="bash"> | |||
git log --oneline | git log --oneline | ||
</syntaxhighlight> | |||
مثلاً: | مثلاً: | ||
<syntaxhighlight lang="bash"> | |||
a83f21a Add homepage | a83f21a Add homepage | ||
52bc91d Fix navigation | 52bc91d Fix navigation | ||
19ac742 Initial commit | 19ac742 Initial commit | ||
کار با Branch | </syntaxhighlight> | ||
== کار با Branch == | |||
=== مشاهده Branchها === | |||
برای مشاهده Branchهای موجود: | برای مشاهده Branchهای موجود: | ||
<syntaxhighlight lang="bash"> | |||
git branch | git branch | ||
ایجاد Branch جدید | </syntaxhighlight> | ||
=== ایجاد Branch جدید === | |||
<syntaxhighlight lang="bash"> | |||
git branch feature-login | git branch feature-login | ||
</syntaxhighlight> | |||
در این حالت یک Branch جدید ایجاد میشود. | در این حالت یک Branch جدید ایجاد میشود. | ||
تغییر Branch | === تغییر Branch === | ||
<syntaxhighlight lang="bash"> | |||
git switch feature-login | git switch feature-login | ||
</syntaxhighlight> | |||
همچنین در نسخههای قدیمیتر Git میتوان از دستور زیر استفاده کرد: | همچنین در نسخههای قدیمیتر Git میتوان از دستور زیر استفاده کرد: | ||
<syntaxhighlight lang="bash"> | |||
git checkout feature-login | git checkout feature-login | ||
ایجاد و ورود همزمان به Branch | </syntaxhighlight> | ||
=== ایجاد و ورود همزمان به Branch === | |||
<syntaxhighlight lang="bash"> | |||
git switch -c feature-login | git switch -c feature-login | ||
</syntaxhighlight> | |||
این دستور یک Branch جدید ایجاد کرده و بلافاصله وارد آن میشود. | این دستور یک Branch جدید ایجاد کرده و بلافاصله وارد آن میشود. | ||
حذف Branch | === حذف Branch === | ||
<syntaxhighlight lang="bash"> | |||
git branch -d feature-login | git branch -d feature-login | ||
</syntaxhighlight> | |||
اگر Branch هنوز Merge نشده باشد، Git ممکن است از حذف آن جلوگیری کند. | اگر Branch هنوز Merge نشده باشد، Git ممکن است از حذف آن جلوگیری کند. | ||
اتصال Git به GitHub | == اتصال Git به GitHub == | ||
برای اتصال Repository محلی به یک Repository روی GitHub معمولاً ابتدا Remote اضافه میشود: | برای اتصال Repository محلی به یک Repository روی GitHub معمولاً ابتدا Remote اضافه میشود: | ||
<syntaxhighlight lang="bash"> | |||
git remote add origin https://github.com/USERNAME/REPOSITORY.git | git remote add origin https://github.com/USERNAME/REPOSITORY.git | ||
</syntaxhighlight> | |||
برای مشاهده Remoteهای موجود: | برای مشاهده Remoteهای موجود: | ||
<syntaxhighlight lang="bash"> | |||
git remote -v | git remote -v | ||
</syntaxhighlight> | |||
=== ارسال تغییرات به Remote === | |||
برای ارسال Branch به Repository آنلاین: | برای ارسال Branch به Repository آنلاین: | ||
<syntaxhighlight lang="bash"> | |||
git push origin main | git push origin main | ||
</syntaxhighlight> | |||
در بسیاری از پروژهها Branch اصلی با نام main است. | در بسیاری از پروژهها Branch اصلی با نام main است. | ||
| خط ۱۵۹: | خط ۱۸۵: | ||
برای اینکه Branch محلی برای Pushهای بعدی به Remote متصل شود: | برای اینکه Branch محلی برای Pushهای بعدی به Remote متصل شود: | ||
<syntaxhighlight lang="bash"> | |||
git push -u origin main | git push -u origin main | ||
</syntaxhighlight> | |||
پس از تنظیم اولیه، معمولاً میتوان از: | پس از تنظیم اولیه، معمولاً میتوان از: | ||
<syntaxhighlight lang="bash"> | |||
git push | git push | ||
</syntaxhighlight> | |||
استفاده کرد. | استفاده کرد. | ||
دریافت تغییرات از Remote | === دریافت تغییرات از Remote === | ||
==== git pull ==== | |||
برای دریافت تغییرات جدید و ادغام آنها با Branch فعلی: | برای دریافت تغییرات جدید و ادغام آنها با Branch فعلی: | ||
<syntaxhighlight lang="bash"> | |||
git pull | git pull | ||
</syntaxhighlight> | |||
یا: | یا: | ||
<syntaxhighlight lang="bash"> | |||
git pull origin main | git pull origin main | ||
</syntaxhighlight> | |||
==== git fetch ==== | |||
برای دریافت اطلاعات و تغییرات Remote بدون ادغام مستقیم آنها: | برای دریافت اطلاعات و تغییرات Remote بدون ادغام مستقیم آنها: | ||
<syntaxhighlight lang="bash"> | |||
git fetch | git fetch | ||
</syntaxhighlight> | |||
تفاوت مهم این دو دستور این است که fetch تغییرات را دریافت میکند ولی آنها را به Branch فعلی Merge نمیکند؛ در حالی که pull معمولاً دریافت و ادغام تغییرات را با هم انجام میدهد. | تفاوت مهم این دو دستور این است که fetch تغییرات را دریافت میکند ولی آنها را به Branch فعلی Merge نمیکند؛ در حالی که pull معمولاً دریافت و ادغام تغییرات را با هم انجام میدهد. | ||
برگرداندن تغییرات | == برگرداندن تغییرات == | ||
=== git restore === | |||
اگر فایلی را تغییر دادهای ولی هنوز آن را Commit نکردهای، میتوانی تغییرات آن را کنار بگذاری: | اگر فایلی را تغییر دادهای ولی هنوز آن را Commit نکردهای، میتوانی تغییرات آن را کنار بگذاری: | ||
<syntaxhighlight lang="bash"> | |||
git restore index.html | git restore index.html | ||
</syntaxhighlight> | |||
برای خارج کردن یک فایل از Staging Area: | برای خارج کردن یک فایل از Staging Area: | ||
<syntaxhighlight lang="bash"> | |||
git restore --staged index.html | git restore --staged index.html | ||
</syntaxhighlight> | |||
=== git revert === | |||
برای ایجاد یک Commit جدید که اثر یک Commit قبلی را برعکس میکند: | برای ایجاد یک Commit جدید که اثر یک Commit قبلی را برعکس میکند: | ||
<syntaxhighlight lang="bash"> | |||
git revert COMMIT_ID | git revert COMMIT_ID | ||
</syntaxhighlight> | |||
این روش معمولاً برای برگرداندن تغییرات در پروژههایی که تاریخچه آنها به اشتراک گذاشته شده مناسبتر است. | این روش معمولاً برای برگرداندن تغییرات در پروژههایی که تاریخچه آنها به اشتراک گذاشته شده مناسبتر است. | ||
git reset | === git reset === | ||
'''git reset''' میتواند HEAD و وضعیت Staging را تغییر دهد. | |||
git reset میتواند HEAD و وضعیت Staging را تغییر دهد. | |||
برای مثال: | برای مثال: | ||
<syntaxhighlight lang="bash"> | |||
git reset HEAD~1 | git reset HEAD~1 | ||
</syntaxhighlight> | |||
این دستور آخرین Commit را از حالت Commit خارج میکند، در حالی که تغییرات فایلها باقی میمانند. | این دستور آخرین Commit را از حالت Commit خارج میکند، در حالی که تغییرات فایلها باقی میمانند. | ||
| خط ۲۱۵: | خط ۲۵۸: | ||
دستور reset بهخصوص در حالتهای پیشرفته باید با دقت استفاده شود. | دستور reset بهخصوص در حالتهای پیشرفته باید با دقت استفاده شود. | ||
مشاهده تفاوت تغییرات | == مشاهده تفاوت تغییرات == | ||
برای مشاهده تغییراتی که هنوز Commit نشدهاند: | برای مشاهده تغییراتی که هنوز Commit نشدهاند: | ||
<syntaxhighlight lang="bash"> | |||
git diff | git diff | ||
</syntaxhighlight> | |||
برای مشاهده تفاوت بین دو Commit: | برای مشاهده تفاوت بین دو Commit: | ||
<syntaxhighlight lang="bash"> | |||
git diff COMMIT1 COMMIT2 | git diff COMMIT1 COMMIT2 | ||
</syntaxhighlight> | |||
== کار با فایلهای نادیده گرفتهشده == | |||
گاهی نمیخواهیم بعضی فایلها وارد Repository شوند. | گاهی نمیخواهیم بعضی فایلها وارد Repository شوند. | ||
برای این کار از فایل | برای این کار از فایل <code>.gitignore</code> استفاده میشود. | ||
.gitignore | |||
استفاده میشود. | |||
برای مثال: | برای مثال: | ||
<syntaxhighlight lang="bash"> | |||
node_modules/ | node_modules/ | ||
.env | .env | ||
*.log | *.log | ||
</syntaxhighlight> | |||
در این مثال: | در این مثال: | ||
* پوشه <code>node_modules</code> نادیده گرفته میشود. | |||
* فایل <code>.env</code> نادیده گرفته میشود. | |||
* فایلهای دارای پسوند <code>.log</code> نادیده گرفته میشوند. | |||
== دستورات مهم Git در یک جدول == | |||
{| class="wikitable" | |||
! دستور !! کاربرد | |||
دستورات مهم Git در یک جدول | |- | ||
دستور کاربرد | | <code>git init</code> || ایجاد Repository | ||
git init ایجاد Repository | |- | ||
git status مشاهده وضعیت پروژه | | <code>git status</code> || مشاهده وضعیت پروژه | ||
git add اضافه کردن تغییرات به Staging | |- | ||
git commit ثبت تغییرات | | <code>git add</code> || اضافه کردن تغییرات به Staging | ||
git log مشاهده تاریخچه | |- | ||
git branch مدیریت Branchها | | <code>git commit</code> || ثبت تغییرات | ||
git switch تغییر Branch | |- | ||
git merge ادغام Branchها | | <code>git log</code> || مشاهده تاریخچه | ||
git remote مدیریت Remote | |- | ||
git clone کپی کردن یک Repository | | <code>git branch</code> || مدیریت Branchها | ||
git push ارسال تغییرات به Remote | |- | ||
git pull دریافت و ادغام تغییرات | | <code>git switch</code> || تغییر Branch | ||
git fetch دریافت اطلاعات Remote بدون Merge | |- | ||
git diff مشاهده تفاوت تغییرات | | <code>git merge</code> || ادغام Branchها | ||
git restore برگرداندن تغییرات فایل | |- | ||
git revert معکوس کردن یک Commit | | <code>git remote</code> || مدیریت Remote | ||
git reset تغییر وضعیت Commit/Stage | |- | ||
git tag ایجاد Tag برای نسخهها | | <code>git clone</code> || کپی کردن یک Repository | ||
|- | |||
| <code>git push</code> || ارسال تغییرات به Remote | |||
|- | |||
| <code>git pull</code> || دریافت و ادغام تغییرات | |||
|- | |||
| <code>git fetch</code> || دریافت اطلاعات Remote بدون Merge | |||
|- | |||
| <code>git diff</code> || مشاهده تفاوت تغییرات | |||
|- | |||
| <code>git restore</code> || برگرداندن تغییرات فایل | |||
|- | |||
| <code>git revert</code> || معکوس کردن یک Commit | |||
|- | |||
| <code>git reset</code> || تغییر وضعیت Commit/Stage | |||
|- | |||
| <code>git tag</code> || ایجاد Tag برای نسخهها | |||
|} | |||
== یک مثال عملی == | |||
فرض کنید یک سایت HTML ساختهایم و میخواهیم آن را با Git مدیریت کنیم. | فرض کنید یک سایت HTML ساختهایم و میخواهیم آن را با Git مدیریت کنیم. | ||
ابتدا وارد پوشه پروژه میشویم: | ابتدا وارد پوشه پروژه میشویم: | ||
<syntaxhighlight lang="bash"> | |||
cd my-website | cd my-website | ||
</syntaxhighlight> | |||
سپس Repository را ایجاد میکنیم: | سپس Repository را ایجاد میکنیم: | ||
<syntaxhighlight lang="bash"> | |||
git init | git init | ||
</syntaxhighlight> | |||
وضعیت پروژه را بررسی میکنیم: | وضعیت پروژه را بررسی میکنیم: | ||
<syntaxhighlight lang="bash"> | |||
git status | git status | ||
</syntaxhighlight> | |||
فایلها را به Staging اضافه میکنیم: | فایلها را به Staging اضافه میکنیم: | ||
<syntaxhighlight lang="bash"> | |||
git add . | git add . | ||
</syntaxhighlight> | |||
اولین Commit را ایجاد میکنیم: | اولین Commit را ایجاد میکنیم: | ||
<syntaxhighlight lang="bash"> | |||
git commit -m "Initial website" | git commit -m "Initial website" | ||
</syntaxhighlight> | |||
حالا اگر فایل index.html را تغییر دهیم، میتوانیم تغییرات را مشاهده کنیم: | حالا اگر فایل index.html را تغییر دهیم، میتوانیم تغییرات را مشاهده کنیم: | ||
<syntaxhighlight lang="bash"> | |||
git diff | git diff | ||
</syntaxhighlight> | |||
سپس تغییرات را ثبت میکنیم: | سپس تغییرات را ثبت میکنیم: | ||
<syntaxhighlight lang="bash"> | |||
git add index.html | git add index.html | ||
git commit -m "Update homepage" | git commit -m "Update homepage" | ||
</syntaxhighlight> | |||
به این ترتیب Git تاریخچه تغییرات سایت را نگهداری میکند. | به این ترتیب Git تاریخچه تغییرات سایت را نگهداری میکند. | ||
روند معمول کار با Git | == روند معمول کار با Git == | ||
در بسیاری از پروژهها روند کار به شکل زیر است: | در بسیاری از پروژهها روند کار به شکل زیر است: | ||
<pre> | |||
تغییر فایلها | تغییر فایلها | ||
↓ | ↓ | ||
| خط ۳۱۴: | خط ۳۹۱: | ||
↓ | ↓ | ||
git push | git push | ||
</pre> | |||
اگر پروژه دارای Repository آنلاین باشد، برای دریافت تغییرات جدید معمولاً ابتدا: | اگر پروژه دارای Repository آنلاین باشد، برای دریافت تغییرات جدید معمولاً ابتدا: | ||
<syntaxhighlight lang="bash"> | |||
git pull | git pull | ||
</syntaxhighlight> | |||
اجرا میشود. | اجرا میشود. | ||
نکته مهم | == نکته مهم == | ||
'''Git و GitHub یکی نیستند.''' | |||
Git و GitHub یکی نیستند. | |||
GitHub یک سرویس آنلاین برای میزبانی Repositoryهای Git و همکاری روی پروژههاست. | * '''Git''' یک سیستم کنترل نسخه است که روی کامپیوتر اجرا میشود. | ||
* '''GitHub''' یک سرویس آنلاین برای میزبانی Repositoryهای Git و همکاری روی پروژههاست. | |||
به زبان ساده: | به زبان ساده: | ||
* '''Git''' = مدیریت نسخهها | |||
* '''GitHub''' = میزبانی و همکاری آنلاین | |||
[[رده:گیت]] | |||
[[رده:ابزارهای توسعهدهنده]] | |||
نسخهٔ کنونی تا ۶ سپتامبر ۲۰۲۶، ساعت ۰۸:۰۷
گیت (Git)
[ویرایش]Git یک سیستم کنترل نسخه (Version Control System) است که برای مدیریت تغییرات فایلها و پروژهها استفاده میشود. Git به برنامهنویسان و تیمهای توسعه کمک میکند تا تغییرات پروژه را ثبت کنند، به نسخههای قبلی برگردند و همزمان روی یک پروژه کار کنند.
Git بیشتر در پروژههای برنامهنویسی، طراحی سایت و توسعه نرمافزار استفاده میشود.
Git چه کاربردی دارد؟
[ویرایش]مهمترین کاربردهای Git عبارتاند از:
- ثبت تغییرات فایلها و پروژه
- مشاهده تاریخچه تغییرات
- بازگشت به نسخههای قبلی
- ایجاد شاخههای مختلف برای توسعه قابلیتهای جدید
- ادغام تغییرات چند شاخه
- همکاری چند نفر روی یک پروژه
- اتصال پروژه به سرویسهایی مانند GitHub، GitLab و Bitbucket
- نگهداری نسخههای مختلف یک پروژه
مفاهیم اصلی Git
[ویرایش]قبل از یادگیری دستورات Git بهتر است چند مفهوم اصلی را بشناسیم.
Repository
[ویرایش]مخزن یا Repository محلی است که Git اطلاعات مربوط به پروژه و تاریخچه تغییرات آن را نگهداری میکند.
یک Repository میتواند روی کامپیوتر یا روی سرویسهایی مانند GitHub قرار داشته باشد.
Commit
[ویرایش]هر بار که مجموعهای از تغییرات را در Git ثبت میکنیم، یک Commit ایجاد میشود.
هر Commit مانند یک نقطه در تاریخچه پروژه است و میتوان اطلاعات تغییرات انجامشده را در آن مشاهده کرد.
Branch
[ویرایش]Branch یا شاخه به ما اجازه میدهد بدون تغییر مستقیم نسخه اصلی پروژه، روی یک قابلیت یا تغییر جدید کار کنیم.
برای مثال میتوان یک Branch برای توسعه قابلیت جدید و یک Branch برای نسخه اصلی پروژه داشت.
Merge
[ویرایش]از Merge برای ترکیب تغییرات یک Branch با Branch دیگر استفاده میشود.
Remote
[ویرایش]Remote به یک Repository که در یک محل دیگر، معمولاً روی اینترنت، قرار دارد گفته میشود.
برای مثال Repository موجود در GitHub میتواند Remote پروژه محلی ما باشد.
دستورات پایه Git
[ویرایش]git init
[ویرایش]برای تبدیل یک پوشه به Repository از دستور زیر استفاده میشود:
git init
بعد از اجرای این دستور، Git یک پوشه مخفی با نام .git ایجاد میکند.
این پوشه اطلاعات مربوط به تاریخچه و تنظیمات Repository را نگهداری میکند.
git status
[ویرایش]برای مشاهده وضعیت فعلی پروژه استفاده میشود:
git status
این دستور نشان میدهد:
- چه فایلهایی تغییر کردهاند
- چه فایلهایی برای Commit آماده شدهاند
- چه فایلهایی هنوز توسط Git دنبال نمیشوند
- در حال حاضر روی چه Branch ای قرار داریم
git add
[ویرایش]برای اضافه کردن تغییرات به مرحله آمادهسازی (Staging Area) استفاده میشود.
برای اضافه کردن یک فایل:
git add index.html
برای اضافه کردن چند فایل:
git add index.html style.css script.js
برای اضافه کردن تمام تغییرات:
git add .
git commit
[ویرایش]برای ثبت تغییرات آمادهشده در تاریخچه Git استفاده میشود:
git commit -m "Add homepage"
عبارت داخل -m توضیح کوتاهی درباره تغییرات Commit است.
بهتر است پیام Commit کوتاه، واضح و مرتبط با تغییرات باشد.
git log
[ویرایش]برای مشاهده تاریخچه Commitها استفاده میشود:
git log
برای نمایش خلاصهتر:
git log --oneline
مثلاً:
a83f21a Add homepage
52bc91d Fix navigation
19ac742 Initial commit
کار با Branch
[ویرایش]مشاهده Branchها
[ویرایش]برای مشاهده Branchهای موجود:
git branch
ایجاد Branch جدید
[ویرایش]git branch feature-login
در این حالت یک Branch جدید ایجاد میشود.
تغییر Branch
[ویرایش]git switch feature-login
همچنین در نسخههای قدیمیتر Git میتوان از دستور زیر استفاده کرد:
git checkout feature-login
ایجاد و ورود همزمان به Branch
[ویرایش]git switch -c feature-login
این دستور یک Branch جدید ایجاد کرده و بلافاصله وارد آن میشود.
حذف Branch
[ویرایش]git branch -d feature-login
اگر Branch هنوز Merge نشده باشد، Git ممکن است از حذف آن جلوگیری کند.
اتصال Git به GitHub
[ویرایش]برای اتصال Repository محلی به یک Repository روی GitHub معمولاً ابتدا Remote اضافه میشود:
git remote add origin https://github.com/USERNAME/REPOSITORY.git
برای مشاهده Remoteهای موجود:
git remote -v
ارسال تغییرات به Remote
[ویرایش]برای ارسال Branch به Repository آنلاین:
git push origin main
در بسیاری از پروژهها Branch اصلی با نام main است.
برای اینکه Branch محلی برای Pushهای بعدی به Remote متصل شود:
git push -u origin main
پس از تنظیم اولیه، معمولاً میتوان از:
git push
استفاده کرد.
دریافت تغییرات از Remote
[ویرایش]git pull
[ویرایش]برای دریافت تغییرات جدید و ادغام آنها با Branch فعلی:
git pull
یا:
git pull origin main
git fetch
[ویرایش]برای دریافت اطلاعات و تغییرات Remote بدون ادغام مستقیم آنها:
git fetch
تفاوت مهم این دو دستور این است که fetch تغییرات را دریافت میکند ولی آنها را به Branch فعلی Merge نمیکند؛ در حالی که pull معمولاً دریافت و ادغام تغییرات را با هم انجام میدهد.
برگرداندن تغییرات
[ویرایش]git restore
[ویرایش]اگر فایلی را تغییر دادهای ولی هنوز آن را Commit نکردهای، میتوانی تغییرات آن را کنار بگذاری:
git restore index.html
برای خارج کردن یک فایل از Staging Area:
git restore --staged index.html
git revert
[ویرایش]برای ایجاد یک Commit جدید که اثر یک Commit قبلی را برعکس میکند:
git revert COMMIT_ID
این روش معمولاً برای برگرداندن تغییرات در پروژههایی که تاریخچه آنها به اشتراک گذاشته شده مناسبتر است.
git reset
[ویرایش]git reset میتواند HEAD و وضعیت Staging را تغییر دهد.
برای مثال:
git reset HEAD~1
این دستور آخرین Commit را از حالت Commit خارج میکند، در حالی که تغییرات فایلها باقی میمانند.
دستور reset بهخصوص در حالتهای پیشرفته باید با دقت استفاده شود.
مشاهده تفاوت تغییرات
[ویرایش]برای مشاهده تغییراتی که هنوز Commit نشدهاند:
git diff
برای مشاهده تفاوت بین دو Commit:
git diff COMMIT1 COMMIT2
کار با فایلهای نادیده گرفتهشده
[ویرایش]گاهی نمیخواهیم بعضی فایلها وارد Repository شوند.
برای این کار از فایل .gitignore استفاده میشود.
برای مثال:
node_modules/
.env
*.log
در این مثال:
- پوشه
node_modulesنادیده گرفته میشود. - فایل
.envنادیده گرفته میشود. - فایلهای دارای پسوند
.logنادیده گرفته میشوند.
دستورات مهم Git در یک جدول
[ویرایش]| دستور | کاربرد |
|---|---|
git init |
ایجاد Repository |
git status |
مشاهده وضعیت پروژه |
git add |
اضافه کردن تغییرات به Staging |
git commit |
ثبت تغییرات |
git log |
مشاهده تاریخچه |
git branch |
مدیریت Branchها |
git switch |
تغییر Branch |
git merge |
ادغام Branchها |
git remote |
مدیریت Remote |
git clone |
کپی کردن یک Repository |
git push |
ارسال تغییرات به Remote |
git pull |
دریافت و ادغام تغییرات |
git fetch |
دریافت اطلاعات Remote بدون Merge |
git diff |
مشاهده تفاوت تغییرات |
git restore |
برگرداندن تغییرات فایل |
git revert |
معکوس کردن یک Commit |
git reset |
تغییر وضعیت Commit/Stage |
git tag |
ایجاد Tag برای نسخهها |
یک مثال عملی
[ویرایش]فرض کنید یک سایت HTML ساختهایم و میخواهیم آن را با Git مدیریت کنیم.
ابتدا وارد پوشه پروژه میشویم:
cd my-website
سپس Repository را ایجاد میکنیم:
git init
وضعیت پروژه را بررسی میکنیم:
git status
فایلها را به Staging اضافه میکنیم:
git add .
اولین Commit را ایجاد میکنیم:
git commit -m "Initial website"
حالا اگر فایل index.html را تغییر دهیم، میتوانیم تغییرات را مشاهده کنیم:
git diff
سپس تغییرات را ثبت میکنیم:
git add index.html
git commit -m "Update homepage"
به این ترتیب Git تاریخچه تغییرات سایت را نگهداری میکند.
روند معمول کار با Git
[ویرایش]در بسیاری از پروژهها روند کار به شکل زیر است:
تغییر فایلها
↓
git status
↓
git add
↓
git commit
↓
git push
اگر پروژه دارای Repository آنلاین باشد، برای دریافت تغییرات جدید معمولاً ابتدا:
git pull
اجرا میشود.
نکته مهم
[ویرایش]Git و GitHub یکی نیستند.
- Git یک سیستم کنترل نسخه است که روی کامپیوتر اجرا میشود.
- GitHub یک سرویس آنلاین برای میزبانی Repositoryهای Git و همکاری روی پروژههاست.
به زبان ساده:
- Git = مدیریت نسخهها
- GitHub = میزبانی و همکاری آنلاین