آموزش Git  و  git-flow

آموزش Git و git-flow

گیت (git) چیست ؟
گیت(git) محیطی رو برای کاربران فراهم می کنه که اگر قطعه ای از کد های شما آسیب دید ، به راحتی بشه اون رو بازگردانی کرد . اگه افراد زیادی بخوان با هم در یک پروژه مشارکت کنند ، گیت کار اشتراک گذاری کد ها رو انجام میده و میشه با استفاده از این ابزار کد های افراد مختلف تیم رو مشاهده کرد و اگه نیاز به ویرایش و یا بازگردانی داشته باشه ، به راحتی این کار روانجام داد . با گیت حتی میشه سطح دسترسی های مختلفی رو برای توسعه دهنده ها ایجاد کرد مثلا افرادی که بخش UI پروژه رو توسعه میدن دیگه به کد های سمت سرور دسترسی نداشته باشند .
Git ابزای است که به عنوان یک توسعه دهنده امکان ندارد که درباره آن نشنیده باشید. یک سیستم کنترل ورژن که این امکان را به شما می دهد تا جزء به جزء پروزه را که شامل بسیاری از تغییرات می باشد کنترل نمایید و بدون هیچ مشکلی توسعه را به صورت گروهی ادامه دهید بدون اینکه تداخلی اتفاق بیفتد. از طرفی می توانید پروژه را در چند شاخه و البته به صورت موازی و همزمان توسعه دهید.
git init
git config --global user.name "username"
git config --global user.email "email"
git status
git status -s
git add .
git add -A
git commit -m "first commit"
git push
git pull
git commit --amend -m "new commit message"
gi checkout develop
git merge --squash
git merge --abort
git checkout -m <filename>
git diff
git diff –staged
git log
git log --oneline --reverse
git clean
git revert
git reset HEAD <filename>
git branch
git restore


git rm --cached <filename>
git restore --staged <filename>
git ls-files
 
 
 
 
git merge --squash  
یک انتخاب برای merge است که به شما اجازه می دهد تا تاریخچه Git شاخه را هنگام تکمیل یک درخواست pull فشرده کنید. به جای اینکه هر commit در شاخه به تاریخچه شاخه پیش فرض اضافه شود، یک merge اسکواش تمام تغییرات فایل را به یک کامیت جدید در شاخه پیش فرض اضافه می کند.
 

Git Reset 

با استفاده از دستور reset میتوان repository را به یک commit پیشین بازگرداند. هر تغییری پس از commit منتخب از بین خواهد رفت.

 

 Git revert  

دستور git revert را می توان به عنوان یک دستور undo شناخت. البته کاری که این دستور انجام می دهد یک undo معمولی نیست. به جای حذف Commit از تاریخچه ی پروژه، این دستور، تغییرات ایجاد شده توسط Commit را بر می گرداند و محتوای نهایی را در قالب یک Commit جدید ثبت می کند. این کار جلوی از دست رفتن تاریخچه ی گیت پروژه که اهمیت بالایی دارد را می گیرد.

 

git commit --amend -m "new commit message"

دستور commit - - amend معمولا برای ویرایش آخرین commit استفاده میشود. این دستور تغییرات موجود در staging environment را با آخرین commit ترکیب کرده و یک commit جدید ایجاد میکند. این commit جدید با آخرین commit جایگزین میشود.

 

git restore
گیت ری‌استور میاد تغییرات موقت که هنوز add نشدن رو حذف می‌کنه.

 

git clean
 git clean تا حدودی یک دستور ‘undo’ است. git clean می تواند به عنوان مکمل برای سایر دستور هایی مانند git reset و git checkout، در نظر گرفته شود. در حالی که دستور های گفته شده با فایل هایی کار می کنند که قبلا به فهرست فایل های دنبال شده توسط گیت اضافه شده اند، دستور git clean با فایل های دنبال نشده، کار می کند. فایل های دنبال نشده فایل هایی هستند که به مسیر مخزن شما اضافه شده اند اما هنوز توسط git add به فهرست دنبال شونده های git اضافه نشده اند. 
دستور git clean روش خوبی برای پاک کردن فایل های دنبال نشده در یک مخزن است. فایل های دنبال نشده فایل هایی هستند که در مخزن وجود دارند اما هنوز توسط دستور git add به گیت اضافه نشده اند. نتیجه ی دستور git clean را می توان با اجرای دستور git status مشاهده کرد.
 
 git merge
دستور git merge چندین commit را به یک تاریخچه ی واحد متصل می کند. بیشتر وقت ها دستور git merge برای ترکیب دو شاخه استفاده می شود.

Git rebase  

Rebase روش دیگری برای یکپارچه‌سازی تغییرات یک شاخه در شاخه دیگر است. Git Rebase همه تغییرات را در یک وصله (patch) منفرد فشرده می‌کند و سپس آن وصله را در شاخه مقصد ادغام می‌کند.

Rebase کردن برخلاف merge کردن، باعث از بین رفتن سابقه تغییرات می‌شود، زیرا کل کار را از یک شاخه به شاخه دیگر انتقال می‌دهد. در این فرایند سابقه شاخه، ناخواسته حذف می‌شود.

 

