Skip to content

Latest commit

 

History

History
541 lines (301 loc) · 55.2 KB

File metadata and controls

541 lines (301 loc) · 55.2 KB

Appendix A: دستورات گیت (Git Commands)

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

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

Tip

می‌توانید گزینه‌های طولانی را کوتاه‌نویسی کنید. برای مثال، می‌توانید بنویسید git commit --`a که همان تأثیر `git commit --amend را دارد. این تنها زمانی کار می‌کند که حروف بعد از — برای یک گزینه منحصر‌به‌فرد باشند. هنگام نوشتن اسکریپت‌ها از نوشتن کامل گزینه استفاده کنید.

تنظیم و پیکربندی (Setup and Config)

دو فرمان هستند که از نخستین اجراهای گیت تا تنظیمات و ارجاعات روزمره کاربرد زیادی دارند: فرمان‌های config و help.

پیکربندی گیت (git config)

گیت نحوهٔ پیش‌فرض انجام صدها کار را دارد. برای بسیاری از این کارها می‌توانید به گیت بگویید که به‌طور پیش‌فرض آن‌ها را به شیوه‌ای متفاوت انجام دهد یا ترجیحات خود را تنظیم کنید. این شامل همه چیز از تعیین نام شما تا تنظیمات رنگ ترمینال یا ویرایشگری است که استفاده می‌کنید. چندین فایل وجود دارد که این فرمان از آن‌ها می‌خواند و در آن‌ها می‌نویسد تا بتوانید مقادیر را به‌صورت سراسری یا مخصوص مخزن‌های خاص تنظیم کنید.

فرمان git config در تقریباً هر فصل کتاب استفاده شده است.

در ch01-getting-started.asc از آن برای مشخص کردن نام، آدرس ایمیل و تنظیم ویرایشگر استفاده کردیم، پیش از آنکه حتی کار با گیت را آغاز کنیم.

در ch02-git-basics-chapter.asc نشان دادیم چگونه می‌توانید از آن برای ایجاد دستورهای کوتاه (alias) استفاده کنید که به توالی گزینه‌های طولانی گسترش می‌یابند تا هر بار مجبور نباشید آن‌ها را تایپ کنید.

در ch03-git-branching.asc از آن استفاده کردیم تا --rebase را به‌عنوان پیش‌فرض هنگام اجرای git pull قرار دهیم.

در ch07-git-tools.asc از آن برای تنظیم یک مخزن پیش‌فرض برای گذرواژه‌های HTTP استفاده کردیم.

در ch08-customizing-git.asc نشان دادیم چگونه فیلترهای smudge و clean را روی محتوایی که وارد و خارج Git می‌شود تنظیم کنیم.

در نهایت، تقریباً کلیت ch08-customizing-git.asc به این دستور اختصاص دارد.

دستورات ویرایشگر اصلی گیت (git config core.editor commands)

همراه با دستورات پیکربندی در ch01-getting-started.asc، بسیاری از ویرایشگرها را می‌توان به صورت زیر تنظیم کرد:

Table 1. Exhaustive list of core.editor configuration commands
Editor Configuration command

Atom

git config --global core.editor "atom --wait"

BBEdit (macOS, with command line tools)

git config --global core.editor "bbedit -w"

Emacs

git config --global core.editor emacs

Gedit (Linux)

git config --global core.editor "gedit --wait --new-window"

Gvim (Windows 64-bit)

git config --global core.editor "'C:\Program Files\Vim\vim72\gvim.exe' --nofork '%*'" (Also see note below)

Helix

git config --global core.editor "hx"

Kate (Linux)

git config --global core.editor "kate --block"

nano

git config --global core.editor "nano -w"

Notepad (Windows 64-bit)

git config core.editor notepad

Notepad++ (Windows 64-bit)

git config --global core.editor "'C:\Program Files\Notepad++\notepad++.exe' -multiInst -notabbar -nosession -noPlugin" (Also see note below)

Scratch (Linux)

git config --global core.editor "scratch-text-editor"

Sublime Text (macOS)

git config --global core.editor "/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl --new-window --wait"

Sublime Text (Windows 64-bit)

git config --global core.editor "'C:\Program Files\Sublime Text 3\sublime_text.exe' -w" (Also see note below)

TextEdit (macOS)

git config --global core.editor "open --wait-apps --new -e"

Textmate

git config --global core.editor "mate -w"

Textpad (Windows 64-bit)

git config --global core.editor "'C:\Program Files\TextPad 5\TextPad.exe' -m" (Also see note below)

UltraEdit (Windows 64-bit)

git config --global core.editor Uedit32

Vim

git config --global core.editor "vim --nofork"

Visual Studio Code

git config --global core.editor "code --wait"

VSCodium (Free/Libre Open Source Software Binaries of VSCode)

git config --global core.editor "codium --wait"

WordPad

git config --global core.editor "'C:\Program Files\Windows NT\Accessories\wordpad.exe'"

Xi

git config --global core.editor "xi --wait"

Note

اگر یک ویرایشگر ۳۲ بیتی روی سیستم ویندوز ۶۴ بیتی دارید، برنامه در پوشهٔ C:\Program Files (x86)\ نصب خواهد شد نه در C:\Program Files\ همان‌طور که در جدول بالا آمده است.

راهنمای گیت (git help)

