Git: تفاوت میان نسخه‌ها

از Elina
پرش به ناوبری پرش به جستجو
صفحه‌ای تازه حاوی «Git Git چیست؟ Git یک سیستم کنترل نسخه (Version Control System) است که برای مدیریت تغییرات فایل‌ها و پروژه‌ها استفاده می‌شود. Git به برنامه‌نویسان و تیم‌های توسعه کمک می‌کند تا تغییرات پروژه را ثبت کنند، به نسخه‌های قبلی برگردند و هم‌زمان روی یک پروژه کار...» ایجاد کرد
 
بدون خلاصۀ ویرایش
 
خط ۱: خط ۱:
Git
== گیت (Git) ==
Git چیست؟
'''Git''' یک سیستم کنترل نسخه (Version Control System) است که برای مدیریت تغییرات فایل‌ها و پروژه‌ها استفاده می‌شود. Git به برنامه‌نویسان و تیم‌های توسعه کمک می‌کند تا تغییرات پروژه را ثبت کنند، به نسخه‌های قبلی برگردند و هم‌زمان روی یک پروژه کار کنند.
 
Git یک سیستم کنترل نسخه (Version Control System) است که برای مدیریت تغییرات فایل‌ها و پروژه‌ها استفاده می‌شود. Git به برنامه‌نویسان و تیم‌های توسعه کمک می‌کند تا تغییرات پروژه را ثبت کنند، به نسخه‌های قبلی برگردند و هم‌زمان روی یک پروژه کار کنند.


Git بیشتر در پروژه‌های برنامه‌نویسی، طراحی سایت و توسعه نرم‌افزار استفاده می‌شود.
Git بیشتر در پروژه‌های برنامه‌نویسی، طراحی سایت و توسعه نرم‌افزار استفاده می‌شود.


Git چه کاربردی دارد؟
== Git چه کاربردی دارد؟ ==
 
مهم‌ترین کاربردهای Git عبارت‌اند از:
مهم‌ترین کاربردهای Git عبارت‌اند از:
* ثبت تغییرات فایل‌ها و پروژه
* مشاهده تاریخچه تغییرات
* بازگشت به نسخه‌های قبلی
* ایجاد شاخه‌های مختلف برای توسعه قابلیت‌های جدید
* ادغام تغییرات چند شاخه
* همکاری چند نفر روی یک پروژه
* اتصال پروژه به سرویس‌هایی مانند GitHub، GitLab و Bitbucket
* نگهداری نسخه‌های مختلف یک پروژه


ثبت تغییرات فایل‌ها و پروژه
== مفاهیم اصلی Git ==
مشاهده تاریخچه تغییرات
بازگشت به نسخه‌های قبلی
ایجاد شاخه‌های مختلف برای توسعه قابلیت‌های جدید
ادغام تغییرات چند شاخه
همکاری چند نفر روی یک پروژه
اتصال پروژه به سرویس‌هایی مانند GitHub، GitLab و Bitbucket
نگهداری نسخه‌های مختلف یک پروژه
مفاهیم اصلی 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


=== 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 ===
چه فایل‌هایی برای Commit آماده شده‌اند
چه فایل‌هایی هنوز توسط Git دنبال نمی‌شوند
در حال حاضر روی چه Branchای قرار داریم
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 .
git commit
</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های موجود:
برای مشاهده 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
ارسال تغییرات به Remote
</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


==== git pull ====
برای دریافت تغییرات جدید و ادغام آن‌ها با Branch فعلی:
برای دریافت تغییرات جدید و ادغام آن‌ها با Branch فعلی:


<syntaxhighlight lang="bash">
git pull
git pull
</syntaxhighlight>


یا:
یا:


<syntaxhighlight lang="bash">
git pull origin main
git pull origin main
git fetch
</syntaxhighlight>


==== git fetch ====
برای دریافت اطلاعات و تغییرات Remote بدون ادغام مستقیم آن‌ها:
برای دریافت اطلاعات و تغییرات Remote بدون ادغام مستقیم آن‌ها:


<syntaxhighlight lang="bash">
git fetch
git fetch
</syntaxhighlight>


تفاوت مهم این دو دستور این است که fetch تغییرات را دریافت می‌کند ولی آن‌ها را به Branch فعلی Merge نمی‌کند؛ در حالی که pull معمولاً دریافت و ادغام تغییرات را با هم انجام می‌دهد.
تفاوت مهم این دو دستور این است که fetch تغییرات را دریافت می‌کند ولی آن‌ها را به Branch فعلی Merge نمی‌کند؛ در حالی که pull معمولاً دریافت و ادغام تغییرات را با هم انجام می‌دهد.


برگرداندن تغییرات
== برگرداندن تغییرات ==
git restore


=== 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
git revert
</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 به‌خصوص در حالت‌های پیشرفته باید با دقت استفاده شود.


مشاهده تفاوت تغییرات
== مشاهده تفاوت تغییرات ==
git diff
 
برای مشاهده تغییراتی که هنوز 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> نادیده گرفته می‌شوند.


پوشه node_modules نادیده گرفته می‌شود.
== دستورات مهم Git در یک جدول ==
فایل .env نادیده گرفته می‌شود.
{| class="wikitable"
فایل‌های دارای پسوند .log نادیده گرفته می‌شوند.
! دستور !! کاربرد
دستورات مهم 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 یکی نیستند.
 
Git یک سیستم کنترل نسخه است که روی کامپیوتر اجرا می‌شود.


GitHub یک سرویس آنلاین برای میزبانی Repositoryهای Git و همکاری روی پروژه‌هاست.
* '''Git''' یک سیستم کنترل نسخه است که روی کامپیوتر اجرا می‌شود.
* '''GitHub''' یک سرویس آنلاین برای میزبانی Repositoryهای Git و همکاری روی پروژه‌هاست.


به زبان ساده:
به زبان ساده:
* '''Git''' = مدیریت نسخه‌ها
* '''GitHub''' = میزبانی و همکاری آنلاین


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 برای ترکیب تغییرات یک 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 = میزبانی و همکاری آنلاین