خلاصه‌ای از مهم‌ترین دستورات Git

A Summary of the Most Important Git Commands

28 بهمن 1399
git-commands

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

نام کاربری و ایمیل

برای تنظیم نام و ایمیل خود در تنظیمات گیت باید از دو دستور زیر استفاده نمایید:

git config --global user.name “[firstname lastname]”

git config --global user.email “[valid-email]”

البته به‌جای firstname (نام کوچک)، lastname (فامیل) و valid-email (ایمیل معتبر و واقعی خودتان در Github یا Gitlab و غیره) باید مقادیر صحیح و شخصی خود را وارد کنید.

رنگ ترمینال در repo

برای اینکه بتوانید پروژه را با کمک رنگ‌ها راحت‌تر بررسی کنید باید از دستور زیر استفاده کنید:

git config --global color.ui auto

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

راه‌اندازی پروژه

برای راه‌اندازی یک پروژه‌ی جدید با گیت از دستور زیر استفاده می‌کنیم:

git init

برای کپی یک پروژه از سرورهای Github یا Gitlab از دستور زیر استفاده می‌کنیم:

git clone [url]

به طوری که به‌جای [url] آدرس واقعی این پروژه را قرار بدهید. به طور مثال:

git clone git@github.com:vuejs/vue.git

دستورات مربوط به Stage

مشاهده‌ی وضعیت پروژه:

git status

این دستور فایل‌های stage شده و نشده را نشان خواهد داد.

اضافه کردن فایل‌های تغییریافته به staging area:

git add [file]

به‌طوری که به‌جای [file] باید نام فایل مورد نظر را وارد کنید. در صورتی که به‌جای [file] فقط علامت نقطه را وارد کنید تمام فایل‌های تغییریافته وارد staging area می شوند.

برای خارج کردن فایل از staging area بدون حذف کردن تغییرات آن:

git reset [file]

برای نمایش تفاوت میان working directory و index (همان staging area):

git diff

توجه داشته باشید که این دستور تغییرات stage نشده را نمایش می‌دهد. برای نمایش تغییرات بین working directory و تغییرات stage شده باید از دستور زیر استفاده کنید:

git diff --staged

برای ثبت تغییرات (commit کردن فایل‌های درون staging area) از دستور زیر استفاده می‌کنیم:

git commit -m "[descriptive message]"

شما باید به‌جای [descriptive message] از پیام دلخواه خودتان برای توضیح commit استفاده کنید

دستورات مربوط به شاخه‌ها و ادغام

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

git branch

یک علامت ستاره (*) در کنار شاخه‌ی فعال (شاخه ای که در حال حاضر در آن هستید) نمایش داده می‌شود.

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

git branch [branch-name]

طبیعتا به‌جای [branch-name] نام شاخه‌ی جدید و مورد نظر خود را پاس می دهید.

برای رفتن به یک شاخه‌ی خاص از دستور زیر استفاده می‌کنیم:

git checkout [branch-name]

در صورتی که شاخه‌ی مورد نظر وجود نداشته باشد یک شاخه‌ی جدید برایتان ساخته می‌شود.

برای ادغام یک شاخه در شاخه‌ی فعلی به شکل زیر عمل می‌کنیم:

git merge [branch]

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

git branch -d [branch]

برای تغییر نام شاخه‌ها نیز از فلگ m استفاده می‌شود:

git branch -m [new_branch_name]

دستورات مربوط به بررسی و مقایسه

برای نمایش تمام commit‌ها و تاریخچه‌ی آن‌ها از دستور log استفاده می‌شود:

git log

برای نمایش تمام commit‌های شاخه‌ی A که در شاخه‌ی B نیستند:

git log branchB..branchA

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

git log --follow [file]

نمایش تفاوت بین شاخه‌ی A و B به طوری که در شاخه‌ی A باشند اما در شاخه‌ی B نباشند:

git diff branchB...branchA