دستور git help برای نمایش تمام مستنداتی که همراه Git عرضه می‌شوند دربارهٔ هر دستور استفاده می‌شود. در حالی که در این پیوست نمایی کلی از محبوب‌ترین دستورات را ارائه می‌دهیم، برای فهرست کامل همهٔ گزینه‌ها و فلَگ‌های ممکن برای هر دستور همیشه می‌توانید git help <command> را اجرا کنید.

ما دستور git help را در ch01-getting-started.asc معرفی کردیم و نشان دادیم چگونه برای پیدا کردن اطلاعات بیشتر دربارهٔ git shell در ch04-git-on-the-server.asc از آن استفاده کنید.

گرفتن و ایجاد پروژه‌ها (Getting and Creating Projects)

دو راه برای به‌دست آوردن یک مخزن Git وجود دارد. یکی کپی‌کردن آن از یک مخزن موجود روی شبکه یا مکان دیگری است و دیگری ایجاد یک مخزن جدید در یک شاخهٔ موجود است.

ایجاد مخزن گیت (git init)

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

ما ابتدا این را در ch02-git-basics-chapter.asc معرفی می‌کنیم، جایی که ایجاد یک مخزن کاملاً جدید برای شروع کار را نشان می‌دهیم.

به‌طور خلاصه دربارهٔ چگونگی تغییر نام شاخهٔ پیش‌فرض از «master» در ch03-git-branching.asc صحبت کرده‌ایم.

ما از این دستور برای ایجاد یک مخزن خالی و bare برای یک سرور در ch04-git-on-the-server.asc استفاده می‌کنیم.

در نهایت، برخی از جزئیات کارهایی که در پشت صحنه انجام می‌دهد را در ch10-git-internals.asc بررسی می‌کنیم.

کلون گرفتن از گیت (git clone)

دستور git clone در واقع نوعی پوسته (wrapper) بر چندین دستور دیگر است. این دستور یک دایرکتوری جدید می‌سازد، وارد آن می‌شود و با اجرای git init آن را به یک مخزن خالی گیت تبدیل می‌کند، یک remote (با git remote add) به آدرسی که به آن می‌دهید اضافه می‌کند (به‌طور پیش‌فرض با نام origin)، از آن مخزن remote یک git fetch اجرا می‌کند و سپس آخرین commit را با git checkout در شاخه کاری شما (working directory) چک‌اوت می‌کند.

دستور git clone در سرتاسر کتاب در ده‌ها جا استفاده شده است، اما ما فقط چند مورد جالب را ذکر می‌کنیم.

در اصل در ch02-git-basics-chapter.asc معرفی و توضیح داده شده است، جایی که چند مثال را مرور می‌کنیم.

در ch04-git-on-the-server.asc گزینه --bare را برای ساختن یک نسخه از مخزن گیت بدون شاخه کاری بررسی می‌کنیم.

در ch07-git-tools.asc از آن برای خارج‌سازی (unbundle) یک مخزن گیت بسته‌بندی‌شده (bundled) استفاده می‌کنیم.

در نهایت، در ch07-git-tools.asc با گزینه --recurse-submodules آشنا می‌شویم تا کلون‌کردن یک مخزن حاوی submoduleها ساده‌تر شود.

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

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

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

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

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

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

ابتدا دستور git add را به‌طور مفصل معرفی و توضیح می‌دهیم (ch02-git-basics-chapter.asc).

نحوهٔ استفاده از آن برای حل تعارض‌های merge را در ch03-git-branching.asc بیان می‌کنیم.

نحوهٔ به‌کارگیری آن برای مرحله‌بندی تعاملی و انتخاب تنها بخش‌های مشخصی از یک فایل تغییر یافته را در ch07-git-tools.asc مرور می‌کنیم.

در پایان، پیاده‌سازی سطح پایینِ آن را شبیه‌سازی می‌کنیم تا ایده‌ای از کارهای داخلی که پشت صحنه انجام می‌دهد به‌دست آورید (ch10-git-internals.asc).

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

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

ابتدا status را در ch02-git-basics-chapter.asc پوشش می‌دهیم، هم فرم‌های پایه‌ای و هم فرم‌های ساده‌شدهٔ آن. هرچند در سراسر کتاب از آن استفاده می‌کنیم، عملاً هر کاری که با دستور git status می‌توانید انجام دهید در آنجا توضیح داده شده است.

(git diff)

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

ابتدا کاربردهای پایهٔ git diff را در ch02-git-basics-chapter.asc بررسی می‌کنیم، جایی که نشان می‌دهیم چه تغییراتی مرحله‌بندی شده‌اند و کدام‌ها هنوز مرحله‌بندی نشده‌اند.

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

همچنین می‌بینیم چگونه می‌توان تفاوت بین شاخه‌ها را مؤثرتر با نحو git diff A…​B بررسی کرد (ch05-distributed-git.asc).

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

در نهایت، از آن برای مقایسهٔ مؤثر تغییرات زیرمدول‌ها با --submodule در ch07-git-tools.asc استفاده می‌کنیم.

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

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

ما فقط به‌طور مختصر در ch02-git-basics-chapter.asc به این موضوع اشاره کرده‌ایم.

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

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