تفاوت rebase  و merge
تفاوت در نگه داشتن سیر تغییرات هست .rebase تمامی کامیت ها رو روی شاخه اصلی ثبت می کنه اما merge تغییرات رو در شاخه نگه می داره و فقط در یک نقطه به شاخه اصلی میرسه.
اگر سیستم کاری جوری باشه که برای هر تغییر کوچیک یک branch ایجاد می کنید بهتره به جای merge از rebase استفاده کنید تا در آینده با هزاران branch در تاریخچه commit هاتون مواجه نشید در غیر اینصورت اگه دوست دارید تغییرات همچنان به صورت شاخه های چسبیده به شاخه اصلی باقی بمونند از merge استفاده کنید.
من خودم به شخصه برای bug-fix ها از rebase و برای feature ها از merge استفاده می کنم، در نهایت نوع جریان کاری تون مشخص میکنه که از کدومش استفاده کنید.
 
Gitflow

Gitflow در واقع فقط یک ایده ی انتزاعی از گردش کار درGit است. این گردش کار مشخص می کند که چه نوع شاخه هایی ساخته شود و چگونه این شاخه ها را با هم merge کنیم. ما در این مقاله اهداف این شاخه ها را شرح خواهیم داد. مجموعه ابزار git-flow یک ابزار خط فرمان واقعی است که به نصب نیاز دارد.

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

 

شاخه master : که کدهای پروژه (در حال اجرا) قرار دارند و ممکنه همه بهش دسترسی نداشته باشند و طبق قرارداد هم کسی اجازه کامیت و پوش کردن بهش رو نداره !
شاخه develop :‌ کار بر روی پروژه از اینجا شروع میشه و توسعه دهنده ها میتونن کدهاشون رو به این قسمت پوش کنند اما این همه ماجرا نیست. اگه قرار باشه ۵ نفر همزمان روی این شاخه کار کنند ممکنه conflict به وجود بیاد پس شاخه دیگه ای هم لازم داریم:
شاخه feature: فرض کنید نیما قراره رو login کار کنه و هادی روی home پس به راحتی میتونن هر کدوم شاخه های خودشون رو داشته باشند به این شکل که feature/login و feature/home . در نهایت وقتی کار تموم شد این شاخه با شاخه develop مرج میشه و در صورتی که لازم باشه بعدا با شاخه master هم merge میشه!
شاخه hotfix:‌ فرض کنید هادی و نیما دارن روی فیچرهایی که گفته شده کار میکنن که مدیر پروژه یهو متوجه یه مشکلی تو پروژه در حال اجرا ( که طبیعاتا روی شاخه master هست) میشه و میخواد سریعا این مشکل حل بشه. پس به یه توسعه دهنده دیگه میگه این موضوع رو به سرعت حل کن!‌
این جا شاخه hotfix به وجود میاد و بدون اینکه با فیچر ها دخالتی داشته باشه از مستر و یا دولوپ یه شاخه میگیره و شروع میکنه به رفع مشکل! بعد از اینکه مشکل حل شد با master و یا develop مرج میشه. هادی و نیما هم بدون مشکل به کار خودشون ادامه میدن !
شاخه release: هم که از اسمش مشخصه! مربوط به کنترل تگ های برنامه است و مثلا وقتی پروژه به جایی رسید که قراره release بشه یک تگ بهش میخوره مثلا 2.4.1 و ...

یک نمونه از گردش کار
یک مثال کامل از گردش کار Feature Branch به صورت زیر است. فرض می کنیم یک مخزن با شاخه ی master ساخته شده است.

git checkout master
git checkout -b develop
git checkout -b feature_branch
# work happens on feature branch
git checkout develop
git merge feature_branch
git checkout master
git merge develop
git branch -d feature_branch

 

علاوه بر روند feature و انتشار، یک مثال hotfix به صورت زیر است:

git checkout master
git checkout -b hotfix_branch
# work is done commits are added to the hotfix_branch
git checkout develop
git merge hotfix_branch
git checkout master
git merge hotfix_branch

 

روند کلی گردش کار Gitflow به صورت زیر است:
1. شاخه ی develop از شاخه ی master گرفته می شود.
2. شاخه ی انتشار از شاخه ی develop گرفته می شود.
3. شاخه های feature از شاخه ی develop گرفته می شوند.
4. وقتی که کار روی یک شاخه ی feature تمام می شود، این شاخه در شاخه ی merge ،develop می شود.

5. وقتی که کار روی شاخه ی انتشار تمام می شود، این شاخه در هر دو شاخه ی develop وmaster با هم merge می شود.
6. اگر نقص در شاخه ی master شناسایی شود، یک شاخه ی hotfix از شاخه ی master گرفته می شود.
7. وقتی که نقص در شاخه ی hotfix رفع شد، این شاخه در هر دو شاخه ی develop و master ادغام می شود.

منابع:
https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow

نویسنده :
مجید پورداود
  • مجید پورداود
  • مهندس نرم افزار و تحلیلگر ارشد سیستم های کامپیوتری تحت وب می باشم. از سال 1395 برنامه نویسی را شروع کردم و به زبان های php (فریم ورک laravel -codeigniter)  و زبان جاوا اسکریپت (فریم ورک express.js-nest.js)  تسلط دارم.  

ثبت دیدگاه جدید

0 دیدگاه

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