آشنایی با سامانه کنترل نسخه گیت (Git) - بخش سوم

گاهی لازم است که بخشی از فایل‌های مورد نیاز در فرآیند توسعه برنامه یا مرجع‌های متنی و محتوایی پروژه را در محلی مشترک با مخزن گیت خود نگهداری کنید و در این حالت، کاملاً طبیعی است که نخواهید این فایل‌ها ردیابی شوند. با توجه به این که به مرور زمان، شمار این موارد ذکر شده بالا می‌رود، بدیهی است حذف آن‌ها از فهرست ردیابی مخرن به صورت دستی بسیار وقت‌گیر و همراه با احتمال اشتباه است. برای پاسخ به این مسأله راهی الگو-محور وجود دارد: gitignore.

پس از بررسی موضوع بالا، آماده هستیم تا خط زمانی مخزن را که با کامیت‌ها در طی زمان تشکیل می‌شود، بررسی کنیم و در صورت نیاز آن تغییرات را به حالت اول برگردانیم.

فهرست استثنائات مخزن

گیت برای مستثنی کردن مواردی که به هر دلیلی نگهداری نسخ آن‌ها بیهوده یا دارای ملاحظات خاصی است، از فایلی بی‌نام با پسوند gitignore استفاده می‌کند. این فایل شامل الگوهایی است که با استفاده از «نام» فایل‌ها، آن ها را دسته‌بندی کرده و موارد استثنا شده را معین می‌کند. این فهرست برای مستثنی کردن تمامی فایل‌هایی که در هنگام ساخت (Build Artifacts) و زمان اجرای برنامه (Runtime Artifacts) مورد استفاده قرار می‌گیرند، مانند انواع فایل‌های دودویی (Binary) و لاگ(Log)های برنامه سودمند است.

ایجاد فایل Gitignore

بیایید فرض کنیم پوشه مخزن علاوه بر فایلی که تا کنون از آن استفاده کرده‌ایم، دارای یک لاگ به نام monitor نیز باشد که هنوز ردیابی نشده است. بنابراین خروجی دستور ls در ترمینال مسیر مخزن، مانند زیر خواهد بود:

monitor.log		new_file.txt

و با فرض آن که محتویات آن با دستور cat به صورت زیر باشد:

 This is my log file and I want it to be ignored permanently.

اگر همان گونه که پیش‌تر ذکر شد، با دستور مربوطه وضعیت مخزن را بررسی نمایید؛ چنین خروجی مشاهده خواهید کرد:

On branch master
Untracked files:
	monitor.log

حال با ویرایشگر vi یا nano فایل gitignore را ایجاد می‌کنیم:

vi .gitignore 
یا
nano .gitignore

درون فایل این خط را وارد و فایل را ذخیره کنید:

*.log

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

On branch master
Untracked files:
	.gitignore

الگوهای مستثنی‌سازی در فایل Gitignore

  • علامت / (slash, forward slash) در ابتدای الگو، تأثیر آن را تنها بر روی همان دایرکتوری که فایل gitignore در آن قرار دارد، می‌گذارد.
  • علامت / در انتهای الگو، تعیین‌کننده پوشه‌های دایرکتوری gitignore است.
  • علامت * (ستاره) نشان‌دهنده صفر یا شمار بیشتری از کاراکتر است.

برای مثال، خطوط زیر به ترتیب فایل‌های لاگ و باینری را از ردیابی مستثنی می‌کنند:

*.log
*.bin 
  • علامت ! (تعجب) سبب نقض الگو می‌شود (فرض کنید در انتهای فایل بالا monitor.log را افزوده و پیش از آن علامت تعجب بگذاریم. این کار سبب می‌شود تا الگوی مذکور نادیده گرفته شود و این لاگ مستثنی نگشته و توسط مخزن ردیابی گردد).
  • دو علامت * بدون فاصله (**) سبب می‌شود تا الگو بر روی تمامی زیرپوشه‌های یک دایرکتوری اعمال گردد.

در توضیح مورد آخر، به طور مثال، الگوی زیر سبب مستثنی شدن تمامی فایل‌های متنی در تمامی زیرپوشه‌های دایرکتوری help از ردیابی مخزن می‌گردد:

help/**/*.txt

شایان ذکر است در صورت نیاز به توضیحات اضافی درون فایل، از علامت هش (#) در ابتدای خطوط استفاده کنید.

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

بررسی تاریخچه ی مخزن

برای بررسی خط زمانی کامیت‌های انجام شده، که به کاربر کمک می‌کند تا به صورت روزنامه‌وار تغییرات صورت گرفته در مخرن را ببیند؛ از دستور زیر استفاده می‌کنیم:

git log

آن چه که لاگ به ما نشان می‌دهد، شامل موارد زیر است:

  • هش کامیت (شناسه‌ای برای تمایز و نشانه‌گذاری کامیت ها)؛
  • اقدام کننده (کامیت کننده)؛
  • پیام مربوط به کامیت؛
  • و در آخر تاریخی که برای نهایی‌شدن تغییرات اقدام شده است.

پس از اجرای دستور، به طور مثال، باید چنین چیزی در خروجی مشاهده کنید:

commit ca82a6dff817ec66f44342007202690a93763949
Author: Abtin Shayegan <abtinshayegan@gmail.com>
Date:   Mon Mar 22 21:52:11 2021 -0700

    Change in some files

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Abtin Shayegan <abtinshayegan@gmail.com>
Date:   Sat Mar 20 16:40:33 2021 -0700

    Remove unnecessary files

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Abtin Shayegan <abtinshayegan@gmail.com>
Date:   Sat Mar 20 10:31:28 2021 -0700

    Initial commit

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

commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)

پرچم‌های مهم برای دستور لاگ

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

git log -<شمار کامیتهای نمایشی به صورت عدد طبیعی>

به طور مثال دستور زیر 5 مورد آخر تاریخچه را نشان می‌دهد:

git log -5

پرچم p مخفف patch بوده و با جزئیات بیشتری تغییرات اعمالی را نشان می‌دهد:

git log -p

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

git log --pretty=oneline
git log --pretty=full
git log --pretty=fuller

پرچم‌های زمانی هم موجودند. دو دستور زیر تاریخچه مخزن را به ترتیب از و تا دو ماه از زمان حاضر نمایش می‌دهند:

git log --since "2 months"
git log --until "2 months"

در آخر نیز خالی از لطف نیست اگر پرچم graph را معرفی کنیم که به لاگ مخزن یک نمایش نموداری اضافه می‌کند:

git log --graph

بازگرداندن تغییرات و اشتباهات

اغلب پیش می‌آید که ما نیاز پیدا می‌کنیم تا اشتباهاتی را که در کامیت‌های قبلی مرتکب شدیم را تصحیح کنیم. این اشتباهات ممکن است در پیام یا محتوای کامیت رخ داده باشند. البته ما این امکان را داریم که هر تعداد از کامیت‌ها را که بخواهیم به طور کامل از تاریخچه حذف کنیم.

افزودن فایل جامانده یا تغییر فایل موجود و به‌روز‌رسانی آخرین کامیت

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

git commit --amend

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

بازنشانی یک کامیت و برگرداندن تغییرات اعمالی

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

git revert <هش کامیت موردنظر>

فهرست مقالات:

مقاله بعدی: