رفتن به محتوا
بایت

کارگاه گیت

مقدمه و آغاز کار با گیت

در این بخش یاد می‌گیرید که گیت چیست و چه کاربردی دارد. همچنین شروع کار با گیت را یاد می‌گیرید.

چرا گیت؟

گیت چیست؟

گیت یک است که به شما امکان مدیریت و ردیابی تغییرات پروژه را می‌دهد.

مشکلات بدون گیت

  • هماهنگی بین چند برنامه‌نویس سخت است
  • بازگشت به نسخه‌های قبلی مشکل است
  • ادغام تغییرات چند نفر دشوار است
  • از دست دادن کد در صورت خطا

راه‌حل گیت

  • هر نفر یک نسخه کامل از پروژه روی سیستم خود دارد
  • تمام تغییرات در تاریخچه ذخیره می‌شود
  • می‌توانید به هر نسخه قبلی برگردید
  • تغییرات به راحتی با دیگران هماهنگ می‌شود
  • کار گروهی بدون تداخل انجام می‌شود

نصب گیت

دانلود و نصب

برای نصب گیت، به صفحه رسمی نصب گیت مراجعه کنید و نسخه مناسب سیستم‌عامل خود را دانلود کنید.

نصب در سیستم‌عامل‌های مختلف:

  • Windows: فایل exe را از سایت رسمی دانلود و نصب کنید
  • macOS: از Homebrew استفاده کنید: brew install git
  • Linux: از package manager استفاده کنید: sudo apt install git

بررسی نصب

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

git --version

اگر گیت به درستی نصب شده باشد، خروجی مشابه زیر را خواهید دید:

git version 2.52.0

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

قبل از شروع کار با گیت، باید نام کاربری و ایمیل خود را تنظیم کنید. این اطلاعات در کامیت‌ها نمایش داده می‌شوند و برای کار تیمی ضروری است.

از دستور git config --global برای تنظیمات سراسری استفاده می‌کنیم:

git config --global user.name "نام شما"
git config --global user.email "email@example.com"

مشاهده تنظیمات

برای مشاهده تمام تنظیمات گیت خود، از دستور زیر استفاده کنید:

git config --list

فعال‌سازی کلید SSH

کلید SSH برای اتصال امن به سرورهای گیت استفاده می‌شود. در این بخش مراحل راه‌اندازی آن را یاد می‌گیرید.

ایجاد کلید SSH

در ترمینال (یا Git Bash در ویندوز) دستور زیر را اجرا کنید و ۳ بار Enter بزنید:

ssh-keygen

این دستور یک کلید SSH در مسیر ~/.ssh ایجاد می‌کند.

فعال‌سازی SSH Agent

eval `ssh-agent`

اضافه کردن کلید به SSH Agent

macOS:

ssh-add -K ~/.ssh/id_rsa
Host *
UseKeychain yes

Linux/Windows:

ssh-add ~/.ssh/id_rsa

تنظیم کلید در GitHub

  1. به تنظیمات SSH Keys در GitHub بروید
  2. روی "New SSH key" کلیک کنید
  3. یک عنوان انتخاب کنید
  4. محتوای ~/.ssh/id_rsa.pub را در قسمت Key قرار دهید
  5. "Add SSH key" را بزنید

برای تست اتصال به GitHub:

ssh -T git@github.com

ابزار خط فرمان گیت‌هاب (GitHub CLI)

علاوه بر دستورات استاندارد گیت، گیت‌هاب یک ابزار خط فرمان اختصاصی به نام gh دارد که کار با این پلتفرم را بسیار ساده‌تر می‌کند. با gh می‌توانید بدون خروج از ترمینال، کارهایی مثل ساخت ریپازیتوری، مدیریت Issueها و بررسی Pull Requestها را انجام دهید.

نصب و لاگین

پس از نصب GitHub CLI متناسب با سیستم‌عامل خود، با دستور زیر به حساب گیت‌هاب خود متصل شوید:

gh auth login

این دستور شما را قدم‌به‌قدم برای انتخاب پروتکل (HTTPS یا SSH) و احراز هویت راهنمایی می‌کند. اگر SSH را انتخاب کنید، gh می‌تواند به صورت خودکار کلیدهای SSH شما را مدیریت و آپلود کند!

دستورات پرکاربرد

  • ساخت ریپازیتوری جدید:
gh repo create my-new-project --public --clone
  • کلون کردن ریپازیتوری:
gh repo clone owner/repo
  • مشاهده لیست Issueها:
gh issue list
  • مشاهده وضعیت Pull Requestها:
gh pr status

ریپازیتوری

ریپازیتوری چیست؟ مجموعه‌ای از تاریخچه تمام کامیت‌های پروژه از ابتدا تا کنون است. هر ریپازیتوری

شامل نسخه فعلی پروژه و تمام نسخه‌های قبلی آن می‌شود.

انواع ریپازیتوری

  • : ریپازیتوری روی کامپیوتر شما
  • : ریپازیتوری روی سرور (مثل GitHub یا Gitlab)

نحوه کار با ریپازیتوری

در گیت، هر عضو تیم:

  • یک کپی کامل از پروژه و تاریخچه آن روی سیستم خود دارد
  • می‌تواند تغییرات را ایجاد و کامیت کند
  • تغییرات را به سرور می‌کند
  • تغییرات دیگران را از سرور می‌کند

مثال ساده

  1. شما یک فایل file.txt می‌سازید و کامیت می‌کنید
  2. کامیت را به سرور ارسال می‌کنید
  3. هم‌تیمی شما تغییرات را از سرور دریافت می‌کند
  4. او فایل را ویرایش می‌کند و کامیت جدید می‌سازد
  5. این روند ادامه می‌یابد و پروژه پیشرفت می‌کند

دستورات git init و git clone

git init

برای تبدیل یک پروژه موجود به ریپازیتوری< گیت، از دستور git init استفاده می‌کنیم:

git init <PATH>

این دستور یک ریپازیتوری خالی با فولدر .git ایجاد می‌کند که تاریخچه تغییرات در آن ذخیره می‌شود.

git remote add

برای اتصال ریپازیتوری محلی به یک (مثل GitHub یا GitLab)، از دستور زیر استفاده می‌کنیم:

git remote add <NAME> <REPOSITORY_URL>

مثال:

git remote add origin https://github.com/Byte-Magazine/byte-site

مشاهده Remote‌ها

برای مشاهده لیست remote‌های متصل شده:

git remote

برای مشاهده URL کامل remote‌ها:

git remote -v

تغییر URL Remote

برای تغییر آدرس یک remote موجود از دستور git remote set-url استفاده می‌کنیم:

git remote set-url <NAME> <NEW_URL>

مثال:

git remote set-url origin https://github.com/username/new-repository.git

git clone

برای دریافت یک پروژه از سرور و ساخت کپی محلی از آن، از دستور git clone استفاده می‌کنیم:

git clone <REPOSITORY_URL>

مثال:

git clone https://github.com/Byte-Magazine/byte-site

با نام دلخواه:

git clone https://github.com/Byte-Magazine/byte-site my-test-project

با SSH:

git clone git@github.com:Byte-Magazine/byte-site.git

چرخه حیات وضعیت فایل‌ها

  • Untracked: فایل توسط گیت پیگیری نمی‌شود
  • Unmodified: فایل شناسایی شده و تغییری ندارد
  • Modified (not staged): فایل تغییر کرده اما به Staging Area اضافه نشده
  • Staged: فایل آماده کامیت است

دستورات add و status

git add

برای اضافه کردن فایل‌ها به Staging Area از دستور git add استفاده می‌کنیم:

git add <filename>

مثال:

git add file.txt
git add file1.txt file2.txt

برای اضافه کردن همه فایل‌ها:

git add .

یا

git add -A

git status

برای مشاهده وضعیت فایل‌ها و تغییرات، از دستور git status استفاده می‌کنیم:

git status

دستور commit

پس از stage کردن فایل‌ها، می‌توانیم با دستور git commit یک کامیت ایجاد کنیم:

git commit -m "commit message"

روش‌های مختلف کامیت

کامیت فایل‌های خاص بدون stage کردن:

git commit file.txt -m "change content in file.txt"

این دستور فایل را stage و سپس کامیت می‌کند.

کامیت همه فایل‌های tracked:

git commit -a -m "update all tracked files"

پرچم -a همه فایل‌های tracked را stage و کامیت می‌کند.

git log

برای مشاهده تاریخچه کامیت‌ها از دستور git log استفاده می‌کنیم:

git log

این دستور اطلاعات زیر را نمایش می‌دهد:

  • شناسه کامیت (hash)
  • کاربر و زمان کامیت
  • پیام کامیت

مشاهده تاریخچه یک فایل خاص:

git log file.txt

مشاهده تاریخچه یک دایرکتوری:

git log dir1/

هش کامیت

هر کامیت یک شناسه یکتا به نام hash دارد که یک رشته 40 کاراکتری (hexadecimal) است. مثال:

a9c30aad7f0d8b39d54ae0f68ba3c9c97a7c3b5c

این هش از محتوای کامیت (فایل‌ها، پیام، تاریخ و ...) محاسبه می‌شود و برای هر کامیت منحصر به فرد است.

استفاده از hash:

  • می‌توانید از چند کاراکتر اول hash برای اشاره به کامیت استفاده کنید (معمولاً 7 کاراکتر کافی است)
  • برای مشاهده جزئیات یک کامیت خاص:
git show a9c30a

دستور tag

از دستور git tag برای علامت‌گذاری کامیت‌های مهم استفاده می‌شود. معمولاً برای نسخه‌های منتشر شده (مثل v1.0، v2.1) از tag استفاده می‌کنیم.

انواع Tag

Lightweight Tag: یک اشاره‌گر ساده به یک کامیت است و اطلاعات اضافی ندارد:

git tag <TAG_NAME>

مثال:

git tag v1.0

Annotated Tag: دارای اطلاعات کامل مانند تاریخ، checksum و پیام است. این نوع tag پیشنهاد می‌شود:

git tag -a <TAG_NAME> -m "<MESSAGE>"

مثال:

git tag -a v1.0 -m "Release version 1.0"

مشاهده Tag‌ها

مشاهده لیست تمام tag‌ها:

git tag

جستجو در tag‌ها با الگو:

git tag -l "v1.*"

این دستور تمام tag‌هایی که با v1. شروع می‌شوند را نمایش می‌دهد.

Tag کردن کامیت‌های قدیمی

برای tag کردن یک کامیت خاص، hash کامیت را در انتهای دستور اضافه کنید:

git tag -a <TAG_NAME> -m "<MESSAGE>" <COMMIT_HASH>

مثال:

git tag -a first -m "First commit tag" 615b64e

فایل gitignore.

فایل .gitignore برای نادیده گرفتن فایل‌ها و دایرکتوری‌های خاص توسط گیت استفاده می‌شود. این فایل معمولاً در روت پروژه قرار می‌گیرد.

موارد استفاده:

  • فایل‌های تولید شده توسط IDE (مثل VSCode)
  • فایل‌های مهم پروژه (مثل .env)
  • فایل‌های تولید شده از build پروژه

ساخت فایل gitignore.

در روت پروژه یک فایل با نام .gitignore بسازید و قوانین دلخواه خود را در آن بنویسید:

file1.txt
/dir1
 
/dir2/*.cpp
 
*.env

قوانین مهم

آدرس‌دهی از روت:

  • /file.txt → فقط فایل در روت پروژه
  • file.txt → فایل در هر جای پروژه

Wildcards:

  • * → صفر یا چند کاراکتر (غیر از /)
  • ** → هر تعداد دایرکتوری

مثال‌ها:

*.env
 
/dir1/file.txt
 
/dir1/**/file.txt
 
# don't ignore this file
!/dir1/file.txt

مثال‌های رایج

برای پروژه‌های Node.js:

node_modules/
.env
*.log
.DS_Store

برای پروژه‌های Python:

__pycache__/
*.pyc
venv/
.env
.DS_Store

برای پروژه‌های Java:

*.class
target/
.idea/
.DS_Store

دستورات pull و push و fetch

این دستورات برای همگام‌سازی پروژه محلی با ریپازیتوری راه‌دور استفاده می‌شوند.

git push

برای ارسال تغییرات محلی به سرور از دستور git push استفاده می‌کنیم:

git push <REPOSITORY> <BRANCH>

مثال:

git push origin main

یا به صورت ساده:

git push

git pull

برای دریافت و اعمال تغییرات از سرور به پروژه محلی از دستور git pull استفاده می‌کنیم:

git pull <REPOSITORY> <BRANCH>

مثال:

git pull origin main

یا به صورت ساده:

git pull

این دستور تغییرات را دریافت کرده و به صورت خودکار با پروژه محلی merge می‌کند.

git fetch

برای دریافت تغییرات از سرور بدون merge کردن از دستور git fetch استفاده می‌کنیم:

git fetch <REPOSITORY>

مثال:

git fetch origin

تفاوت pull و fetch

دستورکارکرد
git pullدریافت + merge خودکار
git fetchفقط دریافت (بدون merge)

مزایای fetch:

  • می‌توانید قبل از merge، تغییرات را بررسی کنید
  • کنترل بیشتری روی merge دارید
  • می‌توانید تغییرات را در زمان مناسب merge کنید