کتاب فارسی آموزش git

نوشته شده توسط:داریوش عباسی و مشارکت کنندگان آزاد.

مدیریت کدمنبع

اصطلاح کنترل کدمنبع ( source control ) یا کنترل نسخه ( version control، همچنین revision control ) به عمل مدیریت، کنترل و ثبت و ضبط مستنداتی همچون کدها و مستندات نرم افزاری، اطلاعات وبسایت‌ها، تاریخچه‌ی تغییرات تصاویر و مواردی از این دست اطلاق می‌شود. تغییرات معمولا با یک شماره نسخه ذخیره می‌شوند. سیستم‌های کنترل‌نسخه ( version control systems ) هم بصورت مجزا برای کنترل تغییرات نوشته‌ها و کدها و در مواردی کنترل تصاویر و فایل‌های ویدیویی ساخته و عرضه میشوند و هم در برخی از نرم‌افزارهای واژه‌پرداز یا ویرایشگرهای تصویر و سایر انواع مستندات بصورت درونی پیاده‌سازی شده‌اند. نرم‌افزارهای کنترل نسخه، پایه‌ی کارهای تیمی در تیم‌های نرم افزاری متشکل از چند توسعه‌دهنده است. در تیم‌های نرم‌افزاری، انتشار نسخه‌های مختلف از نرم‌افزار، توسعه بصورت تیمی و رفع کردن باگها بصورت اشتراکی و مواردی از این دست همواره درحال انجام هستند. این امور بدون حضور نرم‌افزاری قدرتمند برای کنترل امور، بسیار سخت، با پتانسیل بالای خطا و طاقت فرساست و البته نتیجه‌ی حاصل هم آنچه که باید باشد، نیست. سیستم‌های کنترل نسخه و مدیریت کد منبع امور ذکر شده را از هر زمانی آسانتر کرده‌اند.

مدیریت کد منبع با git

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

روش‌ها و همچنین ابزارهای زیادی برای این کار معرفی شده اند و git یکی از این ابزارهاست که یکی از بهترین برنامه‌نویسان یعنی لینوس توروالدز -خالق لینوکس- آن را برای اولین بار برای توسعه‌ی کرنل لینوکس توسعه داد و هم اکنون به ابزاری کلیدی در عمده‌ی پروژه‌های برنامه‌نویسان بدل شده است.

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

چرا نیاز داریم از ابزارهای مدیریت کد منبع استفاده کنیم؟

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

این کار تا حدی جواب می‌دهد، اما در این صورت با انبوهی از دایرکتوری‌هایی که مانند یک غول بی‌شاخ و دم بزرگ می‌شوند چه میکنید؟ و از آن بدتر چگونه آن را با افراد دیگری که با شما در انجام آن همکاری میکنند مشترک می‌شوید؟

ابزارهای مدیریت کد منبع پاسخی برای این شلختگی‌ها و شلوغی‌هاست. با استفاده از این ابزارها می‌توانید هرلحظه ای که مایل بودید تغییرات خود را ثبت کنید، به تغییرات ثبت شده در گذشته برگردید و به راحتی با دوستان و افراد تیمتان روی پروژه ای همکاری کنید، بدون اینکه نگران بهم‌ریختگی و نامنظم شدن کدهای پروژه باشید. میتوانید برای هر تغییر که ثبت میکنید توضیحاتی بنویسید، تغییراتی که دیگران در پروژه لحاظ نموده اند را ببینید و البته منشاء باگ‌ها و خطاهای احتمالی را به سادگی یافته و رفع‌ و رجوع کنید.

در این میان ابزارهای زیادی برای این‌دست کارها ساخته شده است که هرکدام نگاه و شیوه‌ی متفاوتی را برای حل این مشکل در پیش گرفته است. معروفترین این ابزارها عبارتند از git، svn، mercurial و cvs که البته در این میان git یکی از جوانترین و پرطرفدارترین ابزارهای مدیریت کدمنبع است و ویژگی‌های ساده و متمایز آن باعث شده عمده‌ی تیم‌های نرم‌افزاری در دنیا به استفاده از این ابزار خوب روی بیاورند. در این کتاب با گیت آشنا میشویم.

گیت چیست؟

