برنامه‌نویسی

آموزش استفاده از Git


۲۲ تیر ۱۳۹۹
آموزش استفاده از Git

تیم‌های توسعه و مدیران پروژه‌های متن‌باز زیادی برای مدیریت کد پروژه‌شان از Git استفاده می‌کنند. Git یک سیستم مدیریت نسخه توزیع شده است که به اعضای پروژه و حتی سایرین اجازه مشارکت در یک پروژه را می‌دهد.

این مقاله راهنمایی برای دستورات مفید و کاربردی Git است که به هنگام کار با هر مخزن یا repository می‌توانید از آن‌ها استفاده کنید. قبل از شروع مطمئن شوید که Git را بر روی سیستم خود نصب کرده باشید، اگر Git را نصب ندارید می‌توانید به وبسایت Git مراجعه کنید و با توجه به سیستم عامل خود آن را دانلود و نصب کنید.

راه‌اندازی اولیه:

پس از نصب Git بر روی سیستم خود می‌توانید نسخه آن را توسط دستور زیر بررسی کنید همچنین از این که Git به درستی بر روی سیستم شما نصب شده است، اطمینان حاصل کنید:

git --version

با دستور زیر می‌توانید در پوشه پروژه‌ای که در آن قصد استفاده از Git را دارید، مخزن Git جدیدی را ایجاد کنید:

git init

برای کپی کردن یک مخزنی که به طور مثال بر روی Github و یا Gitlab قرار دارد، به سیستم خود از دستور زیر استفاده کنید برای این کار تنها به آدرس آن مخزن نیاز دارید:

git clone https://www.github.com/username/repo-name

همچنین برای مشاهده آدرس remote یک مخزن دستور زیر به کمک شما خواهد آمد (منظور از آدرس remote، آدرس و یا URL مخزن در جایی مثل Github است.):

git remote

با استفاده از سوییچ v می‌توانید اطلاعات بیشتری در رابطه با remote ببینید:

git remote -v

به طور مثال شما پروژه‌ای را fork کرده‌اید، برای افزودن آدرس remote پروژه اصلی می‌توانید یک upstream remote اضافه کنید:

git remote add upstream https://www.github.com/username/original-repo

Staging

وقتی تصمیم می‌گیرید فایلی که تغییر کرده است، در commit بعدی شما باشد، این فایل ابتدا باید stage شود. برای مشاهده وضعیت مخزن خود و اینکه چه فایل‌هایی stage شده‌اند و این که کدام فایل‌ها stage نشده‌اند از دستور زیر استفاده کنید:

git status

برای stage کردن یک فایل می‌توانید از دستور git add استفاده کنید. به عبارتی بعد از هر تغییر در یک فایل، اگر قصد داشته باشید که تغییرات جدید در commit باشند باید این دستور را اجرا کنید. مثال زیر نحوه استفاده از این دستور هنگامی است که قصد دارید یک فایل را stage کنید:

git add my_script.py

اگر قصد دارید تمام فایل‌های تغییر یافته و یا جدید یک پوشه را stage کنید می‌توانید از دستور زیر، هنگامی که در آن پوشه هستید استفاده کنید:

git add .

و زمانی که می‌خواهید تمام فایل‌های تغییر یافته و یا جدید یک مخزن را stage کنید:

git add -A

فرض می‌کنیم فایلی را به اشتباه stage کرده‌اید، برای بازگشت به حالت قبل و خارج کردن این فایل از stage دستور زیر استفاده می‌شود:

git reset my_script.py

Committing

پس از این که تغییرات جدید خود را stage کردید، حالا نوبت به commit کردن آن‌ها می‌رسد. با این کار تمام تغییراتی که ایجاد کردید در مخزن Git ذخیره می‌شود. برای commit کردن از دستور زیر و سوییچ m به جهت تعیین یک پیام (که این پیام می‌تواند توضیحاتی برای تغییرات انجام شده در این commit باشد.) استفاده می‌کنیم:

git commit -m “Commit message.”

همچنین می‌توانید برای stage کردن و commit کردن در یک زمان، از دستور نیز استفاده کنید:

git commit -am “Commit message.”

شاید حالتی پیش آید که متن پیام آخرین commit شما اشتباه باشد و یا نیاز به اصلاح داشته باشد و یا حتی فراموش کرده باشید فایلی را به این commit اضافه کنید، در این وضعیت بعد از stage کردن فایلی که فراموش کرده‌اید، می‌توانید از دستور زیر استفاده کنید:

git commit --amend -m “New commit message.”

Branches

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

برای مشاهده تمام branch‌های یک مخزن از دستور زیر استفاده کنید (توجه کنید branch که در حال کار کردن بر روی آن هستید، با یک * در سمت چپ اسم branch نشان داده می‌شود.) :

git branch