نمایش هر شی‌ای در Git به صورتی که برای انسان خوانا باشد:

git show [SHA]

طبیعتا به‌جای SHA باید هش آن شیء را قرار بدهید.

دستورات مربوط به تغییر مسیر

حذف یک فایل از پروژه و stage کردن این تغییر برای commit بعد:

git rm [file]

تغییر مسیر یک فایل و stage کردن این تغییر برای commit بعد:

git mv [existing-path] [new-path]

در مسیر بالا existing-path همان آدرس فعلی فایل و existing-path آدرس جدید فایل پس از جابه‌جایی است.

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

git log --stat -M

نادیده‌گرفتن برخی از فایل‌ها

در صورتی که می‌خواهید فایل‌ها یا پوشه‌هایی تحت نظر گیت نباشند باید از فایل gitignore. استفاده کنید. یک مثال ساده:

logs/

*.notes

pattern*/

در صورتی که می‌خواهید این فایل‌ها یا پوشه‌ها در تمام پروژه‌ها (نه فقط پروژه‌ی فعلی) نادیده گرفته شوند از دستور زیر استفاده می‌کنیم:

git config --global core.excludesfile [file]

دستورات مربوط به اشتراک‌گذاری و به‌روزرسانی

اضافه کردن یک آدرس remote (مثلا یک پروژه‌ی گیت لب) به پروژه‌ی فعلی:

git remote add [alias] [url]

به طوری که به‌جای [alias] یک نام دلخواه و به‌جای [url] آدرس یک repo را قرار بدهید.

برای دریافت اطلاعات از یک شاخه‌ی remote (روی سرور) و ادغام آن در پروژه‌ی محلی خود:

git fetch [alias] [branch]

ادغام یک شاخه‌ی remote (روی سرور) با شاخه‌ی فعلی و محلی شما برای به‌روزرسانی آن:

git merge [alias]/[branch]

ارسال شاخه‌های محلی (و داده هایشان) به یک پروژه‌ی remote:

git push [alias] [branch]

دریافت و ادغام تمام commit‌ها از شاخه‌ی remote متناظر:

git pull

تصحیح اشتباهات در سناریوهای مختلف

سناریو ۱: به تازگی دستور git push را اجرا کرده‌اید تا پروژه‌ی remote به‌روزرسانی شود اما متوجه شده‌اید که یکی از commit‌ها مشکل داشته است. برای برگرداندن این commit از دستور revert استفاده می‌کنیم:

git revert <SHA>

دستور revert commit مورد نظر شما را دقیقا برعکس می‌کند (هر چیزی حذف شده باشد اضافه شده و هر چیزی اضافه شده باشد حذف می‌شود) و سپس یک commit جدید را ثبت می‌کند. حالا می‌توانید این commit جدید را push کنید. البته به‌جای SHA می‌توانید از نام فایل یا پوشه نیز استفاده کنید:

git revert [file/directory]

سناریو ۲: در پیام commit قبلی چیزی را اشتباه نوشته اید و حالا باید آن را تصحیح کنید. برای حل این مشکل از دستور زیر استفاده می‌کنیم:

git commit --amend -m "Commit Message"

فلگ ammend-- باعث می‌شود که این commit، تمام تغییرات جدید را گرفته (طبیعتا فقط آنهایی را که در staging area باشند) و با تغییرات آخرین commit جمع می‌کند. به زبان ساده تر git commit --amend باعث جایگزین شدن آخرین commit با commit دیگری می‌شود. طبیعتا اگر هیچ تغییر stage شده ای نداشته باشید چیزی برای ادغام کردن وجود ندارد بنابراین فقط پیام آخرین commit بازنویسی می‌شود.

سناریو ۳: شما به اشتباه فایل‌هایی را ذخیره کرده‌اید و سپس ویرایشگر خود را بسته‌اید. این فایل‌ها در staging area نیستند و فقط در working directory شما قرار دارند. چطور می‌توانیم آن‌ها را به حالت قبل برگردانیم؟