ما ابتدا اصول پایهٔ commit کردن را در ch02-git-basics-chapter.asc بررسی می‌کنیم. در آنجا نشان می‌دهیم چگونه با استفاده از گزینه -a می‌توان در گردش‌های کاری روزمره از مرحله git add صرف‌نظر کرد و چگونه با گزینه -m پیام commit را از خط فرمان ارسال کرد به‌جای اینکه ویرایشگر باز شود.

در ch02-git-basics-chapter.asc از گزینه --amend برای بازنویسی آخرین commit صحبت می‌کنیم.

در ch03-git-branching.asc با جزئیات بیشتری توضیح می‌دهیم که git commit چه کاری انجام می‌دهد و چرا این کار را به آن شکل انجام می‌دهد.

ما نحوهٔ امضای رمزنگاری‌شدهٔ commitها با گزینه -S را در ch07-git-tools.asc بررسی کردیم.

در نهایت، نگاهی می‌اندازیم به اینکه دستور git commit در پس‌زمینه چه کاری انجام می‌دهد و در عمل چگونه پیاده‌سازی شده است، در ch10-git-internals.asc.

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

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

ما ابتدا ساده‌ترین کاربرد git reset را در ch02-git-basics-chapter.asc مطرح می‌کنیم، جایی که از آن برای برداشتن فایل‌هایی که با git add به استیج اضافه کرده‌ایم استفاده می‌کنیم.

سپس این دستور را با جزئیات زیادی در ch07-git-tools.asc بررسی می‌کنیم که کاملاً به توضیح این دستور اختصاص دارد.

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

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

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

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

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

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

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

ما تنها به‌طور مختصر این دستور را در ch02-git-basics-chapter.asc ذکر کرده‌ایم.

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

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

انشعاب‌گیری و ادغام (Branching and Merging)

تنها تعداد اندکی از دستورات وجود دارند که بخش اعظم عملکرد شاخه‌بندی و ادغام در گیت را پیاده‌سازی می‌کنند.

مدیریت شاخه‌ها در گیت (git branch)

دستور git branch در واقع نوعی ابزار مدیریت شاخه است. این دستور می‌تواند شاخه‌های موجود را فهرست کند، شاخهٔ جدید ایجاد کند، شاخه‌ها را حذف کند و نام شاخه‌ها را تغییر دهد.

بخش عمده‌ای از فصل ch03-git-branching.asc به دستور branch اختصاص دارد و در سرتاسر فصل از آن استفاده شده است. ابتدا آن را در ch03-git-branching.asc معرفی می‌کنیم و اکثر ویژگی‌های دیگر آن (فهرست‌کردن و حذف) را در ch03-git-branching.asc بررسی می‌کنیم.

در ch03-git-branching.asc از گزینه git branch -u برای تنظیم شاخهٔ دنبال‌شونده (tracking branch) استفاده می‌کنیم.

در نهایت، بخش‌هایی از کاری که در پس‌زمینه انجام می‌دهد را در ch10-git-internals.asc مرور می‌کنیم.

تغییر شاخه یا بازیابی فایل در گیت (git checkout)

دستور git checkout برای سویچ‌کردن بین شاخه‌ها و چک‌اوت (برگرداندن محتوا) به شاخه کاری شما استفاده می‌شود.

برای اولین بار این دستور را همراه با دستور git branch در ch03-git-branching.asc می‌بینیم.

می‌آموزیم چگونه با استفاده از گزینه --track برای شروع دنبال‌کردن شاخه‌ها اقدام کنیم در ch03-git-branching.asc.

با استفاده از --conflict=diff3 از آن برای بازگرداندن (reintroduce) تداخلات فایل‌ها استفاده می‌کنیم در ch07-git-tools.asc.

روابط آن با git reset را با جزییات بیشتر در ch07-git-tools.asc بررسی می‌کنیم.

در نهایت، برخی جزئیات پیاده‌سازی را در ch10-git-internals.asc شرح می‌دهیم.

ادغام شاخه‌ها در گیت (git merge)

ابزار git merge برای ادغام یک یا چند شاخه در شاخهٔ فعلی که چک‌اوت کرده‌اید به کار می‌رود. سپس شاخهٔ جاری را به نتیجهٔ ادغام جلو می‌برد.

دستور git merge اولین‌بار در ch03-git-branching.asc معرفی شد. اگرچه در فصل‌های مختلف کتاب از آن استفاده شده، اما تنوع‌های دستور merge بسیار محدود است — معمولاً فقط git merge <branch> با نام تک شاخه‌ای که می‌خواهید با آن ادغام کنید.

نحوه انجام ادغام به‌صورت squash (جایی که گیت کارها را ادغام می‌کند اما طوری رفتار می‌کند که گویی فقط یک کامیت جدید است و تاریخچهٔ شاخهٔ ادغام‌شونده را ثبت نمی‌کند) را در انتهای ch05-distributed-git.asc بررسی کردیم.

در مورد فرایند و دستور merge مطالب زیادی گفتیم، از جمله گزینهٔ -Xignore-space-change و فلگ --abort برای متوقف کردن یک ادغام مشکل‌دار در ch07-git-tools.asc.

همچنین یاد گرفتیم که چگونه قبل از ادغام امضاها را در صورتی که پروژه‌تان از امضای GPG استفاده می‌کند، تأیید کنیم، که در ch07-git-tools.asc آمده است.

در نهایت در مورد Subtree merging در ch07-git-tools.asc بحث کردیم.

ابزار ادغام در گیت (git mergetool)