گیت یک سیستم مدیریت کد منبع توزیع شده است که میتوانید نوشته‌ها و کدهایتان را با آن در سیستم شخصی خودتان مدیریت کنید و تغییرات کدهایتان را داشته باشید، به تغییراتی در گذشته برگردید مثلا به ریلیز خاصی از پروژه، کدها را روی یک سرور گیت ( مانند گیت هاب) با دیگران سهیم شوید و گروهی روی توسعه‌ی یک پروژه همکاری کنید و از تغییراتی که هر عضو روی پروژه میدهد آگاهی یابید.

به پروژه‌هایی که در آنها گیت استفاده میشود مخزن ( repository ) میگویند. بک مخزن گیت حاوی تمامی کدها، تغییرات کد و تنظیمات گیت برای آن پروژه است.

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

چرا git

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

گیت به تغییرات کدها تنها به عنوان چند خطی که تغییر میکنند نگاه نمیکند و پس از ثبت هر تغییر (اصطلاحا کامیت ( commit )) یک تصویر کلی از پروژه را در لحظه‌ی آن تغییر ذخیره میکند و بررسی تغییرات با اطمینان و سرعت بالاتری امکانپذیر میشود.

همچنین گیت برخلاف بسیاری از سیستم‌های مدیریت کد منبع وابستگی به سرور اصلی ندارد و تقریبا هرکاری را میتوان بصورت محلی ( local ) انجام داد، در هر لحظه ای و هر شرایطی کافیست تنها گیت را روی سیستم خود داشته باشید، تغییراتتان را ثبت کنید و هر زمان که به شبکه‌‌ای که سرور گیت شما در آن قرار دارد ( مانند اینترنت!) دسترسی داشتید میتوانید تغییرات ذخیره شده را به مخزن روی سرور اضافه کنید و البته تمام تغییرات پروژه را هم بدون نیاز به اینترنت در مخزن محلی خود داشته باشید.

استفاده از گیت بسیار ساده است. تیم توسعه‌ی گیت یک نرم‌افزار تحت خط فرمان برای استفاده از گیت ساخته است. همچنین پروژه های زیادی هم برای کار با گیت چه به‌عنوان افزونه ( plugin ) برای ویرایشگرها و محیط‌های مجتمع توسعه و چه بصورت برنامه‌های جدا با رابط گرافیکی توسعه داده می‌شوند و امروز تقریبا در هرمحیطی میتوان روشی برای استفاده از گیت یافت.

نصب گیت

پیش‌نیازها

قبل از شروع کار با گیت لازم است مختصر آشنایی با دستورات خط فرمان در سیستم عامل خود داشته باشید. اگر از سیستم‌عامل‌های خانواده‌ی یونیکس (مثل لینوکس و OSX) استفاده می‌کنید و با محیط ترمینال و دستورات اولیه‌ی آن آشنا نیستید، می‌توانید از ضمیمه‌ی ۱ کتاب برای آشنایی با دستورات خط فرمان استفاده کنید.اگر هم از ویندوز استفاده میکنید سعی کنید گیت را به همراه بسته‌ی خط فرمان یونیکس نصب کنید یا با دستورات پایه خط فرمان ویندوز آشنا شوید. توجه داشته باشید که این آشنایی بیشتر از چند دقیقه از شما زمان نمیگیرد و شما تنها نیاز دارید ساختار دستورها و دستورات اولیه جابجایی بین دایرکتوری ها را بدانید.

نصب گیت

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

نصب بر روی لینوکس

نصب گیت بر روی توزیع‌های مختلف لینوکس به شیوه‌های مختلف امکان پذیر است که متداول‌ترین روش، نصب از روی مدیربسته‌های توزیع مورد نظر است.

دستورات نصب از مدیربسته ها در توزیع های معروف :

نصب بر روی دبیان و اوبونتو :

apt-get install git

نصب بر روی جنتو :

emerge --ask --verbose dev-vcs/git

نصب بر روی آرچ‌ لینوکس :

pacman -S git

نصب بر روی اوپن‌ زوزه :

zypper install git

نصب بر روی فدورا (تا نسخه‌ی ۲۱):

yum install git

نصب بر روی فدورا( نسخه‌ی ۲۲ و بالاتر) :

dnf install git

نصب بر روی mac os

