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

از shakiba
پرش به ناوبری پرش به جستجو
صفحه‌ای تازه حاوی «= گیت (Git) = این صفحه یادداشت‌های مروری دربارهٔ کار با گیت است. هدف: یادگیری، مرور سریع و داشتن یک مرجع از دستورات و الگوهای پرکاربرد. == چرا گیت مهم است؟ == * سیستم نسخه‌ی توزیع‌شده * ذخیرهٔ تاریخچهٔ تغییرات * همکاری گروهی و بازگشت آسان به_states_ * ش...» ایجاد کرد
 
بدون خلاصۀ ویرایش
 
(۲ نسخهٔ میانیِ ایجادشده توسط همین کاربر نشان داده نشد)
خط ۱: خط ۱:
= گیت (Git) =
== Git چیست؟ ==


این صفحه یادداشت‌های مروری دربارهٔ کار با گیت است.
'''Git''' یک سیستم کنترل نسخه (Version Control System) توزیع‌شده است که برای ردیابی تغییرات در فایل‌ها و هماهنگی کار بین چند نفر روی یک پروژه استفاده می‌شود. با Git می‌توان تاریخچهٔ کامل تغییرات یک پروژه را نگه داشت، به نسخه‌های قبلی بازگشت، و به‌صورت هم‌زمان با دیگران روی بخش‌های مختلف یک پروژه کار کرد.
هدف: یادگیری، مرور سریع و داشتن یک مرجع از دستورات و الگوهای پرکاربرد.


== چرا گیت مهم است؟ ==
== مفاهیم پایه ==
 
* '''Repository (مخزن)''': پوشه‌ای که Git تاریخچهٔ تغییرات آن را ردیابی می‌کند.
* '''Working Directory''': فایل‌های واقعی روی سیستم که در حال ویرایش آن‌ها هستید.
* '''Staging Area (Index)''': فضای واسط بین Working Directory و مخزن؛ فایل‌هایی که آماده‌ی ثبت (commit) هستند.
* '''Commit''': یک نقطهٔ ذخیرهٔ دائمی در تاریخچهٔ پروژه، مثل عکس لحظه‌ای از وضعیت فایل‌ها.
* '''Branch (شاخه)''': یک مسیر جداگانه برای توسعه، بدون تأثیر روی نسخهٔ اصلی.
* '''HEAD''': اشاره‌گری به آخرین commit در شاخه‌ای که در حال حاضر روی آن هستید.
* '''Merge''': ترکیب کردن تغییرات دو شاخه با هم.
* '''Remote''': نسخه‌ای از مخزن که روی یک سرور (مثل GitHub، GitLab) قرار دارد.
* '''Clone''': کپی کامل یک مخزن از راه دور روی سیستم شما.
 
== نصب و تنظیمات اولیه ==
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! توضیح !! دستور
|-
| بررسی نصب بودن Git و نسخهٔ آن || <code style="direction:ltr; display:inline-block;">git --version</code>
|-
| تنظیم نام کاربری (سراسری) || <code style="direction:ltr; display:inline-block;">git config --global user.name "نام شما"</code>
|-
| تنظیم ایمیل (سراسری) || <code style="direction:ltr; display:inline-block;">git config --global user.email "email@example.com"</code>
|-
| مشاهدهٔ تمام تنظیمات فعلی || <code style="direction:ltr; display:inline-block;">git config --list</code>
|}
 
== شروع کار ==
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! توضیح !! دستور
|-
| ساخت یک مخزن جدید در پوشهٔ فعلی || <code style="direction:ltr; display:inline-block;">git init</code>
|-
| کپی کردن یک مخزن از راه دور || <code style="direction:ltr; display:inline-block;">git clone [آدرس]</code>
|-
| کپی کردن مخزن در یک پوشهٔ مشخص || <code style="direction:ltr; display:inline-block;">git clone [آدرس] [نام پوشه]</code>
|}


* سیستم نسخه‌ی توزیع‌شده
== ثبت تغییرات ==
* ذخیرهٔ تاریخچهٔ تغییرات
{| class="wikitable" style="direction:rtl; width:100%;"
* همکاری گروهی و بازگشت آسان به_states_
|-
* شاخه‌بندی و ترکیب تغییرات
! توضیح !! دستور
* پایهٔ بسیاری از جریان‌های توسعه نرم‌افزار
|-
| نمایش وضعیت فایل‌ها || <code style="direction:ltr; display:inline-block;">git status</code>
|-
| اضافه کردن فایل به staging area || <code style="direction:ltr; display:inline-block;">git add [نام فایل]</code>
|-
| اضافه کردن همهٔ فایل‌های تغییر یافته || <code style="direction:ltr; display:inline-block;">git add .</code>
|-
| ثبت یک commit با توضیح || <code style="direction:ltr; display:inline-block;">git commit -m "پیام"</code>
|-
| اضافه کردن و ثبت هم‌زمان (فایل‌های ردیابی‌شده) || <code style="direction:ltr; display:inline-block;">git commit -am "پیام"</code>
|-
| اصلاح آخرین commit || <code style="direction:ltr; display:inline-block;">git commit --amend</code>
|}


