نحوه ایجاد یک Pull Request در GitHub

مقدمه

Git یک سیستم کنترل نسخه توزیع شده منبع باز است که پروژه های نرم افزاری مشترک را قابل مدیریت تر می کند. بسیاری از پروژه‌ها فایل‌های خود را در یک مخزن Git نگهداری می‌کنند و پلتفرم‌هایی مانند GitHub اشتراک‌گذاری و کمک به کد را در دسترس، ارزشمند و مؤثر کرده‌اند.

پروژه‌های منبع باز میزبانی شده در مخازن عمومی از مشارکت‌های جامعه توسعه‌دهندگان گسترده‌تر از طریق درخواست‌های کششی بهره می‌برند، که درخواست می‌کنند پروژه تغییراتی را که شما در مخزن کد خود ایجاد کرده‌اید بپذیرد.

این آموزش شما را از طریق درخواست کشش به مخزن Git از طریق خط فرمان راهنمایی می کند تا بتوانید در پروژه های نرم افزاری منبع باز مشارکت کنید.

پیش نیازها

شما باید Git را روی دستگاه محلی خود نصب کرده باشید. این راهنما به شما کمک می کند بررسی کنید که آیا Git روی رایانه شما نصب شده است یا خیر و مراحل نصب سیستم عامل خود را طی کنید.

همچنین باید یک حساب GitHub داشته باشید یا ایجاد کنید. می توانید این کار را از طریق وب سایت GitHub، github.com انجام دهید و یا وارد شوید یا حساب خود را ایجاد کنید.

از نوامبر 2020، GitHub احراز هویت مبتنی بر رمز عبور را حذف کرد. به همین دلیل، برای دسترسی به مخازن GitHub از طریق خط فرمان، باید یک نشانه دسترسی شخصی ایجاد کنید یا اطلاعات کلید عمومی SSH خود را اضافه کنید.

در نهایت، شما باید یک پروژه نرم افزاری منبع باز را برای مشارکت در آن شناسایی کنید. با مطالعه این مقدمه می توانید با پروژه های متن باز بیشتر آشنا شوید.

یک کپی از Repository ایجاد کنید

یک مخزن یا به اختصار repo، اساساً پوشه اصلی یک پروژه است. مخزن شامل تمام فایل های پروژه مربوطه، از جمله مستندات است، و همچنین تاریخچه ویرایش هر فایل را ذخیره می کند. در GitHub، مخازن می توانند چندین همکار داشته باشند و می توانند عمومی یا خصوصی باشند.

برای کار بر روی یک پروژه منبع باز، ابتدا باید کپی خود را از مخزن تهیه کنید. برای انجام این کار، باید مخزن را فورک کنید و سپس آن را شبیه سازی کنید تا یک نسخه کار محلی داشته باشید.

Repository را فورک کنید

می‌توانید با پیمایش با مرورگر خود به آدرس اینترنتی GitHub پروژه متن‌بازی که می‌خواهید در آن مشارکت کنید، یک مخزن در GitHub ایجاد کنید.

آدرس‌های اینترنتی مخزن GitHub هم به نام کاربری مرتبط با صاحب مخزن و هم به نام مخزن ارجاع می‌دهند. به عنوان مثال، DigitalOcean Community (نام کاربری: do-community) مالک مخزن پروژه cloud_haiku است، بنابراین URL GitHub برای آن پروژه این است:

https://github.com/do-community/cloud_haiku

در مثال بالا، do-community نام کاربری و cloud_haiku نام مخزن است.

پس از شناسایی پروژه ای که می خواهید در آن مشارکت داشته باشید، می توانید به URL بروید که به این صورت قالب بندی می شود:

https://github.com/username/repository

یا می توانید پروژه را با استفاده از نوار جستجوی GitHub جستجو کنید.

هنگامی که در صفحه اصلی مخزن هستید، یک دکمه Fork در سمت راست بالای صفحه، زیر نماد کاربر شما نمایش داده می شود:

بر روی دکمه Fork کلیک کنید تا فرآیند فورکینگ آغاز شود. در پنجره مرورگر خود، اعلانی دریافت خواهید کرد که مخزنی که در حال فورک کردن آن هستید در حال پردازش است:

پس از انجام فرآیند، مرورگر شما به صفحه ای مشابه صفحه مخزن قبلی می رود، با این تفاوت که در قسمت بالا نام کاربری خود را قبل از نام مخزن خواهید دید و در URL نیز نام کاربری شما را قبل از نام مخزن می بینید.

بنابراین، در مثال بالا، به جای do-community / cloud_haiku در بالای صفحه، نام کاربری خود / cloud_haiku را خواهید دید و URL جدید شبیه به این خواهد بود:

https://github.com/your-username/cloud_haiku

با انشعاب مخزن، شما آماده هستید تا آن را شبیه سازی کنید تا یک کپی محلی از پایه کد داشته باشید.

Repository را شبیه سازی کنید

برای ایجاد کپی محلی خود از مخزنی که می خواهید در آن مشارکت کنید، ابتدا یک پنجره ترمینال را باز می کنیم.

ما از دستور git clone به همراه URL استفاده می کنیم که به فورک مخزن شما اشاره می کند.

این URL مشابه URL بالا خواهد بود، با این تفاوت که اکنون با .git ختم می شود. در مثال cloud_haiku در بالا، URL شبیه به این خوانده می شود و نام کاربری واقعی شما جایگزین نام کاربری شما می شود:

https://github.com/your-username/cloud_haiku.git

همچنین می‌توانید URL را با استفاده از دکمه سبز رنگ «⤓ Code» از صفحه مخزن خود که از صفحه مخزن اصلی جدا کرده‌اید، کپی کنید. پس از کلیک بر روی دکمه، می‌توانید با کلیک روی دکمه کلیپ‌بورد در کنار URL، URL را کپی کنید:

وقتی URL را داشتیم، آماده کلون کردن مخزن هستیم. برای انجام این کار، دستور git clone را با URL مخزن از خط فرمان در پنجره ترمینال ترکیب می کنیم:

git clone https://github.com/your-username/repository.git

یک Branch جدید ایجاد کنید

هر زمان که روی یک پروژه مشترک کار می‌کنید، شما و سایر برنامه‌نویسانی که در مخزن مشارکت می‌کنند، ایده‌های متفاوتی برای ویژگی‌ها یا اصلاحات جدید به طور همزمان خواهید داشت. پیاده سازی برخی از این ویژگی های جدید زمان قابل توجهی نمی خواهد، اما برخی از آنها ادامه خواهند داشت. به همین دلیل، شاخه بندی مخزن مهم است تا بتوانید گردش کار را مدیریت کنید، کد خود را ایزوله کنید، و کنترل کنید که چه ویژگی هایی آن را به شاخه اصلی مخزن پروژه باز می گرداند.

شاخه اولیه مخزن پروژه معمولاً شاخه اصلی نامیده می شود. یک روش توصیه شده این است که هر چیزی را در شاخه اصلی قابل استقرار در نظر بگیرید تا دیگران در هر زمان از آن استفاده کنند.

توجه: در ژوئن 2020، GitHub اصطلاحات خود را به‌روزرسانی کرد تا به شعبه‌های کد منبع پیش‌فرض به‌عنوان شاخه اصلی، به جای شاخه اصلی اشاره کند. اگر شعبه پیش‌فرض شما همچنان به‌عنوان اصلی ظاهر می‌شود، می‌توانید با تغییر تنظیمات شعبه پیش‌فرض، آن را به اصلی به‌روزرسانی کنید.

 

هنگام ایجاد یک شعبه بر اساس پروژه موجود، باید شاخه جدید خود را از شاخه اصلی ایجاد کنید. همچنین باید مطمئن شوید که نام شعبه شما توصیفی باشد. به جای اینکه آن را my-branch بنامید، باید به جای آن از چیزی مانند frontend-hook-migration یا fix-documentation-type استفاده کنید.

برای ایجاد شعبه از پنجره ترمینال خود، دایرکتوری خود را تغییر می دهیم تا در دایرکتوری مخزن کار کنیم. حتماً از نام واقعی مخزن (مانند cloud_haiku) برای تغییر به آن دایرکتوری استفاده کنید.

cd repository