دستور git mergetool صرفاً در صورتی که هنگام ادغام با مشکل مواجه شوید یک ابزار خارجی کمکِ ادغام را راه‌اندازی می‌کند.

ما به‌طور مختصر آن را در ch03-git-branching.asc ذکر کرده‌ایم و در ch08-customizing-git.asc به تفصیل توضیح داده‌ایم که چگونه می‌توانید ابزار ادغام خارجی خود را پیاده‌سازی کنید.

نمایش تاریخچه گیت (git log)

دستور git log برای نمایش تاریخچهٔ قابل دسترس ثبت‌شدهٔ یک پروژه از آخرین اسنپ‌شات کامیت به عقب استفاده می‌شود. به‌طور پیش‌فرض تنها تاریخچهٔ شاخه‌ای را که در آن قرار دارید نشان می‌دهد، اما می‌توان به آن سرها یا شاخه‌های مختلف یا حتی متعدد داد تا از آن‌ها عبور کند. همچنین اغلب برای نمایش تفاوت‌ها بین دو یا چند شاخه در سطح کامیت به‌کار می‌رود.

این دستور تقریباً در هر فصل کتاب برای نمایش تاریخچهٔ یک پروژه استفاده شده است. فرمان را معرفی می‌کنیم و آن را در ch02-git-basics-chapter.asc به‌صورت نسبتاً عمیق پوشش می‌دهیم. در آن‌جا به گزینه‌های -p و --stat می‌پردازیم تا ایده‌ای از تغییراتی که هر کامیت وارد کرده بدست آوریم و از گزینه‌های --pretty و --oneline برای مشاهده فشرده‌تر تاریخچه استفاده می‌کنیم، همراه با چند گزینه ساده برای فیلتر کردن بر اساس تاریخ و مؤلف.

در ch03-git-branching.asc آن را با گزینه --decorate به کار می‌بریم تا به‌راحتی محل اشاره‌گرهای شاخه‌ها را ببینیم و همچنین از گزینه --graph استفاده می‌کنیم تا ببینیم تاریخچه‌های منشعب چگونه به نظر می‌رسند.

در ch05-distributed-git.asc و ch07-git-tools.asc نحو branchA..branchB را پوشش می‌دهیم تا با استفاده از دستور git log ببینیم کدام کامیت‌ها نسبت به شاخه‌ی دیگر منحصر به همان شاخه‌اند. در ch07-git-tools.asc این موضوع را نسبتاً مفصل بررسی می‌کنیم.

در ch07-git-tools.asc و ch07-git-tools.asc از فرمت branchA…​branchB و نحو --left-right برای دیدن اینکه چه چیزهایی در یکی از شاخه‌ها هست ولی در هر دو نیست، استفاده می‌کنیم. در ch07-git-tools.asc همچنین می‌بینیم چگونه از گزینه --merge برای کمک به اشکال‌زدایی تداخل‌های مرج و از گزینه --cc برای بررسی تداخل‌های کامیت‌های مرج در تاریخچه‌تان بهره ببریم.

در ch07-git-tools.asc از گزینه -g برای مشاهده reflog گیت از طریق این ابزار به جای گشتن در شاخه‌ها استفاده می‌کنیم.

در ch07-git-tools.asc به استفاده از گزینه‌های -S و -L برای انجام جستجوهای نسبتاً پیشرفته درباره چیزی که به‌صورت تاریخی در کد اتفاق افتاده، مانند مشاهدهٔ تاریخچهٔ یک تابع، می‌پردازیم.

در ch07-git-tools.asc می‌بینیم چگونه از --show-signature برای افزودن یک رشتهٔ اعتبارسنجی به هر کامیت در خروجی git log استفاده کنیم تا مشخص شود آیا آن کامیت به‌درستی امضا شده است یا خیر.

ذخیره موقت تغییرات در گیت (git stash)

دستور git stash برای ذخیره موقت کارهای انجام‌نشده (uncommitted) استفاده می‌شود تا بدون نیاز به کامیت کردن کار نیمه‌تمام روی یک شاخه، پوشهٔ کاری خود را پاک‌سازی کنید.

این موضوع عملاً کاملاً در ch07-git-tools.asc پوشش داده شده است.

ایجاد یا مدیریت برچسب‌ها در گیت (git tag)

دستور git tag برای گذاشتن یک نشانهٔ دائمی روی یک نقطهٔ مشخص در تاریخچه کد استفاده می‌شود. عموماً از این برای مواردی مثل انتشارها (ریلیزها) استفاده می‌شود.

این دستور در ch02-git-basics-chapter.asc معرفی و با جزئیات توضیح داده شده و در عمل در ch05-distributed-git.asc هم از آن استفاده می‌کنیم.

همچنین نحوهٔ ساخت یک تگ امضا‌شده با GPG با گزینهٔ -s و تأیید آن با گزینهٔ -v در ch07-git-tools.asc پوشش داده شده است.

به‌اشتراک‌گذاری و به‌روزرسانی پروژه‌ها (Sharing and Updating Projects)

دستورات بسیار کمی در Git وجود دارند که از شبکه استفاده می‌کنند؛ تقریباً همهٔ دستورات روی پایگاه دادهٔ محلی عمل می‌کنند. وقتی آمادهٔ اشتراک‌گذاری کارتان یا کشیدن (pull) تغییرات از منابع دیگر هستید، چند دستور وجود دارند که با مخازن راه دور سر و کار دارند.