== نصب و تنظیم اولیه ==
== مشاهدهٔ تاریخچه و تغییرات ==
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! توضیح !! دستور
|-
| نمایش تاریخچهٔ commit‌ها || <code style="direction:ltr; display:inline-block;">git log</code>
|-
| نمایش خلاصه و یک‌خطی تاریخچه || <code style="direction:ltr; display:inline-block;">git log --oneline</code>
|-
| نمایش تفاوت فایل‌های تغییر یافته (قبل از add) || <code style="direction:ltr; display:inline-block;">git diff</code>
|-
| نمایش تفاوت فایل‌های staged || <code style="direction:ltr; display:inline-block;">git diff --staged</code>
|-
| نمایش جزئیات یک commit خاص || <code style="direction:ltr; display:inline-block;">git show [commit-id]</code>
|}


=== نصب ===
== کار با شاخه‌ها (Branch) ==
جهت نصب از مسیر رسمی یا مدیریت بستهٔ سیستم‌عامل استفاده کنید.
{| class="wikitable" style="direction:rtl; width:100%;"
نسخهٔ نصب‌شده را این‌گونه چک کنید:
|-
! توضیح !! دستور
|-
| نمایش لیست شاخه‌ها || <code style="direction:ltr; display:inline-block;">git branch</code>
|-
| ساخت شاخهٔ جدید || <code style="direction:ltr; display:inline-block;">git branch [نام]</code>
|-
| رفتن به یک شاخه || <code style="direction:ltr; display:inline-block;">git checkout [نام]</code>
|-
| رفتن به یک شاخه (روش جدیدتر) || <code style="direction:ltr; display:inline-block;">git switch [نام]</code>
|-
| ساخت و رفتن به شاخهٔ جدید هم‌زمان || <code style="direction:ltr; display:inline-block;">git checkout -b [نام]</code>
|-
| ادغام یک شاخه با شاخهٔ فعلی || <code style="direction:ltr; display:inline-block;">git merge [نام شاخه]</code>
|-
| حذف یک شاخه || <code style="direction:ltr; display:inline-block;">git branch -d [نام]</code>
|-
| حذف اجباری یک شاخهٔ ادغام‌نشده || <code style="direction:ltr; display:inline-block;">git branch -D [نام]</code>
|}


<syntaxhighlight lang="bash">
== کار با ریموت (GitHub و مشابه) ==
git --version
{| class="wikitable" style="direction:rtl; width:100%;"
</syntaxhighlight>
|-
! توضیح !! دستور
|-
| اتصال به مخزن راه دور || <code style="direction:ltr; display:inline-block;">git remote add origin [آدرس]</code>
|-
| نمایش لیست ریموت‌ها || <code style="direction:ltr; display:inline-block;">git remote -v</code>
|-
| ارسال تغییرات به سرور || <code style="direction:ltr; display:inline-block;">git push origin [شاخه]</code>
|-
| ارسال شاخهٔ جدید و تنظیم ردیابی آن || <code style="direction:ltr; display:inline-block;">git push -u origin [شاخه]</code>
|-
| دریافت و ادغام تغییرات از سرور || <code style="direction:ltr; display:inline-block;">git pull origin [شاخه]</code>
|-
| فقط دریافت تغییرات بدون ادغام || <code style="direction:ltr; display:inline-block;">git fetch origin</code>
|}


=== تنظیمات اولیه کاربر ===
== بازگشت و لغو تغییرات ==
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! توضیح !! دستور
|-
| لغو تغییرات یک فایل در Working Directory || <code style="direction:ltr; display:inline-block;">git checkout -- [فایل]</code>
|-
| لغو تغییرات با دستور جدیدتر || <code style="direction:ltr; display:inline-block;">git restore [فایل]</code>
|-
| خارج کردن فایل از staging area || <code style="direction:ltr; display:inline-block;">git reset [فایل]</code>
|-
| بازگشت کامل به یک commit قبلی (خطرناک) || <code style="direction:ltr; display:inline-block;">git reset --hard [commit-id]</code>
|-
| ساخت یک commit جدید که یک commit قبلی را خنثی می‌کند || <code style="direction:ltr; display:inline-block;">git revert [commit-id]</code>
|}


<syntaxhighlight lang="bash">
== Stash (ذخیرهٔ موقت تغییرات) ==
git config --global user.name "نام و نام خانوادگی"
{| class="wikitable" style="direction:rtl; width:100%;"
git config --global user.email "email@example.com"
|-
</syntaxhighlight>
! توضیح !! دستور
|-
| ذخیرهٔ موقت تغییرات فعلی || <code style="direction:ltr; display:inline-block;">git stash</code>
|-
| نمایش لیست stash‌ها || <code style="direction:ltr; display:inline-block;">git stash list</code>
|-
| بازگردانی آخرین stash || <code style="direction:ltr; display:inline-block;">git stash pop</code>
|-
| حذف آخرین stash بدون بازگردانی || <code style="direction:ltr; display:inline-block;">git stash drop</code>
|}