نصب بر روی osx با پکیج منیجر هوم برو (Homebrew) :

brew install git

نصب بر روی ویندوز

برای نصب گیت روی سیستم‌عامل ویندوز، به صفحه‌ی دانلود گیت در وبگاه رسمی پروژه بروید و نسخه‌ی ۳۲ یا ۶۴ بیتی آن را، متناسب با معماری مورد استفاده‌ سیستم‌عامل خود دانلود و نصب کنید.

پیکربندی

بعد از نصب گیت لازم است تنظیماتی را انجام دهید و همچنین خودتان را به گیت معرفی کنید.این کار بخاطر ثبت تغییرات لحاظ شده توسط شما به نام شما و همچنین شخصی‌سازی‌ کردن ویژگی‌های گیت است.

تنظیمات گیت در سه سطح قابل انجام است : system ،global ،local

  • سطح system: اگر تنظیمات را در این سطح انجام دهید تنظیمات شما روی مخازن تمام کاربرهای آن سیستم اعمال خواهد شد. این تنظیمات تغییرات در /etc/config ذخیره می‌شوند.
  • سطح global: اگر تنظیمات را در سطح global انجام دهید تنظیمات شما روی مخازن کاربر فعلی سیستم اعمال خواهد شد. این تنظیمات در ~/.gitconfig یا ~/.config/git/config ذخیره می‌شوند.
  • سطح local: تنظیمات در این سطح تنها روی مخزنی که در آن قرار دارید اعمال می‌شود. این تنظیمات در دایرکتوری مخزن در فایل .git/config ذخیره می‌شود.

تنظیمات اساسی در گیت از این قرار هستند:

برای اضافه کردن نام خود از دستور زیر استفاده کنید:

git config --global user.name "نام شما"

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

git config --global user.email آدرس ایمیل شما

توجه کنید که این تنظیمات اجباریست و در صورت عدم انجام تنظیمات در مراحل بعدی کار با گیت با مشکل مواجه می‌شوید.

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

git config --global core.editor ویرایشگر

برای مثال برای تنظیم ویرایشگر ایمکس (Emacs) به عنوان ویرایشگر پیش‌فرض از دستور زیر استفاده کنید:

git config --global core.editor emacs

توجه داشته باشید که شما بجای global میتوانید هرکدام از سطوح معرفی شده در بالا را استفاده کنید اما توصیه همان global است مگر در شرایط خاص. با این روش تنظیم گیت تنها یکبار و برای همیشه برای کاربر فعلی سیستم انجام شده است.

اگر می‌خواهید محتویات یک تنظیم خاص برای مثال user.name را ببینید از دستور زیر استفاده کنید:

git config user.name

و برای بررسی تمام تنظیماتی که انجام داده‌اید از دستور زیر استفاده کنید:

git config --list

اگر مجبورید بجای ssh از پروتکل https استفاده کنید، میتوانید نام کاربری و پسورد خود را کش کنید:

git config --global credential.helper cache

برای راهنمایی بیشتر می‌توانید از صفحات راهنما برای مشاهده‌ی تنظیمات بیشتر گیت استفاده کنید:

man git-config

alias ها

در گیت دستورات مختلفی داریم از جمله دستور config که با آن آشنا شدید اما این دستورات برای استفاده‌ به تعدد در طول روز ممکن است گاهی طولانی و خسته کننده بنظر بیایند. طراحان گیت امکانی تحت عنوان alias در تنظیمات گیت گنجانده‌اند که میتوانید برای دستورات پر کاربرد خود نام‌های مستعاری تعریف کنید و با آنها دستورات خود را اجرا کنید مثلا بجای git init بنویسید git i.

برای ساخت این alias ها از قالب زیر استفاده کنید :

git config --global alias.i init

که در این دستور نام مستعار i برابر اجرای دستور init بصورت سراسری قرارداده شد که از این به بعد از اجرای دستور git i دستور git init اجرا میشود و میتوانید دستورات دیگری را هم با همین روش و به هر نامی که میخواهید برای خود تنظیم کنید.

تنظیم گیت برای زبان فارسی

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

git config --global core.quotepath false

مطالعه بیشتر

در صفحات راهنمای گیت در ساختار یونیکس میتوانید اطلاعات بیشتری در این مورد بیابید. صفحه‌ی راهنمای تنظیمات گیت در سیستم‌های خانواده‌یونیکس را با دستور man git-config بخوانید.

شروع یک پروژه با گیت

دایرکتوری پروژه هایی که از سیستم‌های مدیریت کد منبع مثل گیت استفاده می‌کنند، با عنوان یک repository (در اصطلاح عامیانه ریپو، گاهی در فارسی مخزن) می‌خوانند. برای شروع کار با گیت در یک دایرکتوری به عنوان یک مخزن گیت، لازم است که ابتدا به گیت بگویید که میخواهید این دایرکتوری یک مخزن گیت باشد. دستور git init یک مخزن جدید گیت ایجاد می‌کند. مخزنی که درون آن میتوانید از امکانات گیت استفاده کنید و دستورات را در آن اجرا کنید. با اجرای این دستور یک دایرکتوری با نام .git/ درون دایرکتوری حاضر شما ایجاد میشود که حاوی فایلهای کانفیگ و فایلها و بلابهای تغییرات ثبت شده توسط گیت است.

برای اضافه کردن گیت به یک پروژه، داخل دایرکتوری پروژه دستور زیر را وارد کنید:

git init

یا برای ساختن یک پروژه‌ی جدید دستور زیر را استفاده می‌کنیم:

git init نام‌دایرکتوری

که این دستور یک دایرکتوری با نامی که وارد کرده‌اید می‌سازد و گیت را به آن اضافه می‌کند.

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

نمایش تغییرات

یکی از اساسی‌ترین کارهایی که با گیت می‌کنیم بررسی و ثبت تغییرات ایجاد شده در فایل‌های متنی پروژه است.

هر زمان که تغییرات ثبت نشده‌ی پروژه را مایل بودید بررسی کنید، دستور زیر را وارد کنید:

git status

این دستور فایل‌هایی که تغییر داده‌اید را برای شما لیست می‌کند. تغییرات شامل: ویرایش یک فایل، اضافه‌کردن فایل جدید یا حذف یک فایل و همچنین فایلهای استیج شده یا استیج نشده که دو مورد اخر را بعدا بررسی خواهیم کرد.

برای نمایش استاتوس به‌صورت خلاصه از گزینه ی -s با آن استفاده کنید:

git status -s

اضافه‌کردن فایل‌ها

ثبت تغییرات در گیت بصورت معمول دو مرحله دارد: 1. اضافه کردن فایل‌های تغییر داده شده‌ی مورد نظر 2. ثبت تغییرات با یک پیام یا توضیح

برای اضافه‌کردن فایل‌ها به گیت از دستور add استفاده می‌کنیم. به‌صورت زیر:

git add فایل۱ فایل۲ فایل۳

و برای افزودن تمام فایل‌های تغییرداده‌شده دستور را به‌صورت زیر استفاده می‌کنیم:

git add -A

دستور git status که پیشتر توضیح داده شد، برای یافتن فایل‌های تغییر داده شده و اضافه‌کردن آن‌ها به شما کمک می‌کند.

ثبت تغییرات

برای ثبت تغییرات یا به اصطلاح کامیت‌کردن تغییرات، از دستور commit استفاده می‌کنیم. در این مرحله فایل‌هایی را که با دستور add به حالت stage برده‌ایم در سیستم گیت ثبت می‌کنیم. برای ثبت هر تغییر نیاز است یک پیام هم با آن ثبت شود تا معلوم شود در این قسمت از تغییرات لحاظ شده چه کار کرده‌ایم، یا چه تغییراتی داده‌ایم.

برای مثال اگر ما یک فایل متنی برای نوشتن توضیحات پروژه به نام readme.md ساخته باشیم و با دستور add آن را برای کامیت‌شدن آماده کرده باشیم، می‌توانیم به همراه کامیت خود یک پیام با مضمون add read me file ثبت کنیم که تغییرات، برای مطالعه در آینده شفاف‌تر باشند.

دستور کامیت بصورت زیر است:

git commit

که با اجرای این دستور ویرایش‌گرِ فایل شما باز شده و میتوانید پیام خود را در آن بنویسید و ذخیره کنید و به این صورت تغییرات فایل شما ثبت می‌شود و یک کامیت صورت می‌گیرد.