دریافت به‌روزرسانی‌ها از مخزن راه‌دور (git fetch)

دستور git fetch با یک مخزن راه دور ارتباط برقرار کرده و تمام اطلاعاتی را که در آن مخزن هست ولی در مخزن جاری شما نیست، دانلود کرده و در پایگاه دادهٔ محلی شما ذخیره می‌کند.

ما ابتدا این دستور را در ch02-git-basics-chapter.asc بررسی می‌کنیم و مثال‌های بیشتری از کاربرد آن را در ch03-git-branching.asc می‌بینیم.

همچنین از آن در چند مثال در ch05-distributed-git.asc استفاده می‌کنیم.

ما از آن برای بازیابی یک ارجاع (reference) خاص که خارج از فضای پیش‌فرض است در ch06-github.asc استفاده می‌کنیم و می‌بینیم چگونه از یک bundle فراخوانی (fetch) کنیم در ch07-git-tools.asc.

دریافت و ادغام به‌روزرسانی‌ها از مخزن راه‌دور (git pull)

ما refspec‌های بسیار سفارشی را تنظیم می‌کنیم تا git fetch کاری کمی متفاوت از حالت پیش‌فرض انجام دهد در ch10-git-internals.asc.

دستور git pull اساساً ترکیبی از دو دستور git fetch و git merge است، که در آن گیت از راه دوری را که مشخص می‌کنید می‌گیرد و سپس فوراً سعی می‌کند آن را با شاخه‌ای که رویش هستید ادغام کند.

ما آن را به‌طور مختصر در ch02-git-basics-chapter.asc معرفی می‌کنیم و نشان می‌دهیم اگر آن را اجرا کنید چه چیزی را ادغام خواهد کرد در ch02-git-basics-chapter.asc.

