-
1. شروع به کار (getting started)
-
2. مقدمات گیت (git basics chapter)
- 2.1 گرفتن یک مخزن گیت (Getting a Git Repository)
- 2.2 ثبت تغییرات در مخزن (Recording Changes to the Repository)
- 2.3 مشاهده تاریخچه کامیتها (Viewing the Commit History)
- 2.4 بازگرداندن تغییرات (Undoing Things)
- 2.5 کار کردن با ریموت ها (Working with Remotes)
- 2.6 تگ کردن (Tagging)
- 2.7 نام مستعار گیت (Git Aliases)
- 2.8 خلاصه (summary)
-
3. انشعابگیری در گیت (Git Branching)
-
4. گیت روی سرور (Git on the server)
- 4.1 پروتکلها (The Protocols)
- 4.2 راهاندازی گیت روی یک سرور (Getting Git on a Server)
- 4.3 ایجاد کلید عمومی SSH شما (Generating Your SSH Public Key)
- 4.4 نصب و راهاندازی سرور (Setting up server)
- 4.5 سرویسدهنده گیت (Git Daemon)
- 4.6 HTTP هوشمند (Smart HTTP)
- 4.7 گیتوب (GitWeb)
- 4.8 گیتلب (GitLab)
- 4.9 گزینههای میزبانی شخص ثالث (Third Party Hosted Options)
- 4.10 خلاصه (Summary)
-
5. گیت توزیعشده (Distributed git)
-
6. GitHub (گیت هاب)
-
7. ابزارهای گیت (Git Tools)
- 7.1 انتخاب بازبینی (Revision Selection)
- 7.2 مرحلهبندی تعاملی (Interactive Staging)
- 7.3 ذخیره موقت و پاکسازی (Stashing and Cleaning)
- 7.4 Signing Your Work (امضای کارهای شما)
- 7.5 جستجو (Searching)
- 7.6 بازنویسی تاریخچه (Rewriting History)
- 7.7 بازنشانی به زبان ساده (Reset Demystified)
- 7.8 ادغام پیشرفته (Advanced Merging)
- 7.9 بازاستفاده خودکار از حل تضادها (Rerere)
- 7.10 اشکالزدایی با گیت (Debugging with Git)
- 7.11 سابماژول ها (Submodules)
- 7.12 بستهبندی (Bundling)
- 7.13 جایگزینی (Replace)
- 7.14 ذخیرهسازی اطلاعات ورود (Credential Storage)
- 7.15 خلاصه (Summary)
-
8. سفارشیسازی Git (Customizing Git)
-
9. گیت و سیستمهای دیگر (Git and Other Systems)
-
10. (Git Internals)
- 10.1 ابزارها و دستورات سطح پایین (Plumbing and Porcelain)
- 10.2 اشیا گیت (Git Objects)
- 10.3 مراجع گیت (Git References)
- 10.4 فایلهای بسته (Packfiles)
- 10.5 نگاشت (The Refspec)
- 10.6 پروتکلهای انتقال (Transfer Protocols)
- 10.7 نگهداری و بازیابی دادهها (Maintenance and Data Recovery)
- 10.8 متغیرهای محیطی (Environment Variables)
- 10.9 (Summary)
-
A1. پیوست A: گیت در محیطهای دیگر (Git in Other Environments)
- A1.1 رابط های گرافیکی (Graphical Interfaces)
- A1.2 Git در ویژوال استودیو (Git in Visual Studio)
- A1.3 Git در Visual Studio Code (Git in Visual Studio Code)
- A1.4 Git در IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine (Git in IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine)
- A1.5 Git در Sublime Text (Git in Sublime Text)
- A1.6 گیت در بش (Git in Bash)
- A1.7 Git در Zsh (Git in Zsh)
- A1.8 Git در PowerShell (Git in PowerShell)
- A1.9 خلاصه (Summary)
-
A2. پیوست B: گنجاندن گیت در برنامههای شما (Embedding Git in your Applications)
-
A3. پیوست C: دستورات گیت (Git Commands)
- A3.1 تنظیم و پیکربندی (Setup and Config)
- A3.2 گرفتن و ایجاد پروژهها (Getting and Creating Projects)
- A3.3 نمونهبرداری پایهای (Basic Snapshotting)
- A3.4 انشعابگیری و ادغام (Branching and Merging)
- A3.5 بهاشتراکگذاری و بهروزرسانی پروژهها (Sharing and Updating Projects)
- A3.6 بازرسی و مقایسه (Inspection and Comparison)
- A3.7 عیبیابی (Debugging)
- A3.8 اعمال تغییرات به صورت پچ (Patching)
- A3.9 ایمیل (Email)
- A3.10 سیستمهای خارجی (External Systems)
- A3.11 مدیریت (Administration)
- A3.12 دستورات سطح پایین گیت (Plumbing Commands)
7.5 ابزارهای گیت (Git Tools) - جستجو (Searching)
جستجو (Searching)
در هر اندازهای از کد، اغلب لازم است بدانید یک تابع کجا فراخوانی یا تعریف شده است، یا تاریخچه یک متد را مشاهده کنید. گیت چند ابزار مفید برای جستجوی سریع و آسان در کد و کامیتهای ذخیره شده در پایگاه داده خود ارائه میدهد. در ادامه چند نمونه از آنها را بررسی میکنیم.
گلوبال سرچ گیت (Git Grep)
گیت با دستوری به نام grep
عرضه میشود که به شما امکان میدهد به سادگی در هر درخت کامیت شده، دایرکتوری کاری یا حتی ایندکس، به دنبال یک رشته یا عبارت منظم بگردید.
در مثالهای بعدی، کد منبع خود گیت را جستجو خواهیم کرد.
به طور پیشفرض، git grep
در فایلهای دایرکتوری کاری شما جستجو میکند.
به عنوان اولین تغییر، میتوانید از گزینههای -n
یا --line-number
استفاده کنید تا شماره خطهایی که گیت تطابق پیدا کرده را چاپ کند:
$ git grep -n gmtime_r
compat/gmtime.c:3:#undef gmtime_r
compat/gmtime.c:8: return git_gmtime_r(timep, &result);
compat/gmtime.c:11:struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
compat/gmtime.c:16: ret = gmtime_r(timep, result);
compat/mingw.c:826:struct tm *gmtime_r(const time_t *timep, struct tm *result)
compat/mingw.h:206:struct tm *gmtime_r(const time_t *timep, struct tm *result);
date.c:482: if (gmtime_r(&now, &now_tm))
date.c:545: if (gmtime_r(&time, tm)) {
date.c:758: /* gmtime_r() in match_digit() may have clobbered it */
git-compat-util.h:1138:struct tm *git_gmtime_r(const time_t *, struct tm *);
git-compat-util.h:1140:#define gmtime_r git_gmtime_r
علاوه بر جستجوی ساده بالا، git grep
گزینههای جالب و متنوع دیگری نیز دارد.
برای مثال، به جای چاپ همه تطابقها، میتوانید از گزینههای -c
یا --count
استفاده کنید تا خروجی خلاصه شدهای ببینید که فقط فایلهایی را نشان میدهد که رشته جستجو را داشتند و تعداد تطابقها در هر فایل چقدر بوده است:
$ git grep --count gmtime_r
compat/gmtime.c:4
compat/mingw.c:1
compat/mingw.h:1
date.c:3
git-compat-util.h:2
اگر به متن پیرامونی رشته جستجو علاقه دارید، میتوانید با یکی از گزینههای -p
یا --show-function
تابع یا متدی که هر رشته تطبیقیافته در آن قرار دارد را نمایش دهید:
$ git grep -p gmtime_r *.c
date.c=static int match_multi_number(timestamp_t num, char c, const char *date,
date.c: if (gmtime_r(&now, &now_tm))
date.c=static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt)
date.c: if (gmtime_r(&time, tm)) {
date.c=int parse_date_basic(const char *date, timestamp_t *timestamp, int *offset)
date.c: /* gmtime_r() in match_digit() may have clobbered it */
همانطور که میبینید، تابع gmtime_r
هم در توابع match_multi_number
و match_digit
در فایل date.c
فراخوانی شده است (مورد سوم که نمایش داده شده فقط رشتهای است که در یک کامنت آمده).
همچنین میتوانید با استفاده از پرچم --and
به دنبال ترکیبهای پیچیدهای از رشتهها بگردید، به گونهای که چندین تطابق باید در یک خط متن وجود داشته باشند.
برای مثال، بیایید دنبال خطوطی باشیم که ثابتی تعریف میکنند که نام آن شامل هر یک از زیررشتههای “LINK” یا “BUF_MAX” باشد، و این جستجو را در نسخه قدیمیتر کد منبع گیت که به تگ v1.8.0
اشاره دارد انجام دهیم (همچنین گزینههای --break
و --heading
را اضافه میکنیم تا خروجی خواناتر شود):
$ git grep --break --heading \
-n -e '#define' --and \( -e LINK -e BUF_MAX \) v1.8.0
v1.8.0:builtin/index-pack.c
62:#define FLAG_LINK (1u<<20)
v1.8.0:cache.h
73:#define S_IFGITLINK 0160000
74:#define S_ISGITLINK(m) (((m) & S_IFMT) == S_IFGITLINK)
v1.8.0:environment.c
54:#define OBJECT_CREATION_MODE OBJECT_CREATION_USES_HARDLINKS
v1.8.0:strbuf.c
326:#define STRBUF_MAXLINK (2*PATH_MAX)
v1.8.0:symlinks.c
53:#define FL_SYMLINK (1 << 2)
v1.8.0:zlib.c
30:/* #define ZLIB_BUF_MAX ((uInt)-1) */
31:#define ZLIB_BUF_MAX ((uInt) 1024 * 1024 * 1024) /* 1GB */
دستور git grep
چند مزیت نسبت به دستورات جستجوی معمولی مانند grep
و ack
دارد.
اول اینکه بسیار سریع است، دوم اینکه میتوانید در هر درخت گیت جستجو کنید، نه فقط دایرکتوری کاری.
همانطور که در مثال بالا دیدیم، ما در نسخه قدیمیتر کد منبع گیت جستجو کردیم، نه نسخهای که در حال حاضر چکاوت شده بود.
جستجوی تاریخچه گیت (Git Log Searching)
شاید شما به دنبال محل یک عبارت نیستید، بلکه میخواهید بدانید چه زمانی آن وجود داشت یا معرفی شده است.
دستور git log
ابزارهای قدرتمندی برای یافتن کامیتهای خاص بر اساس محتوای پیامها یا حتی محتوای تغییراتی که ایجاد کردهاند، دارد.
برای مثال، اگر بخواهیم بفهمیم ثابت ZLIB_BUF_MAX
چه زمانی معرفی شده است، میتوانیم از گزینه -S
(که به شوخی به آن گزینه "تبر گیت" گفته میشود) استفاده کنیم تا گیت فقط کامیتهایی را نشان دهد که تعداد وقوع آن رشته را تغییر دادهاند.
$ git log -S ZLIB_BUF_MAX --oneline
e01503b zlib: allow feeding more than 4GB in one go
ef49a7a zlib: zlib can only process 4GB at a time
اگر به دیف تغییرات آن کامیتها نگاه کنیم، میبینیم که در کامیت ef49a7a
این ثابت معرفی شده و در کامیت e01503b
تغییر کرده است.
اگر نیاز به جستجوی دقیقتری دارید، میتوانید با گزینه -G
یک عبارت منظم برای جستجو ارائه دهید.
جستجوی تاریخچه خط (Line Log Search)
یکی دیگر از جستجوهای پیشرفته ولی بسیار مفید، جستجوی تاریخچه یک خط است.
کافی است دستور git log
را با گزینه -L
اجرا کنید تا تاریخچه یک تابع یا خط کد در کدبیس شما نشان داده شود.
برای مثال، اگر بخواهیم هر تغییری که روی تابع git_deflate_bound
در فایل zlib.c
اعمال شده را ببینیم، میتوانیم دستور git log -L :git_deflate_bound:zlib.c
را اجرا کنیم.
گیت سعی میکند مرزهای آن تابع را تشخیص دهد و سپس تاریخچه آن را به شکل مجموعهای از پچها از زمان ایجاد تابع نمایش دهد.
$ git log -L :git_deflate_bound:zlib.c
commit ef49a7a0126d64359c974b4b3b71d7ad42ee3bca
Author: Junio C Hamano <gitster@pobox.com>
Date: Fri Jun 10 11:52:15 2011 -0700
zlib: zlib can only process 4GB at a time
diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -85,5 +130,5 @@
-unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+unsigned long git_deflate_bound(git_zstream *strm, unsigned long size)
{
- return deflateBound(strm, size);
+ return deflateBound(&strm->z, size);
}
commit 225a6f1068f71723a910e8565db4e252b3ca21fa
Author: Junio C Hamano <gitster@pobox.com>
Date: Fri Jun 10 11:18:17 2011 -0700
zlib: wrap deflateBound() too
diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -81,0 +85,5 @@
+unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+{
+ return deflateBound(strm, size);
+}
+
اگر گیت نتواند تابع یا متد را در زبان برنامهنویسی شما تشخیص دهد، میتوانید یک عبارت منظم (regex) به آن بدهید.
برای مثال، این دستور همان کاری را انجام میدهد که مثال بالا:
git log -L '/unsigned long git_deflate_bound/',/^}/:zlib.c
همچنین میتوانید بازهای از خطوط یا شماره خط خاصی بدهید و خروجی مشابه دریافت کنید.