دستور زیر برای ایجاد یک branch جدید استفاده می‌شود، به این نکته هم توجه داشته باشید بعد از ایجاد branch همچنان در branch قبلی هستید و به branch جدید منتقل نمی‌شوید:

git branch new-branch

دستور زیر هم به جهت تغییر branch استفاده می‌شود:

git checkout another-branch

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

git checkout -b new-branch

شاید تصمیم‌تان عوض شد و در نظر داشتید که نام یک branch را تغییر دهید:

git branch -m current-branch-name new-branch-name

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

git merge branch-name

اما اگر کدهای دو branch که قصد merge کردن آن‌ها را دارید، دارای مغایرت‌هایی با یکدیگر بودند و یا حتی از merge کردن پشیمان شده‌اید، با دستور زیر می‌توانید به حالت قبل بروید:

git merge --abort

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

git cherry-pick f7649d0

بعد از merge کردن یک branch دیگر نیازی به وجود آن branch نیست. پس با دستور زیر می‌توانید این branch را حذف کنید:

git branch -d branch-name

و یا حتی اگر لازم باشد که یک branch را بدون merge کردن، حذف کنید، باید از سوییچ D استفاده کنید:

git branch -D branch-name

Collaborate and Update

برای دریافت تغییرات از یک مخزن دیگر،‌به طور مثال upstream که در قسمت git remote اضافه کردیم، می‌توانید از دستور fetch استفاده کنید:

git fetch upstream

بعد از دریافت تغییرات و برای merge کردن آن‌ها با branch master دستور زیر را وارد کنید:

git merge upstream/master

بعد از انجام تغییرات و commit کردن آن‌ها در سیستم خودتان، حالا نیاز است که این تغییرات را به مخزن در remote نیز منتقل کنیم:

git push origin master

برای بروزرسانی و یا دریافت تغییرات جدیدی که برای مثال توسط همکاران شما بر روی پروژه صورت گرفته، از دستور زیر بهره بگیرید:

git pull origin master

Inspecting

نمایش تاریخچه commit‌ها و تغییرات یک branch (بعد از تغییر branch به branch مدنظرتان):

git log

برای مشاهده commit‌ها و تغییرات مربوط به یک فایل از دستور زیر استفاده کنید:

git log --follow my_script.py

همچنین برای مشاهده commit‌هایی که در یک branch وجود دارد اما در دیگری نه، با توجه به نام branch‌هایتان از دستور زیر استفاده کنید:

git log a-branch..b-branch

به جهت مشاهده تمام تغییرات و عملیات‌های انجام شده در مخزن، نظیر pull، push، rebase و …، از reflog استفاده کنید:

git reflog

به جهت مشاهده اطلاعات بیشتر و خواناتر یک commit، از دستور show به همراه commit hash استفاده کنید:

git show de7545

مشاهده تغییرات و تفاوت‌ها

از دستور git diff برای مشاهده تغییرات و یا تفاوت‌ها میان commit‌ها و حتی branch‌ها می‌توانید استفاده کنید. برای کسب اطلاعات بیشتر در رابطه با git diff، به این لینک مراجعه کنید. دستور زیر تغییرات و تفاوت‌های فایل‌هایی که در stage شده‌اند را نمایش می‌دهد:

git diff --staged

همچنین مشاهده تغییرات و تفاوت‌های میان دو branch نیز از طریق استفاده از دستور زیر امکان‌پذیر است:

git diff a-branch..b-branch

اگر بخواهید تنها تفاوت میان دو commit را مشاهده کنید، از commit hash آن‌ها و git diff استفاده کنید:

git diff 61ce3e6..e221d9c

Stashing

گاهی اوقات نیاز شرایطی پیش می‌آید که تغییراتی در پروژه ایجاد و یا حتی قابلیت جدیدی اضافه کرده‌اید، اما قبل از اینکه کار بر روی این تغییرات و یا قابلیت را به پایان برسانید، نیاز است تا بر روی بخش دیگری کار کنید. در عین حال آماده commit کردن این تغییرات نیستید و همچنین نمی‌خواهید که کدتان را از دست بدهید. در این وضعیت می‌توانید از دستور git stash استفاده کنید تا تغییرات فعلی خود را ذخیره کنید و در زمان مناسب آن‌ها را به پوشه پروژه بازگردانید و commit کنید. برای stash کردن تغییرات فعلی از دستور زیر استفاده کنید:

git stash

مشاهده فایل‌های stash شده:

git stash list

Stash‌های شما به این شیوه نام گذاری می‌شوند:

 stash@{0} ,stash@{1}, ...

برای مشاهده اطلاعات در رابطه با یک stash، از این دستور استفاده کنید:

git stash show stash@{0}

خارج‌کردن فایل‌ها از stash در حالی که stash حذف نشود:

git stash apply stash@{0}

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

git stash pop stash@{0}

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

git stash drop stash@{0}

و اگر تعدادی stash دارید که به هیچ کدام از آن‌ها نیازی ندارید، با دستور زیر می‌توانید همه آن‌ها را حذف کنید:

git stash clear

Ignoring Files

شاید گاهی اوقات نیاز داشته باشید برخی از فایل‌ها یا پوشه‌ها تنها در لوکال و سیستم شما وجود داشته باشد و وقتی از git push استفاده می‌کنید، این فایل‌ها و پوشه‌ها به مخزن remote منتقل نشوند. مثل فایل‌هایی که شامل اطلاعات خصوصی شما نظیر نام‌کاربری و رمز عبور شماست که تنها لازم است در لوکال وجود داشته باشد. در این حالت می‌توانید از فایل gitignore استفاده کنید (توجه کنید که نام این فایل با یک . شروع می‌شود.)، به این صورت که نام هر فایل یا پوشه‌ای که می‌خواهید توسط Git نادیده گرفته شود را به این فایل اضافه می‌کنید و هر خط این فایل شامل یک یا چند فایل و پوشه می‌شود. می‌توانید از ویرایشگری نظیر vi و یا nano برای ویرایش این فایل استفاده کنید:

nano .gitignore

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

Rebasing

Rebase به شما این اجازه را می‌دهد که commit‌های یک branch را به branch دیگری منتقل کنید. در واقع commit‌هایی که یک branch بر اساس آن بنا شده‌است را تغییر دهیم. با استفاده از این قابلیت می‌توانید تمام commit‌های یک branch را به یک commit تبدیل کنیم (squash).

می‌توانید rebase را مشخص کردن تعداد commit‌ها انجام دهیم. به طور مثال در دستور زیر ۵ commit آخر را rebase می‌کنیم:

git rebase -i HEAD~5

در مثال بالا i به تعاملی یا interactive بودن مراحل rebase اشاره می‌کند. HEAD هم به آخرین commit در branch master اشاره می‌کند.

حتی می‌توانید با استفاده از متن پیام یک commit و یا hash آن rebase را انجام دهید:

git rebase -i 074a4e5

زمانی که commit‌ها را squash کردید، می‌توانید rebase کردن branch خود را در آخرین نسخه پروژه تکمیل کنید:

git rebase upstream/master

همچنین برای rebase کردن commit‌های یک branch با master از دستور زیر استفاده کنید:

git rebase master my-branch

در این حالت Git عملیات rebase را آغاز می‌کند و تلاش می‌کند تا commit‌های my-branch را به آخرین نسخه و یا آخرین commit در master بروزرسانی کند. در این حین اگر مغایرت یا conflict وجود داشته باشد، بعد از برطرف کردن این مغایرت‌ها از دستور زیر برای ادامه rebase استفاده کنید:

git rebase --continue

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

git rebase --abort

برای اطلاعات در رابطه با نحوه rebase کردن و بروزرسانی Pull Request به این لینک مراجعه کنید.

Resetting

گاهی اوقات، حتی بعد از rebase کردن، نیاز دارید تا تمام کارهایی که انجام داده‌اید را reset و یا بازگردانی کنید. در Git می‌توانید به یک commit مشخص بازگردید و تمام تغییرات حال حاضر بعد از commit مشخص شده شما، حذف خواهد شد:

git reset --hard 1fc6665

برای push کردن آخرین commit‌تان به origin (آدرس اصلی remote مخزن) نیاز دارید تا از سوئیچ force استفاده کنید. توجه داشته باشید که force push کردن در master معمولا کار درستی نیست، مگر این که دلیل منطق و مهمی برای این کار وجود داشته باشد. هنگامی بر روی مخازن خود کار می‌کنید با ملایمت و دقت این کار را انجام دهید، همچنین هنگامی که در حال مشارکت در پروژه‌ای هستید، از انجام چنین کاری پرهیز کنید.

git push --force origin master

برای تمیز سازی branch که در حال کار بر روی آن هستید، با حذف‌کردن فایل‌ها و پوشه‌هایی از مخزن که track نشده‌اند، از دستور زیر استفاده کنید:

git clean -f -d

اگر نیاز داشته باشید مخزن‌تان بر روی لوکال را طوری تغییر دهید که مانند مخزن شما در remote upstream شود (به طور مثال تغییرات زیادی ایجاد کردید و در همین حال مغایرت‌های زیادی وجود دارد و شما نیاز دارید که به حالت اصلی و اولیه، قبل از این تغییرات بازگردید.)، باید hard reset انجام دهید.

به این نکته توجه داشته باشید که مخزن لوکال شما به کل مثل مخزن شما در upstream می‌شود و حتی اگر commit داشته باشید که آن را push نکرده‌اید، آن‌ها هم حذف خواهند شد.

git reset --hard upstream/master

جمع‌بندی

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

git --help

همچنین برای دریافت اطلاعات بیشتر می‌توانید به مستندات Git مراجعه کنید.
منبع: https://dev.to/digitalocean/how-to-use-git-a-reference-guide-6b6