=== مشاهده تنظیمات ===
== برچسب‌گذاری (Tag) ==
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! توضیح !! دستور
|-
| ساخت یک تگ ساده || <code style="direction:ltr; display:inline-block;">git tag [نام]</code>
|-
| ساخت تگ با توضیح || <code style="direction:ltr; display:inline-block;">git tag -a [نام] -m "پیام"</code>
|-
| نمایش لیست تگ‌ها || <code style="direction:ltr; display:inline-block;">git tag</code>
|-
| ارسال تگ‌ها به سرور || <code style="direction:ltr; display:inline-block;">git push origin --tags</code>
|}


<syntaxhighlight lang="bash">
== Rebase و Cherry-pick ==
git config --list
{| class="wikitable" style="direction:rtl; width:100%;"
</syntaxhighlight>
|-
! توضیح !! دستور
|-
| اعمال دوبارهٔ commit‌های شاخهٔ فعلی روی شاخهٔ دیگر || <code style="direction:ltr; display:inline-block;">git rebase [نام شاخه]</code>
|-
| rebase تعاملی برای ویرایش/ترکیب چند commit || <code style="direction:ltr; display:inline-block;">git rebase -i HEAD~[تعداد]</code>
|-
| انتخاب و اعمال یک commit خاص از شاخهٔ دیگر || <code style="direction:ltr; display:inline-block;">git cherry-pick [commit-id]</code>
|}


== مفاهیم پایه ==
== حل تعارض (Merge Conflict) ==
 
وقتی دو شاخه تغییرات متفاوتی روی یک بخش از یک فایل داشته باشند، هنگام merge یا rebase تعارض (conflict) رخ می‌دهد. Git خطوط متعارض را با نشانه‌های زیر در فایل مشخص می‌کند:
 
<pre style="direction:ltr; text-align:left;">
<<<<<<< HEAD
محتوای شاخهٔ فعلی
=======
محتوای شاخهٔ دیگر
>>>>>>> نام-شاخه
</pre>
 
برای حل تعارض باید فایل را به‌صورت دستی ویرایش کرد، نشانه‌ها را حذف کرد و نسخهٔ نهایی را انتخاب نمود، سپس:
 
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! توضیح !! دستور
|-
| اضافه کردن فایل حل‌شده به staging || <code style="direction:ltr; display:inline-block;">git add [فایل]</code>
|-
| ادامهٔ فرآیند merge || <code style="direction:ltr; display:inline-block;">git commit</code>
|-
| ادامهٔ فرآیند rebase بعد از حل تعارض || <code style="direction:ltr; display:inline-block;">git rebase --continue</code>
|-
| لغو کامل عملیات merge || <code style="direction:ltr; display:inline-block;">git merge --abort</code>
|}
 
== فایل .gitignore ==
 
فایل <code style="direction:ltr; display:inline-block;">.gitignore</code> برای مشخص کردن فایل‌ها و پوشه‌هایی است که نباید توسط Git ردیابی شوند (مثل فایل‌های موقت، پوشهٔ <code style="direction:ltr;">node_modules</code>، یا فایل‌های تنظیمات حساس).


* مخزن Repository: محل نگهداری پروژه و تاریخچه
<pre style="direction:ltr; text-align:left;">
* Commit: نقطه ذخیره در تاریخچه
# نمونه محتوای .gitignore
* Branch: خط توسعهٔ مستقل
node_modules/
* Merge / Rebase: ترکیب تغییرات بین شاخه‌ها
.env
* Staging area: محل آماده‌سازی تغییرات قبل از Commit
*.log
* Remote: مخزن دورتر مثل سرویس میزبانی
.DS_Store
</pre>


== دستورات پرکاربرد ==
== نکات و بهترین شیوه‌ها ==


=== شروع پروژه ===
* پیام commit‌ها را کوتاه، واضح و توصیفی بنویسید.
* هر commit باید یک تغییر منطقی و مستقل را نشان دهد، نه چند تغییر نامرتبط با هم.
* قبل از push کردن، همیشه با <code style="direction:ltr;">git pull</code> آخرین تغییرات را دریافت کنید.
* از شاخه‌های جداگانه (feature branch) برای هر ویژگی یا رفع باگ استفاده کنید و شاخهٔ اصلی (main/master) را همیشه پایدار نگه دارید.
* پیش از rebase یا reset --hard، مطمئن شوید که تغییرات مهم را از دست نمی‌دهید.


<syntaxhighlight lang="bash">
== GitHub چیست؟ ==
git init
git status
</syntaxhighlight>


=== افزودن و ثبت تغییرات ===
'''GitHub''' یک پلتفرم آنلاین میزبانی مخازن Git است که علاوه بر ذخیرهٔ کد، امکاناتی مثل همکاری تیمی، مدیریت باگ و درخواست، و بررسی کد را فراهم می‌کند. مخزن‌های محلی که با Git می‌سازید را می‌توان روی GitHub آپلود (push) کرد تا دیگران هم بتوانند به آن دسترسی داشته باشند یا در توسعهٔ آن مشارکت کنند.