ما نشان می‌دهیم چگونه می‌توان از آن با یک URL برای یک‌بار کشیدن تغییرات استفاده کرد (نگاه کنید به <<ch05-distributed-git#_checking_out_remotes>>).

در نهایت به‌طور کوتاه اشاره می‌کنیم که می‌توانید از گزینهٔ --verify-signatures برای آن استفاده کنید تا تأیید کنید کمیت‌هایی که می‌کشید با GPG امضا شده‌اند (نگاه کنید به ch07-git-tools.asc).

ارسال تغییرات به مخزن راه‌دور (git push)

دستور git push برای ارتباط با مخزن دیگر، محاسبهٔ تفاوت بین پایگاه‌دادهٔ محلی شما و مخزن راه دور و سپس فشار دادن (منتقل‌کردن) آن تفاوت به مخزن دیگر استفاده می‌شود. این دستور نیاز به دسترسی نوشتن روی مخزن دیگر دارد و بنابراین معمولاً به‌نوعی احراز هویت می‌شود.

ابتدا به دستور git push در ch02-git-basics-chapter.asc می‌پردازیم. در اینجا اصول پایهٔ فرستادن یک شاخه به مخزن راه دور را پوشش می‌دهیم. در ch03-git-branching.asc به جزئیات بیشتری دربارهٔ فرستادن شاخه‌های مشخص می‌پردازیم و در ch03-git-branching.asc می‌بینیم چگونه شاخه‌های دنبال‌کننده را طوری تنظیم کنیم که به‌طور خودکار برایشان push انجام شود. در ch03-git-branching.asc از فلگ --delete برای حذف یک شاخه در سرور با استفاده از git push استفاده می‌کنیم.

در سراسر ch05-distributed-git.asc چندین مثال از استفادهٔ git push برای اشتراک‌گذاری کار روی شاخه‌ها از طریق چند مخزن راه دور می‌بینیم.

می‌بینیم چگونه با گزینهٔ --tags تگ‌هایی را که ساخته‌اید به اشتراک بگذارید (نگاه کنید به ch02-git-basics-chapter.asc).

در ch07-git-tools.asc از گزینهٔ --recurse-submodules استفاده می‌کنیم تا بررسی کنیم همهٔ کارهای زیرماژول‌ها منتشر شده‌اند قبل از اینکه سوپرپروژه را push کنیم، که هنگام استفاده از زیرماژول‌ها بسیار مفید است.

در ch08-customizing-git.asc مختصراً دربارهٔ hook به‌نام pre-push صحبت می‌کنیم، اسکریپتی که می‌توانیم تنظیم کنیم تا قبل از تکمیل push اجرا شود و بررسی کند آیا اجازهٔ push داده شود یا نه.

در نهایت، در <<ch10-git-internals#_pushing_refspecs>> به فرستادن (push) با یک refspec کامل می‌پردازیم، نه میان‌بُرهای کلی که معمولاً استفاده می‌شوند. این کار به شما کمک می‌کند دقیقاً مشخص کنید چه کاری را می‌خواهید به اشتراک بگذارید.

مدیریت مخازن راه‌دور (git remote)

دستور git remote ابزاری برای مدیریت فهرست مخازن راه‌دور (remote) شماست. این دستور به شما اجازه می‌دهد آدرس‌های طولانی را به نام‌های کوتاه مانند «origin» ذخیره کنید تا مجبور نباشید همیشه آن‌ها را تایپ کنید. شما می‌توانید چندین نام از این دست داشته باشید و دستور git remote برای افزودن، تغییر و حذف آن‌ها استفاده می‌شود.

این دستور به‌صورت مفصل در ch02-git-basics-chapter.asc پوشش داده شده است، از جمله فهرست‌گیری، افزودن، حذف و تغییر نام مخازن راه‌دور.

این دستور در تقریباً همه فصل‌های بعدی کتاب نیز استفاده می‌شود، اما همیشه در قالب استاندارد git remote add <name> <url> به کار رفته است.

ایجاد آرشیو از مخزن (git archive)

دستور git archive برای ایجاد یک فایل آرشیو از یک تصویر (snapshot) خاص از پروژه به کار می‌رود.

ما از git archive برای ساخت یک tarball از پروژه جهت به اشتراک‌گذاری در ch05-distributed-git.asc استفاده می‌کنیم.

مدیریت زیرماژول‌ها (git submodule)

دستور git submodule برای مدیریت مخازن خارجی درون یک مخزن عادی به کار می‌رود. این می‌تواند برای کتابخانه‌ها یا انواع دیگر منابع مشترک مفید باشد. دستور submodule دارای چند زیر‌دستور (مثل add، update، sync و غیره) برای مدیریت این منابع است.

این دستور تنها ذکر شده و به‌طور کامل در ch07-git-tools.asc پوشش داده شده است.

بازرسی و مقایسه (Inspection and Comparison)

نمایش اطلاعات اشیاء گیت (git show)

دستور git show می‌تواند یک شیء Git را به‌صورت ساده و قابل خواندن برای انسان نمایش دهد. معمولاً از این دستور برای نشان‌دادن اطلاعات یک تگ یا یک commit استفاده می‌کنید.

ما ابتدا از آن برای نمایش اطلاعات تگ‌های Annotated در ch02-git-basics-chapter.asc استفاده می‌کنیم.

بعداً در ch07-git-tools.asc به‌طور زیاد از آن استفاده می‌کنیم تا commitهایی را که انتخاب‌های مختلف بازبینی (revision selections) به آن‌ها اشاره می‌کنند نشان دهیم.

یکی از کارهای جالبی که با git show انجام می‌دهیم در ch07-git-tools.asc است: استخراج محتویات فایل‌های مشخص از مراحل مختلف در طول یک برخورد ادغام (merge conflict).

خلاصه تاریخچه گیت (git shortlog)

دستور git shortlog برای خلاصه‌سازی خروجی git log استفاده می‌شود. این دستور بسیاری از همان گزینه‌هایی را می‌پذیرد که git log می‌پذیرد، اما به‌جای فهرست‌کردن تک‌تک کامیت‌ها، خلاصه‌ای از کامیت‌ها را به‌صورت گروه‌بندی‌شده بر اساس نویسنده ارائه می‌دهد.

نحوه‌ی استفاده از آن برای ساخت یک changelog مرتب را در ch05-distributed-git.asc نشان دادیم.

توضیح نسخه یا نقطه مرجع (git describe)

دستور git describe برای دریافت هر چیزی که به یک کامیت اشاره می‌کند و تولید رشته‌ای نسبتاً خوانا برای انسان و پایدار (تغییر‌نکردنی) استفاده می‌شود. این روش راهی است برای توصیف یک کامیت که به‌اندازه‌ی SHA-1 کامیت بی‌ابهام باشد اما قابل‌فهم‌تر باشد.

ما از git describe در ch05-distributed-git.asc و ch05-distributed-git.asc استفاده می‌کنیم تا رشته‌ای برای نام‌گذاری فایل انتشارمان به‌دست آوریم.

عیب‌یابی (Debugging)

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

یافتن کامیت مشکل‌دار با جستجوی دودویی (git bisect)

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

این ابزار به‌طور کامل در ch07-git-tools.asc پوشش داده شده و فقط در آن بخش ذکر شده است.

نمایش آخرین تغییر‌دهنده هر خط (git blame)

دستور git blame خطوط هر فایل را با نشان‌دادن این‌که آخرین تغییری که هر خط را وارد کرده مربوط به کدام کامیت بوده و چه‌کسی آن کامیت را نوشته است، حاشیه‌نویسی می‌کند. این برای یافتن شخصی که می‌توان از او درباره‌ی بخش خاصی از کدتان سؤال پرسید مفید است.

این موضوع در ch07-git-tools.asc پوشش داده شده و فقط در آن بخش ذکر شده است.

جستجوی متنی در مخزن گیت (git grep)

دستور git grep می‌تواند به شما کمک کند هر رشته یا عبارت منظمی را در هر یک از فایل‌های کد منبعتان، حتی در نسخه‌های قدیمی‌تر پروژه، پیدا کنید.

این دستور در ch07-git-tools.asc پوشش داده شده و فقط در آن بخش ذکر شده است.

اعمال تغییرات به صورت پچ (Patching)

چند فرمان در گیت بر این مفهوم متمرکز هستند که کمیت‌ها را از منظر تغییراتی که وارد می‌کنند تصور کنیم، گویی که رشتهٔ کمیت‌ها مجموعه‌ای از پَچ‌هاست. این دستورها به شما کمک می‌کنند شاخه‌های خود را به این شیوه مدیریت کنید.

انتخاب و اعمال یک کامیت مشخص (git cherry-pick)

فرمان git cherry-pick برای گرفتن تغییری که در یک کمیت گیت معرفی شده و تلاش برای بازتولید آن به‌عنوان یک کمیت جدید روی شاخه‌ای که هم‌اکنون روی آن هستید کاربرد دارد. این کار زمانی مفید است که بخواهید یک یا دو کمیت را به‌طور جداگانه از یک شاخه بردارید، به‌جای اینکه کل شاخه را که همهٔ تغییرات را می‌آورد، merge کنید.

عمل cherry-pick در بخش ch05-distributed-git.asc توضیح داده و نشان داده شده است.

بازپایه‌گذاری (git rebase)

فرمان git rebase اساساً یک cherry-pick خودکار است. این فرمان مجموعه‌ای از کمیت‌ها را تعیین کرده و سپس آن‌ها را به‌نوبت و به همان ترتیب در جای دیگری cherry-pick می‌کند.

بحث rebase به‌طور مفصل در ch03-git-branching.asc آمده است، از جمله مسائل همکاری که در صورت rebase کردن شاخه‌هایی که قبلاً عمومی شده‌اند پیش می‌آید.

ما در عمل از آن در مثالی برای جدا کردن تاریخچهٔ خود به دو مخزن مجزا در ch07-git-tools.asc استفاده می‌کنیم، و نیز از گزینهٔ --onto بهره می‌بریم.

در ch07-git-tools.asc با برخورد به یک تعارض merge هنگام rebase روبه‌رو می‌شویم.

همچنین از rebase در حالت تعاملی/اسکریپتی با گزینهٔ -i در ch07-git-tools.asc استفاده می‌کنیم.

برگرداندن تغییرات یک کامیت (git revert)

فرمان git revert عملاً معکوس git cherry-pick است. این فرمان یک کمیت جدید ایجاد می‌کند که دقیقاً مخالف تغییری است که کمیت هدف وارد کرده است، به‌عبارت دیگر آن تغییر را لغو یا برمی‌گرداند.

ما از این در ch07-git-tools.asc برای بازگرداندن یک کمیت merge استفاده می‌کنیم.

ایمیل (Email)

بسیاری از پروژه‌های گیت، از جمله خودِ گیت، به‌طور کامل از طریق فهرست‌های پستی (mailing list) نگهداری می‌شوند. گیت چندین ابزار درونی دارد که این فرآیند را آسان‌تر می‌کند؛ از تولید پَچ‌هایی که بتوانید به‌راحتی ایمیل کنید تا اعمال آن پَچ‌ها از صندوق پستی.

اعمال پچ (git apply)

دستور git apply یک پچ ایجاد‌شده با دستور git diff یا حتی با دستور GNU diff را اعمال می‌کند. این شبیه کاری است که دستور patch انجام می‌دهد با چند تفاوت کوچک.

ما نحوه استفاده از آن و موقعیت‌هایی که ممکن است از آن استفاده کنید را در ch05-distributed-git.asc نشان داده‌ایم.

اعمال پچ از ایمیل (git am)

دستور git am برای اعمال پچ‌ها از صندوق ایمیل استفاده می‌شود، به‌طور مشخص صندوق‌هایی با فرمت mbox. این برای دریافت پچ‌ها از طریق ایمیل و اعمال آسان آن‌ها در پروژه‌تان مفید است.

ما استفاده و جریان کاری پیرامون git am را در ch05-distributed-git.asc پوشش داده‌ایم، از جمله استفاده از گزینه‌های --resolved، -i و -3.

همچنین تعدادی هوک وجود دارد که می‌توانید برای کمک به جریان کاری پیرامون git am از آن‌ها استفاده کنید و همهٔ آن‌ها در ch08-customizing-git.asc بررسی شده‌اند.

ما همچنین از آن برای اعمال تغییرات فرمت‌شدهٔ پچِ درخواست‌های Pull در گیت‌هاب در ch06-github.asc استفاده می‌کنیم.

ایجاد پچ‌ها برای ارسال (git format-patch)

دستور git format-patch برای تولید مجموعه‌ای از پچ‌ها در فرمت mbox به‌کار می‌رود که می‌توانید آن‌ها را به‌صورت درست فرمت‌شده برای یک فهرست پستی ارسال کنید.

ما یک مثال از مشارکت در یک پروژه با استفاده از ابزار git format-patch را در ch05-distributed-git.asc بررسی می‌کنیم.cached

ارسال پچ از طریق IMAP (git imap-send)

دستور git imap-send یک صندوق پستی تولیدشده با git format-patch را در یک پوشهٔ پیش‌نویس IMAP آپلود می‌کند.

ما یک مثال از مشارکت در یک پروژه با ارسال پچ‌ها با ابزار git imap-send را در ch05-distributed-git.asc مرور می‌کنیم.

ارسال پچ از طریق ایمیل (git send-email)

دستور git send-email برای ارسال پچ‌هایی که با git format-patch تولید شده‌اند از طریق ایمیل استفاده می‌شود.

ما یک مثال از مشارکت در یک پروژه با ارسال پچ‌ها با ابزار git send-email را در ch05-distributed-git.asc بررسی می‌کنیم.

درخواست کشش برای مخزن دیگر (git request-pull)

 دستور git request-pull فقط برای تولید یک متن نمونه برای ایمیل فرستادن به کسی استفاده می‌شود.
اگر شاخه‌ای روی یک سرور عمومی دارید و می‌خواهید به کسی بگویید چگونه آن تغییرات را ادغام کند بدون اینکه پچ‌ها را از طریق ایمیل بفرستید، می‌توانید این دستور را اجرا کرده و خروجی را برای شخصی که می‌خواهید تغییرات را pull کند ارسال کنید.

نحوه استفاده از git request-pull برای تولید پیام pull را در ch05-distributed-git.asc نشان داده‌ایم.

سیستم‌های خارجی (External Systems)

گیت چندین دستور برای یکپارچه‌سازی با سایر سیستم‌های کنترل نسخه در اختیار دارد.

ابزار گیت برای تعامل با Subversion (git svn)

دستور git svn برای ارتباط با سیستم کنترل نسخه Subversion به‌عنوان یک کلاینت استفاده می‌شود. این به این معناست که می‌توانید از گیت برای checkout گرفتن از یک سرور Subversion و commit کردن به آن استفاده کنید.

این دستور به‌طور جامع در ch09-git-and-other-systems.asc پوشش داده شده است.

ورود سریع داده‌ها به گیت (git fast-import)

برای سایر سیستم‌های کنترل نسخه یا وارد کردن از تقریباً هر فرمتی، می‌توانید از git fast-import استفاده کنید تا آن فرمت را سریعاً به چیزی که گیت بتواند به‌راحتی ضبط کند نقشه‌برداری کنید.

این دستور به‌تفصیل در ch09-git-and-other-systems.asc بررسی شده است.

مدیریت (Administration)

اگر شما مدیریت یک مخزن گیت را بر عهده دارید یا نیاز دارید چیزی را به‌صورت گسترده‌ای اصلاح کنید، گیت تعدادی دستور مدیریتی ارائه می‌دهد تا به شما کمک کند.

پاکسازی و بهینه‌سازی مخزن (git gc)

دستور git gc عملیات "جمع‌آوری زباله" را روی مخزن شما اجرا می‌کند، فایل‌های غیرضروری در پایگاه داده را حذف کرده و فایل‌های باقی‌مانده را در قالبی کارآمدتر بسته‌بندی می‌کند.

این دستور معمولاً به‌صورت پس‌زمینه برای شما اجرا می‌شود، گرچه در صورت تمایل می‌توانید آن را به‌صورت دستی اجرا کنید. برخی مثال‌ها از این را در ch10-git-internals.asc مرور می‌کنیم.

بررسی صحت مخزن (git fsck)

دستور git fsck برای بررسی پایگاه داده داخلی به‌منظور یافتن مشکلات یا ناسازگاری‌ها استفاده می‌شود.

ما فقط یک‌بار به‌سرعت از آن در ch10-git-internals.asc برای جست‌وجوی اشیاء آویزان استفاده می‌کنیم.

نمایش تاریخچه رفرنس‌ها (git reflog)

دستور git reflog از طریق یک لاگ از مکان‌هایی که همهٔ سرشاخه‌های شاخه‌هایتان در طول کار بوده‌اند عبور می‌کند تا کامیت‌هایی را که ممکن است در اثر بازنویسی تاریخچه از دست داده باشید پیدا کند.

ما این دستور را عمدتاً در ch07-git-tools.asc پوشش می‌دهیم، جایی که استفاده معمولی از آن را نشان می‌دهیم و چگونه می‌توان با استفاده از git log -g همان اطلاعات را به صورت خروجی git log مشاهده کرد.

همچنین یک مثال عملی برای بازیابی چنین شاخهٔ گمشده‌ای را در ch10-git-internals.asc بررسی می‌کنیم.

بازنویسی تاریخچه مخزن (git filter-branch)

دستور git filter-branch برای بازنویسی تعداد زیادی کمیت‌ها بر اساس الگوهای معین استفاده می‌شود، مانند حذف یک فایل از همهٔ تاریخچه یا فیلتر کردن کل مخزن به زیرشاخه‌ای واحد برای استخراج یک پروژه.

در ch07-git-tools.asc دستور را توضیح می‌دهیم و چندین گزینهٔ مختلف مانند --commit-filter، --subdirectory-filter و --tree-filter را بررسی می‌کنیم.

در ch09-git-and-other-systems.asc از آن برای اصلاح مخازن خارجی واردشده استفاده می‌کنیم.

دستورات سطح پایین گیت (Plumbing Commands)

همچنین تعداد قابل توجهی از دستورهای سطح پایین‌تر (plumbing) را که در کتاب با آن‌ها برخورد کردیم، معرفی کرده‌ایم.

اولین موردی که با آن مواجه می‌شویم ls-remote در ch06-github.asc است که برای مشاهدهٔ مراجع خام روی سرور از آن استفاده می‌کنیم.

از ls-files در ch07-git-tools.asc، ch07-git-tools.asc و ch07-git-tools.asc استفاده می‌کنیم تا نگاهی خام‌تر به وضعیت منطقهٔ staging خود بیندازیم.

ما همچنین rev-parse را در ch07-git-tools.asc ذکر می‌کنیم تا تقریباً هر رشته‌ای را به یک SHA-1 شیء تبدیل کند.

با این حال، بیشتر دستورهای سطح پایین plumbing که پوشش داده‌ایم در ch10-git-internals.asc قرار دارند، که بیشترِ تمرکز فصل بر آن است. سعی کردیم در طول بقیهٔ کتاب از به‌کارگیری آن‌ها پرهیز کنیم.