یک راه متداول‌تر هم که برای پیام‌های کامیت یک خطی کاربرد دارد، بصورت زیر است:

git commit -m پیام شما

که در این روش کامیت شما با همان پیام ذخیره شده، و نیازی به باز شدن ویرایش‌گر متن ندارید.

قرار داد استاندارد برای پیام کامیت : 1 . در زمان حال نوشته شود 2 . در هنگام استفاده از سوییچ -m کمتر پیام کمتر از 50 کاراکتر باشد .

تغییر محتوای آخرین کامیت

فرض کنیم که اشتباهی در نوشتن پیام یک کامیت داشته اید و یا به هر دلیل دیگر قصد تغییر پیام آخرین کامیت را دارید و این مورد را پس از انجام کامیت متوجه شده اید. برای تغییر دوباره‌ی پیام آخرین کامیت از گزینه‌ی –amend به همراه دستور کامیت استفاده میکنیم. مانند مثال :

git commit --amend -m "new commit message"

حذف فایل‌ها

اگر پس از ثبت یک فایل آن فایل را حذف کنیم، برای اضافه کردن تغییرات فایل حذف شده، دیگر امکان استفاده از add را نداریم و باید با دستور rm آن فایل را حذف کنیم:

git rm فایل۱ فایل۲ فایل۳

دقت داشته باشید برخلاف دستور add، استفاده از git rm . تمام فایل‌های پروژه را حذف می‌کند نه فقط فایل‌های حذف شده را پس از آن استفاده نکنید. :)

اگر اشتباهاً فایل‌های زیادی را دستی پاک کردیم بدون اینکه از دستور git rm استفاده کنیم، لازم است که تک‌تک فایل‌هایی را که دستی پاک کرده‌ایم را با دستور git rm به حالت stage در آوریم. یا اینکه از دستور زیر استفاده کنیم:

git rm $(git ls-files --deleted)

اگر بین نام فایل‌های پاک شده، نویسهٔ فاصله وجود داشته باشد از دستور زیر استفاده می‌کنیم:

git ls-files --deleted -z | xargs -0 git rm

نمایش تغییرات

برای بررسی تغییرات صورت گرفته در چند کامیت یا تغییرات کامیت‌نشده در مقابل تغییرات کامیت‌شده از دستور diff استفاده می‌کنیم.

حالت ساده‌ی استفاده از این دستور بصورت زیر است:

git diff

که این دستور تغییرات کامیت نشده‌ی تمام فایل‌ها را به شما نشان می‌دهد. همچنین به‌صورت زیر می‌توانید تغییرات یک فایل خاص را نیز ببینید:

git diff نام‌فایل

لاگ

برای نمایش لیست کامیت‌ها از دستور log استفاده می‌کنیم. با این دستور می‌توان لیست کامیت‌های یک برنچ خاص، یا تمامی برنچ‌ها یا مقایسه‌ی بین برنچ‌ها را دید.

شکل کلی این دستور بصورت زیر است: .. code-block:: bash

git log

که لیستی از تمام کامیت‌ها را به شما نمایش می‌دهد.

می‌توانید کامیت‌های یک برنچ مشخص را نیز بصورت جداگانه با مشخص‌کردن نام برنچ ببینید:

git log نام‌برنچ

چند گزینه‌ی کاربردی

  • از –graph برای نمایش کامیت‌ها و برنچ‌ها بصورت گراف تغییرات استفاده می‌کنیم.
  • از –grep=<pattern> برای جستجو در میان کامیت‌ها با استفاده از رجکس‌ها استفاده می‌کنیم.
  • از –merges برای نمایش کامیت‌هایی که در ادغام برنچ‌ها ثبت شده‌اند استفاده می‌کنیم.
  • از آپشن ‍`–oneline` برای نمایش هر کامیت در یک خط استفاده می‌کنیم.

توضیحات بیشتر در این مورد در صفحه ی راهنمای گیت: git log –help.

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

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

ignore

ممکن است در دایرکتوری پروژه فایل‌هایی داشته باشید، که نخواهید گیت آن‌ها را در استاتوس‌ها نشان دهد، و همچنین نخواهید در مخزن اصلی اضافه شوند.برای این‌کار باید در دایرکتوری پروژه یک فایل به نام .gitignore بسازید و در آن، لیستِ فایل‌ها و دایرکتوری‌هایی را که گیت باید نادیده بگیرد را بنویسید.