<syntaxhighlight lang="bash">
== مفاهیم پایه در GitHub ==
git add .
git commit -m "توضیح کوتاه از تغییرات"
</syntaxhighlight>


=== بررسی وضعیت و تاریخچه ===
* '''Repository (Repo)''': یک پروژه که روی GitHub میزبانی می‌شود.
* '''Fork''': کپی کردن یک مخزن دیگران به حساب خودتان، برای اعمال تغییرات بدون تأثیر روی نسخهٔ اصلی.
* '''Pull Request (PR)''': درخواست رسمی برای ادغام تغییرات شما با مخزن اصلی؛ معمولاً همراه با بررسی کد توسط دیگران.
* '''Issue''': ثبت باگ، درخواست ویژگی جدید، یا هر بحث مرتبط با پروژه.
* '''Star''': نشان‌دار کردن یک مخزن به‌عنوان علاقه‌مندی یا نشانه‌ای از محبوبیت آن.
* '''Watch''': دریافت اعلان از فعالیت‌های یک مخزن.
* '''README.md''': فایلی که معمولاً توضیحات کلی پروژه (نحوهٔ نصب، استفاده، مشارکت) را در خود دارد و در صفحهٔ اصلی مخزن نمایش داده می‌شود.
* '''GitHub Actions''': ابزار اتوماسیون (CI/CD) برای اجرای خودکار تست‌ها، ساخت پروژه یا استقرار (Deploy) پس از هر push.
* '''Organization''': فضایی برای مدیریت چند مخزن و چند عضو تیم زیر یک نام مشترک.


<syntaxhighlight lang="bash">
== ساخت حساب و مخزن جدید ==
git status
{| class="wikitable" style="direction:rtl; width:100%;"
git log
|-
git log --oneline
! توضیح !! مسیر
</syntaxhighlight>
|-
| ساخت حساب کاربری || از github.com روی Sign up بزنید
|-
| ساخت مخزن جدید || دکمهٔ + بالای صفحه سپس New repository
|-
| انتخاب Public یا Private || هنگام ساخت مخزن مشخص می‌شود؛ Public برای همه قابل‌مشاهده، Private فقط برای اعضای مجاز
|-
| اضافه کردن README هنگام ساخت || تیک گزینهٔ "Add a README file" را در فرم ساخت مخزن بزنید
|}


=== کار با شاخه‌ها ===
== اتصال پروژهٔ محلی به GitHub ==
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! توضیح !! دستور
|-
| اتصال مخزن محلی به یک مخزن خالی روی GitHub || <code style="direction:ltr; display:inline-block;">git remote add origin [آدرس مخزن]</code>
|-
| تغییر نام شاخهٔ اصلی به main (در صورت نیاز) || <code style="direction:ltr; display:inline-block;">git branch -M main</code>
|-
| ارسال اولین نسخه به GitHub || <code style="direction:ltr; display:inline-block;">git push -u origin main</code>
|-
| کلون کردن یک مخزن از GitHub || <code style="direction:ltr; display:inline-block;">git clone [آدرس مخزن]</code>
|}


<syntaxhighlight lang="bash">
== احراز هویت (Authentication) ==
git branch
git branch feature-x
git switch feature-x
git switch main
</syntaxhighlight>


=== کار با مخزن دورتر ===
از سال ۲۰۲۱ به بعد، GitHub دیگر اجازهٔ استفاده از رمز عبور معمولی برای عملیات Git (مثل push) را نمی‌دهد. به‌جای آن باید از یکی از روش‌های زیر استفاده کنید:


<syntaxhighlight lang="bash">
{| class="wikitable" style="direction:rtl; width:100%;"
git remote add origin <آدرس>
|-
git push -u origin main
! روش !! توضیح
git pull
|-
git clone <آدرس>
| Personal Access Token (PAT) || از Settings > Developer settings > Personal access tokens توکن بسازید و به‌جای رمز عبور هنگام push استفاده کنید
</syntaxhighlight>
|-
| SSH Key || یک جفت کلید SSH بسازید و کلید عمومی را در Settings > SSH and GPG keys ثبت کنید تا نیازی به وارد کردن رمز نباشد
|-
| GitHub CLI (gh) || ابزار خط فرمان رسمی گیت‌هاب که احراز هویت را ساده‌تر می‌کند
|}


=== مقایسه تغییرات ===
'''ساخت و استفاده از کلید SSH:'''
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! توضیح !! دستور
|-
| ساخت جفت کلید SSH جدید || <code style="direction:ltr; display:inline-block;">ssh-keygen -t ed25519 -C "email@example.com"</code>
|-
| نمایش کلید عمومی برای کپی کردن || <code style="direction:ltr; display:inline-block;">cat ~/.ssh/id_ed25519.pub</code>
|-
| تست اتصال SSH به GitHub || <code style="direction:ltr; display:inline-block;">ssh -T git@github.com</code>
|-
| استفاده از آدرس SSH به‌جای HTTPS برای ریموت || <code style="direction:ltr; display:inline-block;">git remote set-url origin git@github.com:username/repo.git</code>
|}