اکنون، شعبه جدید خود را با دستور git branch ایجاد می کنیم. مطمئن شوید که نام آن را توصیفی می‌کنید تا دیگرانی که روی پروژه کار می‌کنند متوجه شوند که روی چه چیزی کار می‌کنید.

git branch new-branch

اکنون که شعبه جدید ما ایجاد شده است، می‌توانیم با استفاده از دستور git checkout، روی آن شاخه کار کنیم:

git checkout new-branch

پس از وارد کردن دستور git checkout، خروجی زیر را دریافت خواهید کرد:

Output
Switched to branch 'new-branch'

همچنین، می‌توانید دو دستور بالا را با ایجاد و تغییر به یک شاخه جدید، با دستور زیر و پرچم -b فشرده کنید:

git checkout -b new-branch

اگر می خواهید به حالت اصلی برگردید، از دستور checkout با نام شعبه اصلی استفاده می کنید:

git checkout main

دستور پرداخت به شما امکان می دهد بین چندین شاخه جابجا شوید، بنابراین می توانید همزمان روی چندین ویژگی کار کنید.

در این مرحله، اکنون می‌توانید فایل‌های موجود را تغییر دهید یا فایل‌های جدیدی را در شعبه خود به پروژه اضافه کنید.

ایجاد تغییرات به صورت محلی

برای نشان دادن ایجاد یک درخواست کشش، از مثال cloud_haiku repo استفاده می کنیم و یک فایل جدید در کپی محلی خود ایجاد می کنیم. از ویرایشگر متن دلخواه خود برای ایجاد یک فایل جدید استفاده کنید تا بتوانیم یک شعر هایکوی جدید را همانطور که در دستورالعمل های کمک توضیح داده شده است اضافه کنیم. به عنوان مثال، می توانیم از nano استفاده کنیم و فایل نمونه خود را filename.md صدا کنیم. باید فایل خود را با نام اصلی با پسوند md. برای Markdown صدا بزنید.

nano filename.md

در مرحله بعد، با پیروی از دستورالعمل‌های کمک، مقداری متن به فایل جدید اضافه می‌کنیم. ما باید از قالب جکیل استفاده کنیم و یک هایکو با خطوط شکسته اضافه کنیم. فایل زیر یک فایل نمونه است، زیرا باید یک هایکوی اصلی ارائه دهید.

---
layout: haiku
title: Octopus Cloud
author: Sammy
---
Distributed cloud <br>
Like the octopuses' minds <br>
Across the network <br>

هنگامی که متن خود را وارد کردید، فایل را ذخیره و ببندید. اگر از نانو استفاده می‌کنید، این کار را با فشار دادن CTRL + X، سپس Y و سپس ENTER انجام دهید.

هنگامی که یک فایل موجود را تغییر دادید یا یک فایل جدید را به پروژه انتخابی خود اضافه کردید، می توانید آن را در مخزن محلی خود مرحله بندی کنید، که ما می توانیم با دستور git add انجام دهیم. در مثال ما، filename.md، دستور زیر را تایپ می کنیم.

git add filename.md 

ما نام فایلی را که ایجاد کردیم به این دستور منتقل کردیم تا آن را در مخزن محلی خود مرحله بندی کنیم. این تضمین می کند که فایل شما آماده اضافه شدن است.

اگر به دنبال اضافه کردن تمام فایل‌هایی که تغییر داده‌اید را در یک فهرست خاص می‌خواهید، می‌توانید همه آنها را با دستور زیر مرحله‌بندی کنید:

git add .

در اینجا نقطه یا نقطه تمام فایل های مربوطه را اضافه می کند.

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

git add -A

یا، می توانید git add -all را تایپ کنید تا همه فایل های جدید مرحله بندی شوند.

با مرحله بندی فایل ما، می خواهیم تغییراتی را که در مخزن ایجاد کرده ایم با دستور git commit ثبت کنیم.

انجام تغییرات

پیام commit یک جنبه مهم از مشارکت کد شما است. این به نگهبانان و سایر مشارکت کنندگان کمک می کند تا به طور کامل تغییری را که ایجاد کرده اید، چرایی ایجاد آن و اهمیت آن را درک کنند. علاوه بر این، پیام‌های commit یک سابقه تاریخی از تغییرات پروژه در کل ارائه می‌کنند و به مشارکت‌کنندگان آینده در این راه کمک می‌کنند.

اگر پیام خیلی کوتاهی داریم، می‌توانیم آن را با پرچم -m و پیام در گیومه ضبط کنیم. در مثال ما از اضافه کردن هایکو، commit git ما ممکن است مشابه موارد زیر باشد.

git commit -m "Added a new haiku in filename.md file"

مگر اینکه یک تغییر جزئی یا مورد انتظار باشد، ممکن است بخواهیم یک پیام تعهد طولانی تری اضافه کنیم تا همکاران ما به طور کامل از مشارکت ما مطلع شوند. برای ضبط این پیام بزرگتر، دستور git commit را اجرا می کنیم که ویرایشگر متن پیش فرض را باز می کند:

git commit

هنگام اجرای این دستور، ممکن است متوجه شوید که در ویرایشگر vim هستید که می توانید با تایپ:q از آن خارج شوید. اگر می خواهید ویرایشگر متن پیش فرض خود را پیکربندی کنید، می توانید این کار را با دستور git config انجام دهید و nano را به عنوان ویرایشگر پیش فرض تنظیم کنید، به عنوان مثال:

git config --global core.editor "nano"

یا vim:

git config --global core.editor "vim"

پس از اجرای دستور git commit، بسته به ویرایشگر متن پیش فرضی که استفاده می کنید، پنجره ترمینال شما باید سندی را برای ویرایش شما نمایش دهد که شبیه به این خواهد بود:

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch new-branch
# Your branch is up-to-date with 'origin/new-branch'.
# Changes to be committed:
# modified: new-feature.py

در زیر نظرات مقدماتی، باید پیام commit را به فایل متنی اضافه کنید.

برای نوشتن یک پیام commit مفید، باید خلاصه ای را در خط اول قرار دهید که حدود 50 کاراکتر طول دارد. در این بخش، و به بخش‌های قابل هضم تقسیم می‌شوید، باید توضیحی را اضافه کنید که دلیل ایجاد این تغییر، نحوه عملکرد کد و اطلاعات اضافی را بیان کند که آن را برای دیگران مشخص می‌کند تا کار را هنگام ادغام بررسی کنند. سعی کنید تا حد امکان مفید و فعال باشید تا مطمئن شوید که کسانی که پروژه را حفظ می کنند می توانند مشارکت شما را به طور کامل درک کنند.

Push کردن تغییرات

هنگامی که فایل متنی پیام commit را ذخیره کردید و از آن خارج شدید، می توانید با دستور زیر بررسی کنید که Git چه چیزی را commit می کند:

git status

بسته به تغییراتی که ایجاد کرده اید، خروجی مشابه زیر دریافت خواهید کرد:

Output
On branch new-branch
nothing to commit, working tree clean

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

git push --set-upstream origin new-branch

این دستور خروجی را در اختیار شما قرار می دهد تا شما را از پیشرفت مطلع کند و مشابه موارد زیر خواهد بود:

Output
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 336 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/your-username/repository.git
a1f29a6..79c0e80 new-branch -> new-branch
Branch new-branch set up to track remote branch new-branch from origin.

اکنون می توانید به مخزن فورک شده در صفحه وب GitHub خود بروید و به شاخه ای که فشار داده اید بروید تا تغییراتی را که در مرورگر ایجاد کرده اید مشاهده کنید.

در این مرحله، امکان درخواست کشش به مخزن اصلی وجود دارد، اما اگر قبلاً این کار را انجام نداده اید، باید مطمئن شوید که مخزن محلی شما با مخزن بالادستی به روز است.

به روز رسانی Repository محلی

در حالی که شما در کنار سایر مشارکت‌کنندگان روی یک پروژه کار می‌کنید، باید مخزن محلی خود را با پروژه به‌روز نگه دارید، زیرا نمی‌خواهید یک درخواست کششی برای کد ارائه دهید که به طور خودکار باعث تضاد می‌شود (اگرچه در پروژه‌های کد مشترک ، درگیری ها حتماً رخ خواهند داد). برای به روز نگه داشتن نسخه محلی خود از پایه کد، باید تغییرات را همگام کنید.