برای مثال لیست زیر:

# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

لیستی از فایل‌ها و دایرکتوری‌هاست، که گیت بعد از ساخته شدن فایل .gitignore نادیده میگیرد . توجه کنید که خود فایل .gitignore باید توسط دستور add به پروژه اضافه و کامیت شود . توجه کنید در این فایل، خطوطی که با # شروع می‌شوند، به عنوان توضیحات (کامنت) در نظر گرفته می‌شوند.

برَنچ‌ها

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

برای ساختن یک برنچ توسعه‌ی جدید، از دستور زیر استفاده کنید: .. code-block:: bash

git branch نام‌برنچ

برای نمایش لیستی از برنچ‌ها از دستور زیر استفاده کنید: .. code-block:: bash

git branch

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

git checkout نام‌برنچ

همچنین برای حذف یک شاخه از دستور زیر استفاده می‌شود:

git branch -d نام‌برنچ

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

git checkout -b نام‌برنچ

برای پاک‌کردن برنچ مخزن ریموتی که قبلاً با آپشن -d آن را از مخزن محلی پاک کرده‌ایم دستور زیر را به کار برید:

git push origin :<branch-name>

ترکیب

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

git merge شاخه

با این دستور محتویات شاخه‌ی داده شده به دستور، با شاخه‌ی فعلی ترکیب می‌شود.

در صورتی که بخواهیم تاریخچهٔ کامیت‌های شاخهٔ مورد نظر در شاخهٔ اصلی وارد نشود و فقط با شاخهٔ اصلی ترکیب شود از آپشن –squash‌ به صورت زیر استفاده می‌کنیم:

git merge <branch_name> --squash

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

git checkout -m <filename>

استفاده از ریموت

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

می‌توانید از سرویس‌های اینترنتی مانند گیت‌هاب، بیت‌باکت و بسیاری سرویس‌های دیگر استفاده کنید یا سرور گیت خودتان را راه بیاندازید، اما بحث این قسمتِ ما، ارتباط با مخازن ریموت است نه ساخت آن‌ها.

remote

برای نمایش، اضافه و حذف کردنِ تغییرات در یک مخزن ریموت از دستور remote استفاده می‌شود.

برای نمایش لیستی از ریموت‌ها از دستور زیر استفاده میشود :

git remote

که این دستور ریموت های موجود در مخزن را لیست می‌کند.

برای اضافه کردن یک مخزن از دستور remote add بصورت زیر استفاده میشود : .. code-block:: bash

git remote add [name] [url]

که در این دستور بجای [name]، یک نام برای ریموت مورد نظر و به‌جای [url]، آدرس مخزن مورد نظر را قرار می‌دهیم.

برای حذف یک ریموت رپوزیتوری هم دستور بالا را بصورت زیر تغییر می‌دهیم:

git remote rm [name]

push

برای افزودن تغییرات کامیت‌شده در مخزن به مخزن ریموت از دستور push استفاده می‌کنیم به‌صورت زیر:

git push [remote-repo-name] [branch-name]

که به جای remote-repo-name نام ریموت سرور مورد نظر (که قبلا باید اضافه کرده باشید) و به جای branch-name نام شاخه‌ی مورد نظر که تغییرات را در آن لحاظ کرده‌ایم.

pull

برای دریافت تغییرات کامیت‌شده به مخزن ریموت از دستور pull بصورت زیر استفاده می‌کنیم: .. code-block:: bash

git pull [remote-repo-name]

که به‌جای remote-repo-name، نام ریموت سرور مورد نظر را می‌نویسیم.

بازگردانی تغییرات