<syntaxhighlight lang="bash">
== جریان کار Fork و Pull Request ==
git diff
git diff --staged
</syntaxhighlight>


== روند کاری ساده ==
روش معمول مشارکت در پروژه‌های دیگران روی GitHub:


۱. برای کار جدید یک شاخه جدید باز کنید.
# روی دکمهٔ '''Fork''' در صفحهٔ مخزن اصلی بزنید تا یک کپی از آن به حساب شما اضافه شود.
۲. تغییرات را stage کنید.
# نسخهٔ fork‌شده را روی سیستم خودتان clone کنید.
۳. یک Commit با پیام مشخص بزنید.
# یک شاخهٔ جدید بسازید و تغییرات موردنظر را اعمال و commit کنید.
۴. تغییرات را به مخزن دورتر بفرستید یا با تیم همگام شوید.
# تغییرات را به fork خودتان روی GitHub push کنید.
۵. در صورت نیاز، Merge یا Rebase را در شاخهٔ اصلی انجام دهید.
# از صفحهٔ مخزن، دکمهٔ '''New Pull Request''' را بزنید تا درخواست ادغام تغییرات به مخزن اصلی ارسال شود.
# مالک مخزن اصلی تغییرات را بررسی می‌کند و در صورت تأیید، آن را merge می‌کند.


== عادات خوب ==
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! توضیح !! دستور
|-
| اضافه کردن مخزن اصلی به‌عنوان یک ریموت دوم (برای هماهنگی با آپدیت‌های اصلی) || <code style="direction:ltr; display:inline-block;">git remote add upstream [آدرس مخزن اصلی]</code>
|-
| دریافت آخرین تغییرات مخزن اصلی || <code style="direction:ltr; display:inline-block;">git fetch upstream</code>
|-
| ادغام تغییرات مخزن اصلی با شاخهٔ فعلی || <code style="direction:ltr; display:inline-block;">git merge upstream/main</code>
|}


* پیام Commit واضح و کوتاه باشد.
== مدیریت Issue و پروژه ==
* Commit‌های بزرگ را به قطعات کوچک‌تر بشکنید.
{| class="wikitable" style="direction:rtl; width:100%;"
* قبل از Push، Status و Diff را چک کنید.
|-
* به‌جای کار مستقیم روی شاخه اصلی، از شاخه‌های کار específica استفاده کنید.
! توضیح !! مسیر
|-
| ثبت یک Issue جدید || تب Issues در صفحهٔ مخزن، سپس New issue
|-
| اتصال یک Pull Request به یک Issue (بستن خودکار آن) || در توضیح PR بنویسید <code style="direction:ltr;">Closes #شماره‌ایشو</code>
|-
| استفاده از برچسب (Label) برای دسته‌بندی Issue‌ها || داخل صفحهٔ هر Issue، بخش Labels
|-
| مدیریت وظایف با تخته‌ی کانبان || تب Projects در صفحهٔ مخزن یا سازمان
|}


== ادامه و ارتباط با صفحات دیگر ==
== فایل‌های مهم در یک مخزن GitHub ==
{| class="wikitable" style="direction:rtl; width:100%;"
|-
! فایل !! کاربرد
|-
| <code style="direction:ltr;">README.md</code> || توضیح کلی پروژه، نحوهٔ نصب و استفاده
|-
| <code style="direction:ltr;">.gitignore</code> || مشخص کردن فایل‌هایی که نباید ردیابی شوند
|-
| <code style="direction:ltr;">LICENSE</code> || مجوز استفاده و توزیع پروژه
|-
| <code style="direction:ltr;">.github/workflows/</code> || فایل‌های تنظیمات GitHub Actions برای اجرای خودکار CI/CD
|-
| <code style="direction:ltr;">CONTRIBUTING.md</code> || راهنمای نحوهٔ مشارکت در پروژه برای دیگران
|}


* [[:WordPress|آشنایی با وردپرس]]
== نکات و بهترین شیوه‌ها (GitHub) ==
* [[:CMD|خط فرمان و CMD]]
* [[:Prompt-Engineering|پرامپت‌نویسی]]


[[دسته‌بندی:یادگیری]]
* همیشه یک فایل README واضح و کامل برای پروژه بنویسید تا دیگران سریع بفهمند پروژه چیست و چطور استفاده می‌شود.
[[دسته‌بندی:گیت]]
* برای پروژه‌های عمومی، یک فایل LICENSE مناسب انتخاب کنید تا شرایط استفاده از کد مشخص باشد.
* از SSH به‌جای HTTPS برای اتصال استفاده کنید تا نیازی به وارد کردن توکن در هر push نباشد.
* برای هر ویژگی یا رفع باگ، یک شاخهٔ جداگانه بسازید و از طریق Pull Request به شاخهٔ اصلی merge کنید، نه push مستقیم.
* توضیحات Pull Request و Commit را واضح بنویسید تا بررسی کد برای دیگران ساده‌تر باشد.
* از قابلیت GitHub Actions برای اجرای خودکار تست‌ها پیش از merge استفاده کنید تا کیفیت کد حفظ شود.

نسخهٔ کنونی تا ۶ سپتامبر ۲۰۲۶، ساعت ۰۷:۲۷

Git چیست؟

Git یک سیستم کنترل نسخه (Version Control System) توزیع‌شده است که برای ردیابی تغییرات در فایل‌ها و هماهنگی کار بین چند نفر روی یک پروژه استفاده می‌شود. با Git می‌توان تاریخچهٔ کامل تغییرات یک پروژه را نگه داشت، به نسخه‌های قبلی بازگشت، و به‌صورت هم‌زمان با دیگران روی بخش‌های مختلف یک پروژه کار کرد.

مفاهیم پایه

  • Repository (مخزن): پوشه‌ای که Git تاریخچهٔ تغییرات آن را ردیابی می‌کند.
  • Working Directory: فایل‌های واقعی روی سیستم که در حال ویرایش آن‌ها هستید.
  • Staging Area (Index): فضای واسط بین Working Directory و مخزن؛ فایل‌هایی که آماده‌ی ثبت (commit) هستند.
  • Commit: یک نقطهٔ ذخیرهٔ دائمی در تاریخچهٔ پروژه، مثل عکس لحظه‌ای از وضعیت فایل‌ها.
  • Branch (شاخه): یک مسیر جداگانه برای توسعه، بدون تأثیر روی نسخهٔ اصلی.
  • HEAD: اشاره‌گری به آخرین commit در شاخه‌ای که در حال حاضر روی آن هستید.
  • Merge: ترکیب کردن تغییرات دو شاخه با هم.
  • Remote: نسخه‌ای از مخزن که روی یک سرور (مثل GitHub، GitLab) قرار دارد.
  • Clone: کپی کامل یک مخزن از راه دور روی سیستم شما.

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

توضیح دستور
بررسی نصب بودن Git و نسخهٔ آن git --version
تنظیم نام کاربری (سراسری) git config --global user.name "نام شما"
تنظیم ایمیل (سراسری) git config --global user.email "email@example.com"
مشاهدهٔ تمام تنظیمات فعلی git config --list

شروع کار

توضیح دستور
ساخت یک مخزن جدید در پوشهٔ فعلی git init
کپی کردن یک مخزن از راه دور git clone [آدرس]
کپی کردن مخزن در یک پوشهٔ مشخص git clone [آدرس] [نام پوشه]

ثبت تغییرات

توضیح دستور
نمایش وضعیت فایل‌ها git status
اضافه کردن فایل به staging area git add [نام فایل]
اضافه کردن همهٔ فایل‌های تغییر یافته git add .
ثبت یک commit با توضیح git commit -m "پیام"
اضافه کردن و ثبت هم‌زمان (فایل‌های ردیابی‌شده) git commit -am "پیام"
اصلاح آخرین commit git commit --amend

مشاهدهٔ تاریخچه و تغییرات

توضیح دستور
نمایش تاریخچهٔ commit‌ها git log
نمایش خلاصه و یک‌خطی تاریخچه git log --oneline
نمایش تفاوت فایل‌های تغییر یافته (قبل از add) git diff
نمایش تفاوت فایل‌های staged git diff --staged
نمایش جزئیات یک commit خاص git show [commit-id]

کار با شاخه‌ها (Branch)

توضیح دستور
نمایش لیست شاخه‌ها git branch
ساخت شاخهٔ جدید git branch [نام]
رفتن به یک شاخه git checkout [نام]
رفتن به یک شاخه (روش جدیدتر) git switch [نام]
ساخت و رفتن به شاخهٔ جدید هم‌زمان git checkout -b [نام]
ادغام یک شاخه با شاخهٔ فعلی git merge [نام شاخه]
حذف یک شاخه git branch -d [نام]
حذف اجباری یک شاخهٔ ادغام‌نشده git branch -D [نام]

کار با ریموت (GitHub و مشابه)

توضیح دستور
اتصال به مخزن راه دور git remote add origin [آدرس]
نمایش لیست ریموت‌ها git remote -v
ارسال تغییرات به سرور git push origin [شاخه]
ارسال شاخهٔ جدید و تنظیم ردیابی آن git push -u origin [شاخه]
دریافت و ادغام تغییرات از سرور git pull origin [شاخه]
فقط دریافت تغییرات بدون ادغام git fetch origin

بازگشت و لغو تغییرات

توضیح دستور
لغو تغییرات یک فایل در Working Directory git checkout -- [فایل]
لغو تغییرات با دستور جدیدتر git restore [فایل]
خارج کردن فایل از staging area git reset [فایل]
بازگشت کامل به یک commit قبلی (خطرناک) git reset --hard [commit-id]
ساخت یک commit جدید که یک commit قبلی را خنثی می‌کند git revert [commit-id]

Stash (ذخیرهٔ موقت تغییرات)

