-
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)
10.5 (Git Internals) - نگاشت (The Refspec)
نگاشت (The Refspec)
در سراسر این کتاب، ما از نگاشتهای ساده بین remote branches و local references استفاده کردهایم، اما این نگاشتها میتوانند پیچیدهتر باشند. فرض کنید مراحل چند بخش قبلی را دنبال کردهاید و یک مخزن محلی کوچک Git ساختهاید و حالا میخواهید یک remote به آن اضافه کنید:
$ git remote add origin https://github.com/schacon/simplegit-progit
اجرای دستور بالا بخشی به فایل .git/config
مخزن شما اضافه میکند که نام remote (origin
)، آدرس URL مخزن ریموت و refspec مورد استفاده برای fetching را مشخص میکند:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
فرمت refspec به این صورت است: ابتدا یک +
اختیاری، و سپس <src>:<dst>
.
در اینجا <src>
الگوی references در سمت ریموت است و <dst>
محلی است که آن references در آن ردیابی خواهند شد.
علامت +
به Git میگوید که reference را حتی اگر fast-forward نباشد، بهروزرسانی کند.
در حالت پیشفرض که بهطور خودکار توسط دستور git remote add origin
نوشته میشود، Git تمام references زیر مسیر refs/heads/
روی سرور را دریافت کرده و آنها را به refs/remotes/origin/
در سیستم محلی مینویسد.
بنابراین، اگر روی سرور یک branch به نام master
وجود داشته باشد، شما میتوانید لاگ آن branch را بهصورت محلی از طریق هر یک از مسیرهای زیر مشاهده کنید:
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
همه آنها معادل هستند، چون Git همه آنها را به refs/remotes/origin/master
بسط میدهد.
اگر بخواهید Git فقط branch master
را هر بار دریافت کند (و نه همه branches روی سرور ریموت)، میتوانید خط مربوط به fetch را تغییر دهید تا فقط به همان branch اشاره کند:
fetch = +refs/heads/master:refs/remotes/origin/master
این فقط refspec پیشفرض برای git fetch
آن remote است.
اگر بخواهید تنها یک بار این کار را انجام دهید، میتوانید refspec موردنظر را مستقیم در خط فرمان مشخص کنید.
برای کشیدن branch master
از ریموت و ذخیره آن بهعنوان origin/mymaster
محلی، میتوانید اجرا کنید:
$ git fetch origin master:refs/remotes/origin/mymaster
شما همچنین میتوانید چندین refspec مشخص کنید. روی خط فرمان میتوانید چند branch را اینطور دریافت کنید:
$ git fetch origin master:refs/remotes/origin/mymaster \
topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
! [rejected] master -> origin/mymaster (non fast forward)
* [new branch] topic -> origin/topic
در این حالت، pull مربوط به branch master
رد شد چون بهعنوان یک fast-forward reference لیست نشده بود.
میتوانید با اضافه کردن +
جلوی refspec آن را مجبور به انجام کنید.
شما همچنین میتوانید چندین refspec برای fetching در فایل configuration تعریف کنید.
اگر بخواهید همیشه branches master
و experiment
را از remote به نام origin
دریافت کنید، باید دو خط اضافه کنید:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/experiment:refs/remotes/origin/experiment
از Git نسخه 2.6.0 به بعد میتوانید از partial globs در الگوها استفاده کنید تا چند branch را همزمان انتخاب کنید، مثلاً:
fetch = +refs/heads/qa*:refs/remotes/origin/qa*
حتی بهتر اینکه میتوانید از namespaces (یا directories) برای رسیدن به همین نتیجه به شکلی ساختیافتهتر استفاده کنید.
اگر تیم QA تعدادی branches را push کند و شما بخواهید branch master
و همه branches آن تیم QA را دریافت کنید (و هیچ چیز دیگری)، میتوانید بخشی از تنظیمات خود را اینطور تعریف کنید:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
اگر یک فرآیند کاری پیچیده داشته باشید که در آن تیم QA، تیم توسعهدهندهها و تیم یکپارچهسازی هر کدام branches خودشان را push کنند و روی remote branches همکاری داشته باشند، با این روش میتوانید خیلی راحت آنها را با namespace مدیریت کنید.
نگاشتهای پوش (Pushing Refspecs)
این عالی است که میتوانید namespaced references را اینطور دریافت کنید، اما تیم QA چطور باید branches خودشان را درون یک فضای qa/
روی سرور قرار دهند؟
این کار با استفاده از refspecs هنگام push انجام میشود.
اگر تیم QA بخواهد branch master
خودش را به qa/master
روی سرور push کند، میتواند اجرا کند:
$ git push origin master:refs/heads/qa/master
اگر بخواهند Git این کار را بهصورت خودکار هر بار که git push origin
اجرا میشود انجام دهد، میتوانند یک مقدار push در فایل تنظیمات اضافه کنند:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
در این صورت، اجرای git push origin
باعث میشود که branch محلی master
به branch qa/master
روی سرور push شود.
یادداشت
|
شما نمیتوانید از refspec برای fetch از یک مخزن و push به مخزن دیگری استفاده کنید. برای نمونهای از این کار، به بهروز نگه داشتن مخزن عمومی گیتهاب شما (Keep your GitHub public repository up-to-date) مراجعه کنید. |
Deleting References
همچنین میتوانید از refspec برای حذف references از روی سرور ریموت استفاده کنید، با اجرای چیزی شبیه این:
$ git push origin :topic
از آنجایی که فرمت refspec به صورت <src>:<dst>
است، وقتی بخش <src>
را حذف کنید، در واقع میگویید که branch topic
روی ریموت هیچ چیزی نباشد، و این باعث حذف آن میشود.
یا میتوانید از دستور جدیدتر (که از Git نسخه v1.7.0 به بعد در دسترس است) استفاده کنید:
$ git push origin --delete topic