![چرخه‌ی زندگی در گیت](http://git-scm.com/book/en/v2/book/02-git-basics/images/lifecycle.png)

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

ریست فایل های استیج شده

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

git reset HEAD نام فایل

سرویس‌های میزبانی مخازن گیت

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

در این قسمت چند سرویس معروف و معتبر را بررسی می‌کنیم.

گیت‌هاب

گیت‌هاب به آدرس معروف‌ترین سرویس میزبانی پروژه‌های گیت است که پروژه‌های بزرگ و معتبر زیادی مانند [کرنل لینوکس](https://github.com/torvalds/linux)، (جی کوئری)[https://github.com/jquery/jquery]، (بوت استرپ)[https://github.com/twbs/bootstrap] و بسیار پروژه‌ی دیگر روی گیت‌هاب توسعه داده می‌شوند.

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

بیت‌باکت

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

تگ‌ها

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

git tag -a v2.0 -m 'version v2.0'

و برای ارسال همهٔ تگ‌ها به مخزن از راه دور، فرمان زیر را وارد کنید.

$ git push --tags

و از فرمان زیر برای ارسال یک تگ مشخص استفاده کنید:

git push origin <tag_name>

پاک‌کردن یک تگ از مخزن محلّی:

git tag -d <tag_name>

پس از این‌که تگ محلّی پاک شد، می‌توانیم تگ را از روی مخزن origin به روش زیر پاک کنیم:

git push origin :tagname

ترفندهای گیت

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

git reset HEAD <file-name>

ضمیمه ۱ - آشنایی با واسط خط فرمان (CLI)

امروزه متداول‌ترین روش تعامل با سیستم‌عامل استفاده از واسط‌های گرافیکی است (مانند پنجره‌های مختلف در سیستم‌عامل شما یا ظاهر سیستم‌عامل تلفن همراهتان) اما از ابتدای عصر کامپیوترهای دیجیتالی روش دیگری نیز بین کاربران متداول بود تحت عناوینی چون “محیط متنی” یا “واسط خط فرمان”.نرم‌افزارهای این محیط در سیستم‌های عامل مختلف با نام هایی چون ترمینال، کنسول، cmd، tty و… مورد خطاب قرار می‌گیرند و برخلاف تصور عامه (که عمدتا حاصل تبلیغات فیلم های هالیوود و مجله های تکنولوژی برای نوجوانان است)، کار در این محیط‌ها بسیار هم ساده است. به‌سادگی چند کلمه تایپ کردن. :)

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

در ترمینال‌ها دستوراتی تایپ و اجرا می‌شوند بسیاری از کارهایی که در محیط‌های گرافیکی قابل انجام بودند، اینجا هم می‌توان به همان سادگی و وضوح انجام داد. مثلا اگر در محیط گرافیکی با دابل کلیک کردن روی یک پوشه (دایرکتوری) واد آن پوشه میشدیم حالا در محیط متنی با دستور `cd نام‌پوشه` و اینتر کردن، از محیط متنی وارد پوشه ی مورد نظر خود میشوید.

دو سری سیستم های عامل پرکاربرد را مورد بررسی قرار میدهیم : - سیستم‌های عامل خانواده‌ی یونیکس (توزیع‌های لینوکس، Mac OSx، خانواده BSD و …) - سیستم عامل ویندوز

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

در هر ترمینال یک پوسته (یا شل) اجرا می‌شود که همانند زبان های برنامه‌نویسی قواعد و دستورات مشخص خود را دارند و از بین پوسته‌های مختلف میتوانید پوسته‌ی مورد نیاز خود را انتخاب نمایید.معروف‌ترین پوسته‌ی ترمینال در حال حاضر bash نام دارد که بطور پیش‌فرض روی اکثر توزیع‌های خانواده‌ی لینوکس و همچنین Mac OSx فعال است.

اجرای ترمینال در سیستم‌های عامل مختلف: - توزیع‌های لینوکس - مک‌اواس ایکس - ویندوز

دستورات مقدماتی

امیدوارم دید کلی نسبت به خط فرمان پیدا کرده باشید. حالا کمی با دستورات پایه‌ای bash درگیر میشویم.

دستور ls : لیست

دستور ls را در ترمینال خود تایپ و اینتر کنید. به‌این‌صورت:

ls

خب حالا لیست فایل‌های شما در فولدری که حاضر هستید، به شما نشان داده می‌شود. اگر اینطور نیست دوباره دستور ls را بزنید و این بار دقت کنید که دستور را تماما با حروف کوچک تایپ کنید چون bash به حروف کوچک و بزرگ حساس است

برای مثال LS با Ls برابر نیستند و البته گزینه ی درست هم ls است.

دستور mkdir : ساختن دایرکتوری جدید

دستور mkdir برای ساختن دایرکتوری‌ها به کار می‌رود. به صورت زیر:

mkdir نام‌دایرکتوری

برای مثال برای ساختن یک دایرکتوری به نام project دستور را بصورت زیر در ترمینال بنویسید و اینتر کنید:

mkdir project

خب حالا کافیست دستور ls را در ترمینال بزنید. دایرکتوری ساخته‌شده‌ی خود را در لیست نمایش داده شده خواهید دید.

دستور cd: جابجایی بین دایرکتوری‌ها

برای رفتن به داخل دایرکتوری که ساختیم، از دستور cd استفاده میکنیم.به‌صورت زیر:

cd نام‌دایرکتوری

که برای مثال ما دستور به این صورت است: .. code-block:: bash

cd project

خب شما وارد دایرکتوری project شدید. کافیست یکبار دیگر دستور ls را اجرا کنید تا از خالی بودن دایرکتوری مطمئن شوید.

فایلهای مخفی

در سیستم‌های عامل شبه‌یونیکس، فایل‌هایی که با کاراکتر “.” (نقطه) شروع می‌شوند به‌صورت پیش‌فرض مانند فایل‌های مخفی در ویندوز عمل کرده و نمایش داده نمی‌شوند. یعنی اگر دستور ls را اجرا کنید فایل‌ها و دایرکتوری‌هایی که با این کاراکتر شروع می‌شوند، نمایش داده نمی‌شود.

اما اکثر دستورات خط فرمان آپشن‌های زیادی برای بهبود عملکرد دستورات بنا به نیاز کاربران دارند، که این آپشن‌ها بعد - یا – پس از نام دستور می‌آیند. به‌عنوان یک مثال عملی برای نمایش فایل‌های مخفی با دستور ls این دستور را با آپشن -a به کار می‌بریم، بصورت زیر:

ls -a

حال لیست شما شامل فایل‌های مخفی نیز می‌شود.

صفحات راهنما

گفتیم که هر دستور آپشن‌های مختلفی برای کاربردهای مختلف دارد. برای یافتن توضیحات و همچنین آپشن‌ها و توضیحات کاربردهای آنها می‌توانید از صفحات راهنما یا Man Pageها استفاده کنید.این توضیحات با دستور man، در دسترس هستند. به‌صورت زیر:
man نام‌دستور

برای مثال برای دیدن توضیحات دستور ls دستور به‌صورت زیر می‌شود:

man ls

برای خروج از حالت نمایش صفحات راهنما، کلید q را فشار دهید.

بازگشت به عقب

در دستور cd تنها وارد شدن به دایرکتوری های مختلف را دیدیم.برای بازگشتن به دایرکتوری بالاتر از دایرکتوری حاضر دستور cd را بصورت زیر به کار می‌بریم:

cd ..

دستور pwd: نمایش مسیر حاضر

دانستن مسیری که در حال حاضر در آن قرار داریم به ما کمک می‌کند که دایرکتوری‌های مورد نظرمان را ساده‌تر بیابیم. برای این منظور از دستور pwd استفاده می‌کنیم. بصورت زیر : .. code-block:: bash

pwd

دستور بالا را بنویسید و اینتر کنید. نتیجه‌ی نمایش داده شده محلیست که در حال حاضر آنجا قرار دارید.

دستور rm: حذف

برای حذف فایل‌ها و دایرکتوری‌ها، از دستور rm استفاده می‌کنیم، اما روش حذف برای یک فایل و یک دایرکتوری متفاوت است. برای حذف یک فایل دستور را بصورت زیر استفاده میکنیم :

rm نام‌فایل

برای مثال برای حذف فایلی به نام hi.txt دستور به‌صورت زیر است:

rm hi.txt

برای حذف یک دایرکتوری آپشن ‍`-r` را به کار میبریم. به‌صورت زیر:

rm -r نام دایرکتوری

برای مثال برای حذف یک دایرکتوری به نام project دستور را بصورت زیر به کار می‌بریم:

rm -r project

توجه داشته باشید که حذف دایرکتوری به این روش خطرناک است و تمام محتویات دایرکتوری را برای همیشه حذف می‌کند.