توضیح دستور
ذخیرهٔ موقت تغییرات فعلی git stash
نمایش لیست stash‌ها git stash list
بازگردانی آخرین stash git stash pop
حذف آخرین stash بدون بازگردانی git stash drop

برچسب‌گذاری (Tag)

توضیح دستور
ساخت یک تگ ساده git tag [نام]
ساخت تگ با توضیح git tag -a [نام] -m "پیام"
نمایش لیست تگ‌ها git tag
ارسال تگ‌ها به سرور git push origin --tags

Rebase و Cherry-pick

توضیح دستور
اعمال دوبارهٔ commit‌های شاخهٔ فعلی روی شاخهٔ دیگر git rebase [نام شاخه]
rebase تعاملی برای ویرایش/ترکیب چند commit git rebase -i HEAD~[تعداد]
انتخاب و اعمال یک commit خاص از شاخهٔ دیگر git cherry-pick [commit-id]

حل تعارض (Merge Conflict)

وقتی دو شاخه تغییرات متفاوتی روی یک بخش از یک فایل داشته باشند، هنگام merge یا rebase تعارض (conflict) رخ می‌دهد. Git خطوط متعارض را با نشانه‌های زیر در فایل مشخص می‌کند:

<<<<<<< HEAD
محتوای شاخهٔ فعلی
=======
محتوای شاخهٔ دیگر
>>>>>>> نام-شاخه

برای حل تعارض باید فایل را به‌صورت دستی ویرایش کرد، نشانه‌ها را حذف کرد و نسخهٔ نهایی را انتخاب نمود، سپس:

توضیح دستور
اضافه کردن فایل حل‌شده به staging git add [فایل]
ادامهٔ فرآیند merge git commit
ادامهٔ فرآیند rebase بعد از حل تعارض git rebase --continue
لغو کامل عملیات merge git merge --abort

فایل .gitignore

فایل .gitignore برای مشخص کردن فایل‌ها و پوشه‌هایی است که نباید توسط Git ردیابی شوند (مثل فایل‌های موقت، پوشهٔ node_modules، یا فایل‌های تنظیمات حساس).

# نمونه محتوای .gitignore
node_modules/
.env
*.log
.DS_Store

نکات و بهترین شیوه‌ها

  • پیام commit‌ها را کوتاه، واضح و توصیفی بنویسید.
  • هر commit باید یک تغییر منطقی و مستقل را نشان دهد، نه چند تغییر نامرتبط با هم.
  • قبل از push کردن، همیشه با git pull آخرین تغییرات را دریافت کنید.
  • از شاخه‌های جداگانه (feature branch) برای هر ویژگی یا رفع باگ استفاده کنید و شاخهٔ اصلی (main/master) را همیشه پایدار نگه دارید.
  • پیش از rebase یا reset --hard، مطمئن شوید که تغییرات مهم را از دست نمی‌دهید.

GitHub چیست؟

GitHub یک پلتفرم آنلاین میزبانی مخازن Git است که علاوه بر ذخیرهٔ کد، امکاناتی مثل همکاری تیمی، مدیریت باگ و درخواست، و بررسی کد را فراهم می‌کند. مخزن‌های محلی که با Git می‌سازید را می‌توان روی GitHub آپلود (push) کرد تا دیگران هم بتوانند به آن دسترسی داشته باشند یا در توسعهٔ آن مشارکت کنند.

مفاهیم پایه در GitHub

  • Repository (Repo): یک پروژه که روی GitHub میزبانی می‌شود.
  • Fork: کپی کردن یک مخزن دیگران به حساب خودتان، برای اعمال تغییرات بدون تأثیر روی نسخهٔ اصلی.
  • Pull Request (PR): درخواست رسمی برای ادغام تغییرات شما با مخزن اصلی؛ معمولاً همراه با بررسی کد توسط دیگران.
  • Issue: ثبت باگ، درخواست ویژگی جدید، یا هر بحث مرتبط با پروژه.
  • Star: نشان‌دار کردن یک مخزن به‌عنوان علاقه‌مندی یا نشانه‌ای از محبوبیت آن.
  • Watch: دریافت اعلان از فعالیت‌های یک مخزن.
  • README.md: فایلی که معمولاً توضیحات کلی پروژه (نحوهٔ نصب، استفاده، مشارکت) را در خود دارد و در صفحهٔ اصلی مخزن نمایش داده می‌شود.
  • GitHub Actions: ابزار اتوماسیون (CI/CD) برای اجرای خودکار تست‌ها، ساخت پروژه یا استقرار (Deploy) پس از هر push.
  • Organization: فضایی برای مدیریت چند مخزن و چند عضو تیم زیر یک نام مشترک.

ساخت حساب و مخزن جدید

توضیح مسیر
ساخت حساب کاربری از github.com روی Sign up بزنید
ساخت مخزن جدید دکمهٔ + بالای صفحه سپس New repository
انتخاب Public یا Private هنگام ساخت مخزن مشخص می‌شود؛ Public برای همه قابل‌مشاهده، Private فقط برای اعضای مجاز
اضافه کردن README هنگام ساخت تیک گزینهٔ "Add a README file" را در فرم ساخت مخزن بزنید

اتصال پروژهٔ محلی به GitHub

توضیح دستور
اتصال مخزن محلی به یک مخزن خالی روی GitHub git remote add origin [آدرس مخزن]
تغییر نام شاخهٔ اصلی به main (در صورت نیاز) git branch -M main
ارسال اولین نسخه به GitHub git push -u origin main
کلون کردن یک مخزن از GitHub git clone [آدرس مخزن]

احراز هویت (Authentication)

از سال ۲۰۲۱ به بعد، GitHub دیگر اجازهٔ استفاده از رمز عبور معمولی برای عملیات Git (مثل push) را نمی‌دهد. به‌جای آن باید از یکی از روش‌های زیر استفاده کنید:

روش توضیح
Personal Access Token (PAT) از Settings > Developer settings > Personal access tokens توکن بسازید و به‌جای رمز عبور هنگام push استفاده کنید
SSH Key یک جفت کلید SSH بسازید و کلید عمومی را در Settings > SSH and GPG keys ثبت کنید تا نیازی به وارد کردن رمز نباشد
GitHub CLI (gh) ابزار خط فرمان رسمی گیت‌هاب که احراز هویت را ساده‌تر می‌کند

ساخت و استفاده از کلید SSH:

توضیح دستور
ساخت جفت کلید SSH جدید ssh-keygen -t ed25519 -C "email@example.com"
نمایش کلید عمومی برای کپی کردن cat ~/.ssh/id_ed25519.pub
تست اتصال SSH به GitHub ssh -T git@github.com
استفاده از آدرس SSH به‌جای HTTPS برای ریموت git remote set-url origin git@github.com:username/repo.git

جریان کار Fork و Pull Request

روش معمول مشارکت در پروژه‌های دیگران روی GitHub:

  1. روی دکمهٔ Fork در صفحهٔ مخزن اصلی بزنید تا یک کپی از آن به حساب شما اضافه شود.
  2. نسخهٔ fork‌شده را روی سیستم خودتان clone کنید.
  3. یک شاخهٔ جدید بسازید و تغییرات موردنظر را اعمال و commit کنید.
  4. تغییرات را به fork خودتان روی GitHub push کنید.
  5. از صفحهٔ مخزن، دکمهٔ New Pull Request را بزنید تا درخواست ادغام تغییرات به مخزن اصلی ارسال شود.
  6. مالک مخزن اصلی تغییرات را بررسی می‌کند و در صورت تأیید، آن را merge می‌کند.
توضیح دستور
اضافه کردن مخزن اصلی به‌عنوان یک ریموت دوم (برای هماهنگی با آپدیت‌های اصلی) git remote add upstream [آدرس مخزن اصلی]
دریافت آخرین تغییرات مخزن اصلی git fetch upstream
ادغام تغییرات مخزن اصلی با شاخهٔ فعلی git merge upstream/main

مدیریت Issue و پروژه

توضیح مسیر
ثبت یک Issue جدید تب Issues در صفحهٔ مخزن، سپس New issue
اتصال یک Pull Request به یک Issue (بستن خودکار آن) در توضیح PR بنویسید Closes #شماره‌ایشو
استفاده از برچسب (Label) برای دسته‌بندی Issue‌ها داخل صفحهٔ هر Issue، بخش Labels
مدیریت وظایف با تخته‌ی کانبان تب Projects در صفحهٔ مخزن یا سازمان

فایل‌های مهم در یک مخزن GitHub

فایل کاربرد
README.md توضیح کلی پروژه، نحوهٔ نصب و استفاده
.gitignore مشخص کردن فایل‌هایی که نباید ردیابی شوند
LICENSE مجوز استفاده و توزیع پروژه
.github/workflows/ فایل‌های تنظیمات GitHub Actions برای اجرای خودکار CI/CD
CONTRIBUTING.md راهنمای نحوهٔ مشارکت در پروژه برای دیگران

نکات و بهترین شیوه‌ها (GitHub)

  • همیشه یک فایل README واضح و کامل برای پروژه بنویسید تا دیگران سریع بفهمند پروژه چیست و چطور استفاده می‌شود.
  • برای پروژه‌های عمومی، یک فایل LICENSE مناسب انتخاب کنید تا شرایط استفاده از کد مشخص باشد.
  • از SSH به‌جای HTTPS برای اتصال استفاده کنید تا نیازی به وارد کردن توکن در هر push نباشد.
  • برای هر ویژگی یا رفع باگ، یک شاخهٔ جداگانه بسازید و از طریق Pull Request به شاخهٔ اصلی merge کنید، نه push مستقیم.
  • توضیحات Pull Request و Commit را واضح بنویسید تا بررسی کد برای دیگران ساده‌تر باشد.
  • از قابلیت GitHub Actions برای اجرای خودکار تست‌ها پیش از merge استفاده کنید تا کیفیت کد حفظ شود.