Chapters ▾ 2nd Edition

A3.3 پیوست C: دستورات گیت (Git Commands) - نمونه‌برداری پایه‌ای (Basic Snapshotting)

نمونه‌برداری پایه‌ای (Basic Snapshotting)

برای جریان کاری پایه‌ایِ صحنه‌بندی (staging) محتوا و commit کردن آن به تاریخچه، تنها چند دستور پایه وجود دارد.

افزودن به گیت (git add)

دستور git add محتوا را از شاخه کاری (working directory) به ناحیهٔ صحنه‌بندی (یا «index») برای commit بعدی اضافه می‌کند. وقتی دستور git commit اجرا می‌شود، به‌طور پیش‌فرض تنها به این ناحیهٔ صحنه‌بندی نگاه می‌کند، بنابراین از git add برای تعیین دقیق آنچه می‌خواهید اسنپ‌شات (snapshot) commit بعدی شما شبیه آن باشد استفاده می‌شود.

این دستور در گیت اهمیت بسیار زیادی دارد و در کتاب بارها نام برده یا استفاده شده است. ما سریعاً برخی از کاربردهای منحصربه‌فرد آن را که می‌توان یافت، مرور خواهیم کرد.

ابتدا دستور git add را به‌طور مفصل معرفی و توضیح می‌دهیم (دنبال کردن فایل های جدید (Tracking New Files)).

نحوهٔ استفاده از آن برای حل تعارض‌های merge را در مرج کانفیلیکت پایه (Basic Merge Conflicts) بیان می‌کنیم.

نحوهٔ به‌کارگیری آن برای مرحله‌بندی تعاملی و انتخاب تنها بخش‌های مشخصی از یک فایل تغییر یافته را در مرحله‌بندی تعاملی (Interactive Staging) مرور می‌کنیم.

در پایان، پیاده‌سازی سطح پایینِ آن را شبیه‌سازی می‌کنیم تا ایده‌ای از کارهای داخلی که پشت صحنه انجام می‌دهد به‌دست آورید (درخت اشیاء (Tree Objects)).

وضعیت گیت (git status)

دستور git status وضعیت‌های مختلف فایل‌ها در دایرکتوری کاری و ناحیهٔ مرحله‌بندی را نشان می‌دهد: کدام فایل‌ها تغییر کرده و هنوز مرحله‌بندی نشده‌اند و کدام‌ها مرحله‌بندی شده ولی هنوز ثبت (commit) نشده‌اند. در حالت معمول، همچنین چند راهنمایی پایه‌ای دربارهٔ چگونگی جابجایی فایل‌ها بین این وضعیت‌ها نمایش می‌دهد.

ابتدا status را در بررسی وضعیت فایل های شما (Checking the Status of Your Files) پوشش می‌دهیم، هم فرم‌های پایه‌ای و هم فرم‌های ساده‌شدهٔ آن. هرچند در سراسر کتاب از آن استفاده می‌کنیم، عملاً هر کاری که با دستور git status می‌توانید انجام دهید در آنجا توضیح داده شده است.

(git diff)

دستور git diff وقتی به‌کار می‌رود که بخواهید تفاوت بین هر دو درخت (tree) را ببینید. این می‌تواند تفاوت بین محیط کاری شما و ناحیهٔ مرحله‌بندی (git diff بدون آرگومان)، بین ناحیهٔ مرحله‌بندی و آخرین commit شما (git diff --staged) یا بین دو commit (git diff master branchB) باشد.

ابتدا کاربردهای پایهٔ git diff را در مشاهده تغییرات آماده و آماده‌نشده (Viewing Your Staged and Unstaged Changes) بررسی می‌کنیم، جایی که نشان می‌دهیم چه تغییراتی مرحله‌بندی شده‌اند و کدام‌ها هنوز مرحله‌بندی نشده‌اند.

از آن برای جستجوی احتمال مشکلات فاصله‌گذاری (whitespace) پیش از commit با گزینهٔ --check در راهنمایی‌های کامیت (Commit Guidelines) استفاده می‌کنیم.

همچنین می‌بینیم چگونه می‌توان تفاوت بین شاخه‌ها را مؤثرتر با نحو git diff A…​B بررسی کرد (تشخیص تغییرات ایجاد شده (Determining What Is Introduced)).

ما از آن برای فیلتر کردن اختلاف‌های فضای سفید با گزینه -b و برای مقایسهٔ مراحل مختلف فایل‌های درگیر (conflicted) با گزینه‌های --theirs، --ours و --base در <<_advanced_merging>> استفاده می‌کنیم.

در نهایت، از آن برای مقایسهٔ مؤثر تغییرات زیرمدول‌ها با --submodule در شروع با سابماژول ها (Starting with Submodules) استفاده می‌کنیم.

ابزار مقایسه تغییرات گیت (git difftool)

دستور git difftool به‌سادگی یک ابزار خارجی را اجرا می‌کند تا تفاوت بین دو درخت را به شما نشان دهد، در صورتی که بخواهید از چیزی غیر از دستور داخلی git diff استفاده کنید.

ما فقط به‌طور مختصر در مشاهده تغییرات آماده و آماده‌نشده (Viewing Your Staged and Unstaged Changes) به این موضوع اشاره کرده‌ایم.

ثبت تغییرات در گیت (git commit)

دستور git commit همهٔ محتوای فایل‌هایی را که با git add وارد staging شده‌اند می‌گیرد، یک تصویر (snapshot) دائمی جدید در پایگاه داده ثبت می‌کند و سپس اشاره‌گر شاخهٔ جاری را به آن منتقل می‌کند.

ما ابتدا اصول پایهٔ commit کردن را در کامیت کردن تغییراتتان (Committing Your Changes) بررسی می‌کنیم. در آنجا نشان می‌دهیم چگونه با استفاده از گزینه -a می‌توان در گردش‌های کاری روزمره از مرحله git add صرف‌نظر کرد و چگونه با گزینه -m پیام commit را از خط فرمان ارسال کرد به‌جای اینکه ویرایشگر باز شود.

در بازگرداندن تغییرات (Undoing Things) از گزینه --amend برای بازنویسی آخرین commit صحبت می‌کنیم.

در شاخه‌ها در یک نگاه (Branches in a Nutshell) با جزئیات بیشتری توضیح می‌دهیم که git commit چه کاری انجام می‌دهد و چرا این کار را به آن شکل انجام می‌دهد.

ما نحوهٔ امضای رمزنگاری‌شدهٔ commitها با گزینه -S را در امضای کامیت‌ها (Signing Commits) بررسی کردیم.

در نهایت، نگاهی می‌اندازیم به اینکه دستور git commit در پس‌زمینه چه کاری انجام می‌دهد و در عمل چگونه پیاده‌سازی شده است، در کامیت اشیاء (Commit Objects).

بازنشانی در گیت (git reset)

دستور `git reset` عمدتاً برای بازگرداندن تغییرات استفاده می‌شود، همان‌طور که از فعل آن هم می‌توان حدس زد. این دستور اشاره‌گر HEAD را جابه‌جا می‌کند و در صورت نیاز می‌تواند index یا ناحیه استیج را تغییر دهد و همچنین در صورت استفاده از `--hard` می‌تواند دایرکتوری کاری را هم تغییر دهد. این گزینهٔ آخر باعث می‌شود در صورت استفادهٔ نادرست، امکان از دست رفتن کار شما وجود داشته باشد، پس قبل از استفاده آن را خوب بفهمید.

ما ابتدا ساده‌ترین کاربرد git reset را در لغو آماده‌سازی یک فایل آماده‌شده (Unstaging a Staged File) مطرح می‌کنیم، جایی که از آن برای برداشتن فایل‌هایی که با git add به استیج اضافه کرده‌ایم استفاده می‌کنیم.

سپس این دستور را با جزئیات زیادی در بازنشانی به زبان ساده (Reset Demystified) بررسی می‌کنیم که کاملاً به توضیح این دستور اختصاص دارد.

ما از git reset --hard برای لغو یک merge در لغو ادغام (Aborting a Merge) استفاده می‌کنیم، جایی که همچنین از git merge --abort استفاده شده است که در واقع تا حدی پوششی برای دستور git reset است.

حذف فایل در گیت (git rm)

دستور git rm برای حذف فایل‌ها از ناحیه استیج و دایرکتوری کاری در گیت به کار می‌رود. این دستور شباهت به git add دارد، با این تفاوت که حذف یک فایل را برای commit بعدی استیج می‌کند.

ما دستور git rm را با جزئیات در حذف فایل ها (Removing Files) پوشش داده‌ایم، از جمله حذف بازگشتی فایل‌ها و نیز فقط حذف فایل‌ها از ناحیه استیج ولی باقی گذاشتن آن‌ها در دایرکتوری کاری با گزینهٔ --cached.

تنها کاربرد متفاوت دیگری از git rm در کتاب در حذف اشیاء (Removing Objects) آمده است که در آن به‌طور مختصر از و توضیح داده‌ایم که هنگام اجرای git filter-branch از گزینهٔ --ignore-unmatch استفاده می‌کنیم؛ این گزینه باعث می‌شود وقتی فایلی که می‌خواهیم حذف کنیم وجود ندارد، خطا تولید نشود. این مورد می‌تواند برای اهداف اسکریپت‌نویسی مفید باشد.

جابجایی یا تغییر نام فایل در گیت (git mv)

دستور git mv یک دستور کم‌حجم و راحت برای جابه‌جایی فایل است که پس از جا‌به‌جایی، به‌طور خودکار روی فایل جدید git add و روی فایل قدیمی git rm انجام می‌دهد.

ما تنها به‌طور مختصر این دستور را در جا به جایی فایل ها (Moving Files) ذکر کرده‌ایم.

پاک‌سازی در گیت (git clean)

دستور git clean برای حذف فایل‌های نامطلوب از شاخه کاری (working directory) شما استفاده می‌شود. این ممکن است شامل حذف آثار موقت ساخت (build artifacts) یا فایل‌های مربوط به تداخل‌های مرج (merge conflict) باشد. ما بسیاری از گزینه‌ها و سناریوهایی را که ممکن است از دستور clean استفاده کنید در پاک‌سازی شاخه کاری (Working Directory) (Cleaning your Working Directory) پوشش داده‌ایم.

scroll-to-top