ابتدا به پیکربندی یک کنترل از راه دور برای فورک و سپس همگام سازی فورک می پردازیم.

یک کنترل از راه دور برای فورک پیکربندی کنید

مخازن راه دور این امکان را برای شما فراهم می کند که با دیگران در پروژه Git همکاری کنید. هر مخزن راه دور نسخه ای از پروژه است که در اینترنت یا شبکه ای که شما به آن دسترسی دارید میزبانی می شود. بسته به امتیازات کاربر شما، هر مخزن راه دور باید به صورت فقط خواندنی یا خواندنی-نوشتنی در دسترس شما باشد.

برای اینکه بتوانید تغییراتی را که در یک فورک ایجاد می‌کنید با مخزن اصلی که با آن کار می‌کنید همگام‌سازی کنید، باید یک کنترل از راه دور پیکربندی کنید که به مخزن بالادستی ارجاع دهد. فقط یکبار باید ریموت را در مخزن بالادستی تنظیم کنید.

بیایید ابتدا بررسی کنیم که کدام سرورهای راه دور را پیکربندی کرده اید. دستور git remote هر مخزن راه دوری را که قبلاً مشخص کرده‌اید فهرست می‌کند، بنابراین اگر مخزن خود را همانطور که در بالا انجام دادیم کلون کنید، حداقل خروجی مربوط به مخزن مبدا را دریافت خواهید کرد، که نام پیش‌فرض Git برای فهرست کلون شده است.

از دایرکتوری مخزن در پنجره ترمینال خود، اجازه دهید از دستور git remote به همراه پرچم -v برای نمایش URL هایی که Git ذخیره کرده است به همراه نام های کوتاه راه دور مربوطه استفاده کنیم (مانند “origin”):

git remote -v

از آنجایی که ما یک مخزن را شبیه سازی کردیم، خروجی ما باید مشابه این باشد:

Output
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)

اگر قبلاً بیش از یک ریموت راه‌اندازی کرده‌اید، دستور git remote -v فهرستی از همه آنها را ارائه می‌کند.

در مرحله بعد، یک مخزن از راه دور جدید را برای همگام سازی با فورک مشخص می کنیم. این مخزن اصلی خواهد بود که ما از آن جدا شده ایم. ما این کار را با دستور git remote add انجام خواهیم داد.

git remote add upstream https://github.com/original-owner-username/original-repository.git

برای مثال cloud_haiku ما، این دستور به صورت زیر خواهد بود:

git remote add upstream https://github.com/do-community/cloud_haiku.git

در این مثال، upstream نام کوتاهی است که ما برای مخزن راه دور ارائه کرده‌ایم، زیرا از نظر Git، “upstream” به مخزنی که ما از آن شبیه‌سازی کرده‌ایم اشاره دارد. اگر بخواهیم یک نشانگر راه دور به مخزن یک همکار اضافه کنیم، ممکن است بخواهیم نام کاربری آن همکار یا یک نام مستعار کوتاه شده برای نام کوتاه ارائه کنیم.

با استفاده از دستور git remote -v دوباره از فهرست مخزن، می‌توانیم تأیید کنیم که نشانگر راه دور ما به مخزن بالادست به درستی اضافه شده است:

git remote -v
Output
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)
upstream https://github.com/original-owner-username/original-repository.git (fetch)
upstream https://github.com/original-owner-username/original-repository.git (push)

اکنون می توانید به جای نوشتن کل URL به upstream در خط فرمان مراجعه کنید و آماده هستید که فورک خود را با مخزن اصلی همگام کنید.

فورک را همگام سازی کنید

هنگامی که یک کنترل از راه دور را پیکربندی کردیم که به مخزن بالادستی و اصلی در GitHub ارجاع می دهد، آماده همگام سازی فورک مخزن خود هستیم تا آن را به روز نگه داریم.

برای همگام سازی فورک خود، از دایرکتوری مخزن محلی ما در یک پنجره ترمینال، از دستور git fetch برای واکشی شاخه ها به همراه commit های مربوطه آنها از مخزن بالادستی استفاده می کنیم. از آنجایی که ما از نام کوتاه “upstream” برای اشاره به مخزن upstream استفاده کردیم، آن را به دستور منتقل می کنیم.

