همکاری با مخزن راه دور
اتصال گیت به مخزن راه دور با clone و remote و همگامسازی تغییرات با push، fetch و pull.
آنچه در این درس میآموزید
- مخزن محلی را به مخزن راه دور متصل کنید
- تغییرات را با push ارسال و با fetch و pull دریافت کنید
- گردش کار روزمرهٔ همکاری تیمی روی گیتهاب را بشناسید
فهرست مطالب
مخزن .git شما تا اینجا فقط روی سیستم خودتان بود. برای همکاری، پشتیبانگیری یا انتشار کد، به یک «مخزن راه دور» (Remote Repository) نیاز دارید؛ یک نسخهٔ مشترک از پروژه روی سروری مثل گیتهاب، گیتلب یا حتی سرور خودتان. گیت خودش برای اینترنت و پروتکل خاصی جادو ندارد؛ فقط بین مخزن محلی و مخزن راه دور کامیت جابهجا میکند.
در این درس پروژه را از دو جهت کار میکنیم: پروژهای که از قبل روی سرور هست و آن را میگیرید (clone)، و پروژهای که محلی ساختهاید و میخواهید بالا بفرستید (push).
گرفتن پروژه: git clone
git clone https://github.com/sara-dev/todo-app.gitنمونهٔ خروجی:
Cloning into 'todo-app'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
Unpacking objects: 100% (12/12), done.clone همه چیز را میآورد: آخرین نسخهٔ فایلها، کل تاریخچهٔ کامیتها و همهٔ شاخهها. در ضمن یک اتصال خودکار با نام origin به مخزن مبدأ میسازد. origin فقط یک نام قراردادی و پیشفرض است، نه چیزی جادویی. اتصالهای تعریفشده را با git remote -v ببینید:
git remote -vنمونهٔ خروجی:
origin https://github.com/sara-dev/todo-app.git (fetch)
origin https://github.com/sara-dev/todo-app.git (push)دو سطر بودن خروجی طبیعی است: یکی آدرس «گرفتن» و دیگری آدرس «فرستادن» است که معمولاً یکیاند.
فرستادن تغییرات: git push
اگر پروژه را محلی شروع کردهاید و بعداً مخزن خالیای در گیتهاب ساختید، اول اتصال را دستی اضافه کنید:
git remote add origin https://github.com/sara-dev/todo-app.git
git push -u origin mainنمونهٔ خروجی:
Enumerating objects: 5, done.
Writing objects: 100% (3/3), 300 bytes, done.
To https://github.com/sara-dev/todo-app.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.گزینهٔ -u (کوتاه --set-upstream) به گیت میگوید شاخهٔ محلی main از این به بعد شاخهٔ origin/main را دنبال کند؛ پس دفعات بعد کافی است git push بنویسید. شاخههای دیگر را هم به همین شکل با git push -u origin branch-name میفرستید.
گرفتن تغییرات: fetch در برابر pull
دو فرمان برای دریافت تغییرات دارید:
git fetchفقط کامیتهای تازهٔ مخزن راه دور را میگیرد وorigin/mainرا بهروز میکند؛ اما به فایلها و شاخهٔ محلی شما کاری ندارد. بعد از آن میتوانید باgit log main..origin/mainببینید چه چیز تازهای رسیده و باgit merge origin/mainآن را ادغام کنید.git pullهمان کار را در دو مرحله پشتسرهم انجام میدهد: اولfetch، بعدmergeبه شاخهٔ فعلی. یعنیgit pullمعادلgit fetchو سپسgit merge origin/mainاست.
وقتی هیچ تغییر تازهای نباشد:
git pullنمونهٔ خروجی:
Already up to date.گردش کار روزمرهٔ یک تیم
چرخهٔ واقعی همکاری معمولاً چنین است:
- صبح کار را با
git pullشروع کنید تا آخرین وضعیت را داشته باشید. - برای هر کار جدید یک شاخه بسازید:
git switch -c fix-typo(همان درس قبل). - کار را کامیت کنید و شاخه را بفرستید:
git push -u origin fix-typo. - در گیتهاب برای آن شاخه «درخواست ادغام» (Pull Request) باز کنید؛ همتیمیها کد را میبینند، نظر میدهند و بعد ادغام میکنند.
- پس از ادغام، شاخهٔ محلی و راه دور را پاک کنید و دوباره
pullبزنید.
مرحلهٔ چهارم در خود گیت نیست؛ ابزارهایی مثل گیتهاب روی گیت سوار میشوند و بازبینی کد (Code Review) و گفتوگو را اضافه میکنند. مفهوم زیربنایی همان شاخه و ادغام درس قبل است.
تمرینها
تمرین
تمرین ۱ — پروژه را به گیتهاب ببرید
در حساب گیتهاب خود یک مخزن خالی به نام my-project بسازید (بدون فایل README)، سپس مخزن محلی تمرین درسهای قبل را به آن متصل کنید و شاخهٔ main را با گزینهٔ -u بفرستید. در پایان با فرمانی فهرست اتصالهای راه دور را نشان دهید.
# Write your commands hereنمایش راهحل
git remote add origin https://github.com/your-username/my-project.git
git push -u origin main
git remote -vاگر پیام branch 'main' set up to track 'origin/main'. را دیدید، اتصال درست است. از این بعد هر کامیت تازه را فقط با git push میفرستید.
:::
تمرین
تمرین ۲ — شبیهسازی همتیمی
در یک پوشهٔ دیگر از همان پروژه، یک git clone بگیرید، در نسخهٔ کپی یک فایل تازه بسازید، کامیت و push کنید؛ سپس به مخزن اصلی برگردید و بدون clone دوباره، آن تغییر را با git pull بگیرید. این دقیقاً همان اتفاقی است که برای همتیمیهای شما میافتد.
# Write your commands hereنمایش راهحل
git clone https://github.com/your-username/my-project.git my-project-copy
cd my-project-copy
echo "from teammate" > teammate.txt
git add teammate.txt
git commit -m "Add teammate file"
git push
cd ../my-project
git pullخروجی git pull در مخزن اصلی، آوردن کامیت همتیمی را نشان میدهد و فایل teammate.txt حالا آنجا هم هست.
:::
خلاصه
- مخزن راه دور نسخهٔ مشترک پروژه است و اتصال پیشفرض آن نام
originدارد. git cloneپروژه را با کل تاریخچه میگیرد؛git remote addاتصال به مخزن موجود را میسازد.git pushتغییرات را میفرستد؛git fetchتغییرات را فقط میگیرد وgit pullآنها را ادغام هم میکند.- در کار تیمی: اول pull، بعد شاخهٔ جدا، بعد push و درخواست ادغام؛ اگر push رد شد، اول pull کنید.
با این درس، دورهٔ گیت کامل میشود: تاریخچه میسازید، شاخه میزنید و با تیم همگام میمانید. برای ادامه، مستندات رسمی هر فرمان در git-scm.com مرجع دقیق شماست.