کنترل نسخه در GIT :
بطور کلی کنترل نسخه یعنی دارا بودن تاریخچه ای از ویرایش هایی که روی یک یا چند فایل داشتهایم.
کنترل محلی نسخ :
روشی که اکثر کاربران از آن استفاده میکنند آرشیوگیری از سورس هایشان است که اصلاً مورد تأیید نیست و فضای زیادی را آشغال می نماید و همچنین خطاپذیری آن را بالا میبردراه حل :
برای حلی این موضوع برنامه نویسان دست به طراحی سیستمهایی زدهاند که بانک اطلاعاتی از سورس های شما تهیه می نماید تا شما بتوانید در زمان کمتر و با کیفیت بهتر به تاریخچه های سورس خود دسترسی داشته باشد

سیستمهای کنترل نسخه مرکزی:
اصلیترین نیاز یک تیم همراه نسخه های واحد با یکدیگر است. اعضای تیم نسخه ی اصلی را از سرورهایی مانند Perforce, CVS, Subversion دریافت کرده و از تمام فایلها userها در کامپیوتر خود checkout می نمایند و نگهداری میکنند
سیستمهای کنترل نسخه پخشی:
برنامه نویس فقط اقدام به ذخیره سازی تاریخچه ی فایل خود نمیکند و هر گاه بخواهد کل مخزن را فراخوانی نموده و آخری تصویر از آن فایل را دریافت میکند به همین شکل اگر کاربر دیگری مشکل داشته باشد و سورس ها آسیب ببیند میتواند مجدداً خود را به تیم برساند. همچنین کاربرها میتوانند در قالب گروههای مختلف با یکدیگر کارهایی که انجام میدهند را به اشتراک بگذارند
GIT چیست :
اصلیترین تفاوت بین Git و دیگر VCSها (که شامل Subversion و هم خانواده های آن نیز میشود) دیدگاهی است که Git نسبت به دادههای خود دارد. از نظر مفهومی، اکثریت دیگر سیستمها اطلاعات را به مثابه لیستی از تغییرات بر مبنای فایل، ذخیره میکنند. این سیستمها (CVS، Subversion، Perfoce، Bazaar و غیره) به اطلاعاتی که نگهداری میکنند به شکل مجموعهای از فایلها و تغییراتی که برروی هر فایل در مرور زمان انجام گرفته است، مینگرند.
دیدگاه Git نسبت به دادههای خود به شکل تصاویر لحظهای از یک سیستم فایلی کوچک است. هر زمانی که شخص commitای انجام میدهد یا وضعیت پروژه خود را در Git ذخیره میکند، در اصل تصویری از وضعیت تمامی فایلها در لحظه موردنظر تهیه و ارجاعی به تصویر لحظهای ایجاد شده ذخیره می شود. برای آنکه این عمل به صورت بهینه انجام پذیرد، اگر در فایلی تغییری ایجاد نشده باشد، Git اقدام به ذخیره سازی مجدد فایل نمیکند – تنها پیوندی به نسخه مشابه آن فایل که قبلاً ذخیره شده است را ذخیره می کند
این شکل نگرش مهمترین اصل تمایز Git با دیگر VCSها است. این امر موجب میشود تا Git تجدیدنظری نسبت به تمامی ابعاد کنترل نسخه داشته باشد، که اکثریت دیگر سیستمها از نسلهای قبل از خود به ارث بردهاند. این موضوع باعث شده است تا Git از یک VCS ساده، به سیستم فایلی کوچکی بدل شود که در بالادست آن ابزار قدرتمند باورنکردنی بنا شده است.
اکثر عملیاتی که در Git انجام میپذیرد جهت اجرا تنها نیازمند فایلها و منابع محلی هستند – بهطور کلی نیازمند هیچگونه اطلاعاتی از کامپیوتری دیگر در شبکه نیست. اگر شما فردی هستید که به CVCSای عادت کردهاید که در آن اکثر فعالیتها دارای افزونگی رکود شبکهای داشتهاند، شاید این مزیت Git این فکر را برای شما تداعی کند که خدایان سرعت Git را با قدرتی وصف ناشدنی مورد لطف و رحمت قرار دادهاند. از آن جهت که تمامی تاریخچه پروژه برروی دیسک محلی قرار دارد، به نظر میرسد که اکثر عملیات به صورت لحظهای و بلادرنگ انجام میپذیرند.
به عنوان مثال، Git برای نمایش تاریخچه پروژه نیازی جهت مراجعه به سرور برای اخذ تاریخچه و نمایش آن ندارد – Git این عمل را با خواندن مستقیم پایگاه داده محلی انجام میدهد. این بدان معناست که شخص میتواند تاریخچه پروژه را تقریباً بلادرنگ مشاهده کند. اگر نیاز به مشاهده تغییرات بین نسخه فعلی یک فایل با نسخه یک ماه قبل از آن باشد، Git میتواند بهجای آنکه از سرور درخواست این عمل را داشته باشد و یا آنکه نسخه قبلی را از سرور خارجی فراخوانی و سپس مقایسه محلی را انجام دهد، این عمل را با نگاهی به نسخه یک ماه قبل فایل و انجام محاسبات محلی تغییرات رخ داده، انجام میدهد.
همچنین بدین معناست که در صورت آفلاین بودن و یا وصل نبودن به VPN دامنه عملکرد شخص زیاد محدود نمیشود. اگر سوار بر هواپیما یا قطار شده باشید و تصمیم به انجام کاری داشته باشید، میتوانید به راحتی commit را انجام داده و زمانی که دسترسی به شبکه پیدا کردید آپلود را انجام دهید. اگر به خانه رفته باشید و قادر به فعال سازی VPN خود نشده باشید، باز هم وقفهای در کار شما حاصل نمیشود. در اکثریت دیگر سیستمها انجام این موارد غیرممکن یا به سختی انجام میپذیرد. به عنوان مثال در Perforce، در صورتی که به شبکه متصل نباشید در واقع توانایی انجام کاری نخواهید داشت؛ در Subversion و CVS، امکان دستکاری فایلها برای شما وجود دارد، ولی برای commit تغییرات روی پایگاه داده محدودیت دارید (زیرا اتصال شما به پایگاه داده بر قرار نیست). شاید این موضوع مسئله مهمی به نظر نیاید، ولی شاید با مشاهده تفاوتهای بزرگی که میتواند به موجب آن ایجاد شود، شگفت زده شوید.
هرچیزی که بخواهد در Git ذخیره شود، ابتدا checksum آن محاسبه میشود و سپس بهوسیله همین checksum ارجاع داده میشود. چنین عملی موجب میشود که در صورت ایجاد کوچکترین تغییری در محتویات فایل یا پوشهای، Git از آن آگاهی پیدا کند. این دستورالعمل در Git در پایینترین سطح پیادهسازی شده است و تأییدی بر صحت فلسفه Git دارد. بدین دلیل است که اگر دادهای در حین انتقال از دست برود و یا فایلی مخدوش شود، Git به سرعت از آن اطلاع پیدا میکند.
مکانیزمی که Git برای تولید checksum استفاده میکند، هش SHA-1 است. این هش یک رشته 40 کاراکتری از کاراکترهای مبنای شانزده است (0 – 9 و a – f) که از روی محتویات فایل و یا ساختار پوشه موردنظر در Git محاسبه میگردد. در ادامه یک نمونه از هش SHA-1 آورده شده است:
24b9da6552252987aa493b52f8696cd6d3b00373
به علت استفاده زیاد Git از این هش، به کرات در جای جای Git مشاهدهگر این هشها خواهید بود. در واقع، Git از نام فایل برای ذخیرهسازی آن استفاده نمیکند بلکه Git از هش تولید شده از محتویات فایل مربوطه برای آدرس دهی آن در پایگاه داده خود بهره میگیرد.
هرگاه عملی در Git انجام میپذیرد، تقریباً در تمامی موارد Git دادهای به دادههای خود در پایگاه داده اضافه میکند. انجام دادن عملی در این سیستم که برگشتپذیر نباشد یا باعث حذف داده ای از سیستم شود، بسیار سخت است. مشابه اکثر VCSها، فرد میتواند تا قبل از commit هرگونه تغییراتی را انجام دهد؛ ولی به محض commit یک تصویر لحظهای در Git، امکان حذف آن بسیار سخت است، مخصوصاً اگر فرد عادتاً پایگاه داده خود را به مخزن دیگری push کند.
این قابلیت باعث میشود که استفاده از Git، به عملی فرح بخش تبدیل شود زیرا فرد خواهد توانست بدون در خطر انداختن چیزی دست به هرگونه آزمایشی بزند. برای آشنایی بیشتر با چگونگی ذخیرهسازی و بازیابی دادهها در Git که به نظر از دست رفته میباشند
توجه، توجه. اگر میخواهید پروسه یادگیری Git را بدون دردسر ادامه دهید، این بخش را به دقت مطالعه کنید. فایلها در Git میتوانند در سه وضعیت اصلی قرار داشته باشند: committed، modified و staged. committed بدین معناست که فایل موردنظر در پایگاه داده محلی ذخیره شده است. modified یعنی تغییری در فایل ایجاد شده است ولی هنوز commitای از این فایل روی پایگاه داده انجام نگرفته است. فایلی که در وضعیت staged قرار گرفته است، فایلی تغییر یافته است که نسخه فعلی آن در تصویر لحظهای بعدی جهت commit نشانهگذاری شده است.
حال میتوان سه بخش اصلی پروژه Git را معرفی کرد: پوشه Git، پوشه در حال کار (working directory) و staging area.
در Git، metadata و پایگاه داده پروژه در پوشه Git ذخیره میشوند. این قسمت مهمترین بخش Git است، در واقع هنگامی که از مخزن کامپیوتری cloneای گرفته میشود، کپی از این پوشه ایجاد میگردد.
پوشه در حال کار، checkout منفردی از نسخهای از پروژه است. فایلهای این بخش، فایلهایی میباشند که از پایگاه داده فشرده واقع در پوشه Git بیرون کشیده شده و جهت استفاده و ایجاد تغییر بر روی دیسک قرار داده شدهاند.
staging area عموماً از یک فایل ساده تشکیل شده است که محتوی اطلاعاتی است که مشخص میکند که چه چیزهایی در commit بعدی قرار میگیرند. معمولاً این فایل را index مینامند ولی عبارت staging area نیز در حال تبدیل شدن به نامی استاندارد برای چنین فایلی است.
روند کاری Git عموماً به صورت ذیل است:
1. ایجاد تغییرات روی فایلهای واقع در پوشه در حال کار.
2. stage کردن فایلها و اضافه کردن تصاویر لحظهای فایلها به staging area.
3. commit کردن، که به موجب آن وضعیت فعلی فایلها در staging area تحت یک تصویر لحظهای به صورت دائمی در پوشه Git ذخیره میگردد.
اگر نسخهای از یک فایل در پوشه git قرار داشته باشد، commit شده فرض میشود. اگر تغییری در فایل ایجاد شده باشد و به staging area اضافه شده باشد، گوییم staged شده است. و اگر در فایل از آخرین مرتبهای که checkout شده است تغییری ایجاد شده باشد ولی staged نشده باشد، گوییم modified شده است.
تنظیمات شروع به کار Git
حال که Git روی سیستم نصب شده است، نیاز به شخصیسازی بعضی از منابع Git است. انجام این تنظیمات فقط برای یک مرتبه انجام میپذیرد؛ و بعد از آن با هر بار ارتقاء بدون تغییر باقی میمانند. همچنین امکان تغییر آنها در هر زمانی که نیاز باشد به کمک خط فرمان وجود دارد.
به همراه Git ابزاری ارائه شده است با نام git config که امکان خواندن و اعمال متغیرهای تنظیماتی که تمامی ابعاد ظاهری و عملیاتی Git را کنترل میکند فراهم میسازد.
فایل /etc/gitconfig: حاوی مقادیر تمامی کاربران سیستم و مخازن آنها است. اگر به همراه git config از گزینه –system استفاده شود، خواندن و نوشتن به صورت اختصاصی از این فایل انجام میپذیرد.
فایل ~/.gitconfig: مختص کاربر مشخصی است. با استفاده از گزینه –global خواندن و نوشتن Git به صورت اختصاصی از این فایل انجام میپذیرد.
فایل config موجود در پوشه git (.git/config) یا هر مخزنی که در حال استفاده از آن میباشید: مختص یک مخزن خاص است. مقادیر هر سطح باعث لغو مقادیر سطح قبلی خود میشود. بنابراین مقادیر .git/configموجب لغو مقادیر /etc/gitconfig خواهد شد.
در سیستمهای ویندوزی، Git در پوشه $HOME (متغیر محیطی %USERPROFILE% در ویندوز) که برای اکثر کاربران با توجه به نسخه سیستم در مسیرهای C:\Documents and Settings\$USER یاC:\Users\$USER($USER در ویندوز متغیر محیطی %USERNAME%) قرار دارد، فایل .gitconfig را جستجو میکند. همچنین نسبت به مسیر ریشه MSys که همان مسیر نصب انتخاب شده در هنگام اجرای نصاب Git در ویندوز میباشد، به دنبال فایلی با نام /etc/gitconfig میگردد.شناسه کاربر
اولین عملی که بعد از نصب Git باید انجام شود، مقداردهی دو متغیر نام کاربری (user name) و آدرس پست الکترونیکی (e-mail address) است. این عمل از آن جهت اهمیت دارد که در هر commit این اطلاعات بهصورتی تغییر ناپذیر روی commit انجام شده حک میشوند.
$ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.com
مجدداً یادآوری میشود که انجام این عمل در صورت استفاده از گزینه –global فقط یک مرتبه انجام میپذیرد، زیرا Git برای هر عملی که در سیستم انجام میپذیرد از این اطلاعات استفاده میکند. حال اگر فرد نیاز به استفاده از نام و آدرس پست الکترونیکی متفاوتی برای پروژههای خاصی دارد، میتواند با اجرای همان دستورات البته بدون استفاده از گزینه –global هنگامی که در مسیر پروژه مذکور قرار دارد به مقصود خود دست یابد.
ویرایشگر کاربر
حال که شناسه تنظیم شد، میتوان ویرایشگر متن پیش فرضی را معرفی کرد تا هنگامی که نیاز به درج پیغامی در Git است فراخوانی شود. به صورت پیش فرض Git از ویرایشگر پیش فرض سیستم برای این امر استفاده می کند، که معمولاً Vi یا Vim است. اگر نظر شخص به استفاده از ویرایشگر متنی متفاوتی مانند Emacs باشد، میتوان به صورت ذیل عمل کرد:
$ git config --global core.editor emacs
ابزار Diff
ابزار مفید دیگری که شاید نیاز به تنظیم داشته باشد، ابزار diff پیش فرضی است که برای رفع مغایرت ایجاد شده در هنگام اجرای دستور merge استفاده میگردد. به عنوان مثال اگر هدف استفاده از vimdiff باشد خواهیم داشت:
$ git config --global merge.tool vimdiff
Git از ابزارهای kdiff3، tkdiff، meld، xxdiff، emerge، vimdiff، gvimdiff، ecmerge و opendiff جهت merge پشتیبانی میکند. با این وجود امکان تعریف ابزاری شخصی نیز وجود دارد؛ برای اطلاعات بیشتر جهت انجام این مورد میتوانید به فصل 7 مراجعه کنید.
بررسی تنظیمات
برای مشاهده و بررسی تنظیمات، میتوان از دستور git config –list استفاده کرد که در نتیجه آن Git تمامی تنظیمات موجود تا آن لحظه را در قالب لیستی نمایش میدهد:
$ git config --list user.name=Scott Chacon user.email=schacon@gmail.com color.status=auto color.branch=auto color.interactive=auto color.diff=auto ...
احتمال دارد در این لیست کلیدهایی بیش از یک بار مشاهده شوند، دلیل این امر آن است که Git کلید مشابهی را از فایلهای مختلفی (مانند /etc/giconfig و ~/.gitconfig) خوانده است. در اینگونه موارد، Git آخرین مقدار کلید منحصر به فردی که مشاهده میکند را جهت استفاده بهکار میگیرد.
همچنین برای مشاهده مقدار مورد استفاده یک کلید خاص توسط Git، میتوان از دستور git config {key}استفاده کرد:
$ git config user.name Scott Chacon