git fetch upstream

بسته به تعداد تغییراتی که از زمانی که مخزن را فورک کرده ایم، انجام شده است، خروجی شما ممکن است متفاوت باشد و ممکن است شامل چند خط در شمارش، فشرده سازی و باز کردن اشیا باشد. خروجی شما مشابه خطوط زیر به پایان می رسد اما ممکن است بسته به تعداد شاخه های پروژه متفاوت باشد:

Output
From https://github.com/original-owner-username/original-repository
* [new branch] main -> upstream/main

اکنون، تعهدات به شعبه اصلی در یک شعبه محلی به نام upstream/main ذخیره می شود.

بیایید به شاخه اصلی محلی مخزن خود برویم:

git checkout main
Output
Switched to branch 'main'

اکنون هر تغییری را که در شعبه اصلی مخزن اصلی ایجاد شده است، که از طریق شاخه upstream/main محلی خود به آن دسترسی خواهیم داشت، با شاخه اصلی محلی خود ادغام می کنیم:

git merge upstream/main

خروجی در اینجا متفاوت خواهد بود، اما اگر تغییراتی ایجاد شده باشد یا قبلاً به‌روز باشد، با به‌روزرسانی شروع می‌شود. اگر از زمانی که مخزن را فورک کرده اید هیچ تغییری ایجاد نشده است.

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

بسته به گردش کار و مدت زمانی که برای ایجاد تغییرات صرف می‌کنید، می‌توانید فورک خود را با کد بالادستی مخزن اصلی هر چند بار که برای شما منطقی باشد همگام‌سازی کنید. اما مطمئناً باید فورک خود را درست قبل از درخواست کشش همگام کنید تا مطمئن شوید کدهای متضاد را به طور خودکار ارسال نمی کنید.

درخواست Pull Request

در این مرحله، شما آماده هستید تا یک درخواست کشش به مخزن اصلی ارائه دهید.

باید به مخزن فورکی خود بروید و دکمه درخواست کشش جدید را در سمت چپ صفحه فشار دهید.

در صفحه بعدی می توانید شاخه را تغییر دهید. در هر طرف، می توانید مخزن مناسب را از منوی کشویی و شاخه مناسب انتخاب کنید.

به عنوان مثال، هنگامی که شاخه اصلی مخزن اصلی را در سمت چپ و شاخه جدید مخزن چنگالی خود را در سمت راست انتخاب کردید، باید صفحه ای دریافت کنید که نشان می دهد شاخه های شما می توانند ادغام شوند. اگر کد رقیب وجود ندارد:

شما باید یک عنوان و یک نظر به فیلدهای مربوطه اضافه کنید و سپس دکمه Create pull request را فشار دهید.

در این مرحله، نگهبانان مخزن اصلی تصمیم خواهند گرفت که آیا درخواست کشش شما را بپذیرند یا نه. آنها ممکن است از شما بخواهند که کد خود را قبل از پذیرش درخواست کشش با ارسال یک بررسی کد، ویرایش یا اصلاح کنید.

نتیجه

در این مرحله، شما با موفقیت یک درخواست کشش به یک مخزن نرم افزار منبع باز ارسال کرده اید. پس از این، باید مطمئن شوید که کد خود را در زمانی که منتظر بررسی آن هستید، به‌روزرسانی کرده و تغییر دهید. نگهبانان پروژه ممکن است از شما بخواهند که کد خود را دوباره کار کنید، بنابراین باید برای انجام این کار آماده باشید.

مشارکت در پروژه‌های منبع باز – و تبدیل شدن به یک توسعه‌دهنده منبع باز فعال – می‌تواند تجربه‌ای ارزشمند باشد. مشارکت منظم در نرم افزاری که اغلب استفاده می کنید به شما امکان می دهد تا مطمئن شوید که آن نرم افزار تا آنجا که می تواند برای سایر کاربران نهایی ارزشمند است.

[تعداد: 1   میانگین: 5/5]
دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شاید دوست داشته باشید