در دنیای توسعه نرمافزار، همکاری در پروژههای تیمی از اهمیت بالایی برخوردار است. گیت و گیتهاب دو ابزار اصلی هستند که به توسعهدهندگان کمک میکنند تا کدهای خود را بهصورت همزمان مدیریت کنند و به اشتراک بگذارند. در این مقاله، به بررسی نحوه استفاده از ابزارهای collaboration در گیت و گیتهاب میپردازیم، از جمله Workflowها، Pull Requests، Issues، Milestones و نحوه مشارکت در پروژههای متنباز.
برای شروع همکاری در گیتهاب، ابتدا باید یک مخزن (Repository) ایجاد کنید. برای این کار:
اگر میخواهید مخزن برای همه قابل مشاهده باشد گزینه public و اگر میخواهید انتخاب کنید چه کسی باید بتواند مخزن را مشاهده کند گزینه private را انتخاب کنید.
سپس روی "ایجاد مخزن" کلیک کنید، با این کار اولین commit ایجاد می شود.
به شما اجازه میدهد تا دیگران را به پروژههای خود اضافه کنید و به آنها دسترسی برای مشارکت بدهید. این قابلیت زمانی کاربرد دارد که بخواهید با تیم یا افراد دیگر روی یک پروژه مشترک کار کنید. با افزودن همکاران، آنها میتوانند تغییرات جدید را به مخزن شما اضافه کنند، کدها را ویرایش کنند و به توسعه پروژه کمک کنند. هر همکار دسترسیهای مخصوص خود را خواهد داشت و میتواند با شما در مدیریت پروژه همکاری کند.
برای اضافه کردن همکاران به یک مخزن گیتهاب مراحل زیر را دنبال کنید:
git clone <https://github.com/YOUR-USERNAME/YOUR-REPOSITORY>
با فشردن Enter کلون انجام خواهد شد.
با دستور زیر لیست commit ها رو میبینیم
git log --oneline
در تصویر، بخشهای قرمز مربوط به "origin/main" و "origin/HEAD" نشاندهندهی شاخهها و رفرنسهای اصلی مخزن ریموت هستند:
origin/main
: این نشان میدهد که شاخهی main
در مخزن ریموت به آخرین کامیت اشاره دارد. به عبارت دیگر، آخرین تغییرات در شاخهی main
مخزن ریموت ذخیره شده است.
origin/HEAD
: این نشان میدهد که HEAD (اشارهگر فعلی) در مخزن ریموت به شاخهی main
اشاره میکند. HEAD نمایانگر آخرین حالت مخزن است که در اینجا به شاخهی main
اشاره دارد.
اینها مهم هستند زیرا وضعیت همگامسازی بین مخزن لوکال و ریموت را نشان میدهند.
برای همگامسازی تغییرات جدید مخزن ریموت با نسخه محلی خود، از دستورات Fetch و Pull استفاده میکنید. دستور Fetch تنها تغییرات را دانلود میکند اما آنها را در شاخه محلی شما اعمال نمیکند. برای اعمال تغییرات باید از Merge استفاده کنید. از طرفی، دستور Pull هر دو عمل Fetch و Merge را یکجا انجام میدهد و تغییرات ریموت را مستقیماً به شاخه شما اضافه میکند.
خب برای اینکه خیلی بهتر این مورد رو متوجه بشیم بریم توی عمل ببینیم این موارد رو
از داخل repository میریم و فایل README.md رو یه تغییر میدیم، میبینیم که یه commit به لیست commit ها اضفه میشن.
خب الان اگه برگردیم به ترمینال میبینیم که تنها همون commit اولی رو داریم و اگه بخوایم این commit های جدید رو بیاریم روی سیستم لوکال از دستور fetch استفاده می کنیم.
الان میبینیم که commit های دیگه اومدن روی سیستم لوکال اما اعمال نشدن
git log --oneline --all
ما با دستور زیر میتونیم وضیت branch های لوکال رو ببینیم که میبینیم که میگه یه دونه commit عقب تر هست
git branch -vv
خب الان میتونیم با دستور git merge میتونیم دایرکتوری لوکال رو آبدیت کنیم که مثل remote repository بشه
و اگه لاگ رو ببینیم میبینیم main و origin/main جفتشون به commit آخری اشاره میکنن.
در این بخش به نحوه استفاده از دستور git pull
برای همگامسازی تغییرات از مخزن ریموت به مخزن محلی پرداخته شده است.
git pull
یک ادغام سهطرفه انجام میدهد.git pull --rebase
تغییرات محلی را روی تغییرات ریموت دوباره اجرا میکند و تاریخچه را سادهتر و بدون کامیتهای ادغام نگه میدارد.در ادامه، برای تغییرات آزمایشی، یک کامیت محلی و یک کامیت در مخزن ریموت اضافه شده است، و با استفاده از pull این تغییرات ترکیب میشوند.
خب مجددا میریم یخ تغییر توی README.md توی remote repositiry اعمال می کنیم.
بعد توی لوکال کارهای زیر رو انجام میدیم تا commit توی لوکال داشته باشیم
echo hello > file1.txt git add . git commit -m "add new file1.txt "
الان اگه log رو ببینیم میبینیم که main که branch لوکال ما هست یه دونه commit جلوتر از origin/main هست
git log --oneline --all
خب الان با دستور git pull تغیرات رو روی لوکال اعمال میکنیم و اگه لاگ رو ببینیم میبینیم که تغیرات اعمال شدن
git log --oneline --all --graph
حالا برای اینکه سناریو دوم یعنی rebase م انجام بدیم با دستور زیر به یه commit قبل بر میگردیم
و الان با دستور زیر باهم ادغامشون میکنیم.
git pull --rebase
و الان میبینیم به صورت خطی تمام commit ها پشت هم قرار گرفتن، نکته ای که وجود داره اینجا اینه اشاره گر main و origin/main به یک commit اشاره نمیکن، این مورد زمانی که شما دستور pull رو میزنین به صورت خودکار اتفاق میفته، تو قسمت بعدی نشون میدم این مورد رو
پس از اعمال تغییرات در نسخه محلی، برای بهاشتراکگذاری آنها با بقیه تیم، از دستور git push استفاده میشود. اگر شخص دیگری پیش از شما تغییراتی در مخزن ریموت ارسال کرده باشد، ممکن است push شما با خطا مواجه شود. در این حالت، ابتدا باید با git pull تغییرات جدید را دریافت و با شاخه محلی خود ادغام کنید.
الان اگه لاگ رو ببینین میبینید که اشاره گر main و origin/main به یک commit اشاره میکنن
الان اگه توی repository بریم میبینیم که ۴ تا commit داریم و آخرین commit همونی هست که توی لوکال ایجاد کردیم.
به صورت پیش فرض tag هایی که به commit خاصی میزنیم به remote repository ارسال نمیشن و درصورتی که بخوایم tag ها هم ارسال بشن باید از دستور زیر استفاده کنیم
git push origin <tag-name>
خب برای بررسی این مورد میایم به تگ ایجاد میکنیم و ارسال میکنیم به remote repository
git tag v1.0 git push origin v1.0
میتونیم ببینیم که تگ ارسال شده به remote repository ما
و اگه اشتباهی این تگ رو فرستاده بودین میتونین اون رو با دستور زیر حذف کنین و میبینین که دیگه در دسترس نیست
git push --delete origin v1.0
و اگه بخواین از لوکال هم این تگ رو حذف کنین از دستور زیر استفاده میکنین
git tag -d v1.0
مدیریت انتشار در GitHub این امکان را فراهم میکند که نرمافزار خود را همراه با کد منبع، فایلهای باینری و یادداشتهای انتشار به صورت بستهبندی شده منتشر کنید. برای ایجاد یک انتشار، به تب "Releases" در مخزن خود بروید و تگ جدیدی ایجاد یا انتخاب کنید. سپس یادداشتهای مربوط به انتشار را بنویسید و در صورت نیاز فایلهای اضافی مثل باینریها را ضمیمه کنید. همچنین میتوانید انتشار خود را به عنوان پیشانتشار (pre-release) علامتگذاری کنید. این ویژگی بر اساس تگهای Git ساخته شده و امکانات بیشتری ارائه میدهد.
وارد قسمت release میشیم و توضیحاتی که نیاز داره رو مینویسیم، تنها نکته ای که داره release ها از تگ ها استفاده میکنن، درصورتی که تگی از قبل وجود داره از اون استفاده میکنه و اگه تگ وجود نداره به آخرین commit یه تگ میدیم توی release ازش استفاده می کنیم.
و توی صفحه اصلی پروژه قسمت سمت راست هم میتونیم لیستی از release ها رو ببینیم
در این بخش، نحوهی ایجاد، ارسال (push)، و حذف شاخهها در یک مخزن GitHub توضیح داده میشود. بهطور پیشفرض، شاخهها در مخزن محلی شما خصوصی هستند. برای اشتراکگذاری آنها با دیگران، باید بهصورت دستی از دستور git push -u origin <branch-name>
استفاده کنید. پس از ارسال، همکاران میتوانند روی شاخه کار کنند. وقتی کار تمام شد، میتوانید شاخه را با دستور git push origin --delete <branch-name>
از مخزن حذف کرده و برای حذف محلی از git branch -d <branch-name>
استفاده کنید.
خب میایم یه branch روی لوکال میسازیم و لگه بخوایم اونو به remote repositiry بفرستیم با خطای زیر روبرو میشیم
git switch -c feature/change-password git push
این خطا داره میگه که برای این branch هیچ branch توی repo اصلی وجود نداره و برای حل این مشکل باید دستور زیر رو بزنی
git push --set-upstream origin feature/change-password
خب قبل از اون با دستور git branch -vv میتونیم ببینیم که main به origin/main متصل هست اما feature/change-password به جایی متصل نیست
و همچنین برای دیدن لیست remote branch ها میتونیم از دستور git branch -r استفاده کنیم که میبینیم برای feature/change-password توی remote هیچ Branch ی تعریف نشده
حب الان دستور رو میزنیم و میتونیم تغییرات رو ببینیم
مثل قبل با دستور git branch -vv میتونیم ببینیم که main به origin/main متصل هست و الان feature/change-password به origin وصل شده
و هر زمان نیاز به این branch نداشتیم میتونیم اون رو روی remote repository با دستور زیر حذف کنیم
git push -d origin feature/change-password
یکی از ابزارهای پرکاربرد گیتهاب، Pull Request است. با استفاده از Pull Request میتوانید تغییرات خود را به تیم پیشنهاد دهید و منتظر بازبینی (Review) آن باشید. این روش برای دریافت بازخورد تیم و اطمینان از کیفیت کد بسیار مفید است.
خب تو این سناریو میایم یه branch توی لوکال میسازیم و با این سناریو میریم جلو
git switch -c feature/login echo hello > file3.txt git add . git commit -m "add file3.txt"
خب میبینیم که درخواستی اومده توی repo ما مبنی بر compare and pull
ما میتونیم بریم توی قسمت pull request ها و ببینیم چه تغییراتی قراره اضافه بشه به main
زمانی که درخواست pull request رو میزنیم با عکس زیر روبرو میشیم و title و اگه توضیحاتی خاصی نیاز داره میدیم بهش و create pull request رو میزنیم.
خب تو قسمت بعدی هم باید تغیر رو بررسی کنیم و merge کنیم که ۳ نوع merge میتونیم اینجا انجام بدیم، هرکدوم برای شرایط خاصی استفاده میشه.
در آخر میتونیم برگردیم توی main و تغییرات رو از remote repository دریافت کنیم، میبینیم که file3.txt به branch main اضافه شده
git switch feature/logout echo hello > file1.txt git commit -am "write hello file1.txt" git push -u origin git push -u origin feature/logout
خب برای ایجاد confilict بریم به main همین فایل رو تغییر بدیم ببینیم چی میشه
git switch main echo world > file1.txt git commit -am "write world to file1.txt"
خب زمانی که compare & pull رو میزنیم میبینیم که اجازه نمیده مستقیم merge بشه اونم بخاطر confilict هست که باید fix بشه
خب قبلا این جا merge میکردیم و تمام اما الان میبینیم که confilict داریم و باید خطا رو رفع کنیم
گزینه resove confilict رو میزنیم و میریم برای حل confilict که داریم و در آخرم گزینه commit merge رو میزنیم
حالا مجددا میرسیم به جایی که قبلا بودیم و الان merge میکنیم.
در پروژههای تیمی، پیگیری مشکلات و ویژگیهای جدید اهمیت دارد. گیتهاب با ابزار Issues به شما اجازه میدهد تا مشکلات و پیشنهادها را پیگیری کنید. همچنین میتوانید از Milestones برای پیگیری پیشرفت پروژهها و زمانبندی انتشار نسخههای جدید استفاده کنید.
خب بریم یه issue ایجاد کنیم، میتونیم به شخص خاصی ارجاع بدیم و همچنین میتونیم از label هایی که داره استفاده کنیم.
خب بریم ببینیم چطور میتونیم پیشرفت یه issue رو پیگیری کنیم یه milestone میسازیم
و برمیگردیم توی issue ها و هرکدوم از isseu ها رو که میخوایم اضافه میکنیم به این milestone
و اگه ما issue رو ببنیدیم milestone نیز بسته خواهد شد.
یکی از بزرگترین مزایای گیتهاب، مشارکت در پروژههای متنباز (Open Source) است. برای مشارکت در این پروژهها، ابتدا مخزن را fork کنید، سپس تغییرات خود را در شاخه جدید اعمال و در نهایت یک Pull Request ارسال کنید تا تغییرات شما بازبینی و در صورت تأیید، با پروژه اصلی ادغام شوند.
این مقاله به شما کمک میکند تا با ابزارهای همکاری در گیت و گیتهاب به طور کامل آشنا شوید و بتوانید به راحتی با تیمهای توسعه نرمافزار کار کنید.