git checkout -- <bad filename>

به‌جای <bad filename> باید نام فایل مورد نظر را بدهید. توجه داشته باشید که این دستور وضعیت فایل‌های شما را به آخرین نسخه‌ی شناخته شده توسط گیت برمی‌گرداند (به HEAD) اما شما می‌توانید یک SHA مخصوص را نیز به‌جای نام فایل بدهید.

هشدار: هر تغییری که به این شکل داده شود به طور کامل از بین می‌رود و دیگر بازگشت به آن ممکن نیست. قبل از استفاده از این دستور به خوبی فکر کنید.

سناریو ۴: تغییرات محلی را در کد داده‌اید اما بعدا متوجه شده‌اید که تمام این تغییرات مشکل دارند و می‌خواهید چند commit آخر را حذف کنید، طوری که انگار اصلا اتفاق نیفتاده‌اند (در سناریو قبلی چیزی را commit نکرده بودیم اما اینجا commit داریم). در این حالت باید از یکی از دو دستور زیر استفاده کنید:

git reset <last good SHA>

git reset --hard <last good SHA>

به‌جای <last good SHA> باید هش آخرین commit موردنظرتان را قرار بدهید. دستور git reset شما را به commit مشخص شده برمی گرداند طوری که انگار اصلا commit‌های قبلی وجود نداشته اند اما تغییرات در working directory را از بین نمی برد. از طرف دیگر دستور git reset --hard باعث می‌شود که تغییرات working directory نیز از بین رفته و به وضعیتشان در آخرین commit برگردند.

سناریو ۵: شما از دستور git reset --hard استفاده کرده‌اید تا تغییرات خاصی را از بین ببرید اما حالا پشیمان شده‌اید و می‌خواهید دوباره به همان وضعیت قبلی برگردید. در ابتدا از دستور زیر برای مشاهده‌ی تاریخچه‌ی پروژه و به دست آوردن Hash‌ها استفاده می‌کنیم:

git reflog

تفاوت reflog با log این است که git log تنها لیستی از commit‌ها را نشان می‌دهد اما git reflog لیستی از تغییرات HEAD را نمایش می‌دهد. در مرحله‌ی بعد یکی از این حالت‌ها را خواهید داشت:

  • اگر می‌خواهید پروژه را به commit خاصی برگردانید از <git reset --hard <SHA استفاده می‌کنیم.
  • اگر می‌خواهید فقط یک یا چند فایل را به commit خاصی برگردانید بدون اینکه تاریخچه‌ی پروژه را دستکاری کنید از <git checkout <SHA> -- <filename استفاده کنید.

سناریو ۶: شما چند commit روی master داشته‌اید اما پشیمان شده‌اید و می‌خواهید این commit‌ها روی شاخه‌ی دیگری به نام feature باشند نه روی master. برای حل این مشکل ابتدا دستور git branch feature را اجرا می‌کنیم تا شاخه‌ی جدیدی به نام feature ساخته شود. در این مرحله شاخه‌ی feature ساخته می‌شود اما هنوز در master هستیم و شاخه را تغییر نداده‌ایم اما شاخه‌ی جدید به آخرین commit شما اشاره می‌کند. در مرحله‌ی بعدی دستور git reset --hard origin/master را اجرا می‌کنیم تا شاخه‌ی master به origin/master برگردد (پروژه‌ی remote و قبل از تمام commitهای جدید شما). نگران نباشید، برگشتن به commit‌های قبلی باعث حذف commitهای جدید نمی‌شود. درنهایت دستور git checkout feature را اجرا می‌کنیم تا به شاخه‌ی feature رفته و تمام تغییرات جدید نیز به این شاخه بیاید.

طبیعتا برگرداندن اشتباهات با Git مبحثی بسیار طولانی است و این سناریوها فقط چند مورد از حالت‌های رایج هستند.


منابع: وب‌سایت‌های phoenixnap و github

نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.