Git-Note.pdf

‫جسوه‌ی ‪Git‬‬
‫تِیَ ؽذٍ تشای هثذث ‪Version Management‬‬
‫آصهایؾگاٍ هٌِذعی ًشم‌افضاس‬
‫ًؼین عاُشی (‪)[email protected]‬‬
‫ًین‌عال دّم ‪۳4-۳3‬‬
‫خالصو چیسی کو درباره‌ی ‪ Git‬بایذ بذانیذ‬
‫‪ Git‬یک ًشم‌افضاس تشای کٌتشل ًغخَ ًشم‌افضاس اعت‪ .‬ؽوا هی‌تْاًیذ تغییشاتی کَ اػوال هی‌کٌیذ ًغخَ‌تٌذی‬
‫کٌیذ‪ً .،‬گَ‌داسی‪ ،‬سدگیشی‪ ،‬دشکت دس تیي ًغخ اص جولَ لاتلیت‌ُایی اعت کَ ًشم‌افضاس ‪ Git‬تا اجشای یک یا‬
‫چٌذ دعتْس عادٍ تشای ؽوا اًجام هی‌دُذ‪.‬‬
‫چٌذ عٌاسیْ عادٍ کَ اص ًشم‌افضاس ‪ Git‬دس یک پشّژٍ اعتفادٍ خْاُیذ ًوْد ‪:‬‬
‫‪ .1‬لاتلیت ‪ X‬هذتی لثل تَ ًشم‌افضاس اضافَ ؽذٍ تْد‪ .‬اکٌْى لقذ داسیذ تشسعی کٌیذ چَ تغییشاتی آى‬
‫صهاى تشای اضافَ کشدى لاتلیت ‪ X‬تَ ًشم‌افضاس فْست پزیشفتَ تْد‪.‬‬
‫(ُشتاس کَ تغییشی دس پشّژٍ سا ثثت ّ ًغخَ‌تٌذی هی‌کٌیذ تَ آى ‪ Commit‬هی‌گْیٌذ کَ تا دعتْسی‬
‫تذت ػٌْاى ُویي ًام اًجام هی‌ؽْد‪).‬‬
‫‪ .2‬هذیش فٌی دس ؽشکت تَ ؽوا هی‌گْیذ ‪ 3‬ایشاد فٌی سا سفغ ًواییذ‪ .‬ؽوا اص یک عشف تایذ پظ اص سفغ‬
‫ُش ایشاد فٌی تغییشات سا ثثت ّ اػوال ًواییذ‪ .‬اص عشف دیگش ُن ًثایذ ایي تغییشات سا هغتمین‬
‫سّی هخضى افلی کُذ اػوال کٌیذ ّ تِتش اعت پظ اص دقْل اعویٌاى اص کاکشد کاهل ًشم‌افضاس پظ‬
‫اص تغییشاتی داسیذ ایي کاس سا اًجام دُیذ‪ .‬دّ ساٍ پیؼ سّ داسیذ ‪:‬‬
‫‪ .a‬ایي هذیشیت‌ُا (تَ افغالح ‪ backup ّ copy-paste‬گیشی‌ُا) سا خْدتاى دعتی اًجام‬
‫دُیذ‪.‬‬
‫‪ .b‬ایي اهْس سا یک ًشم‌افضاس کٌتشل ًغخَ (‪ )Git‬تشای ؽوا اًجام دُذ‪.‬‬
‫(دس ‪ Git‬تایذ یک اًؾؼاب اص ؽاخَ‌ی افلی تَ ًام ‪ master‬تگیشیذ تا یک ًام دلخْاد هثال‬
‫‪ُ .bugFix‬شتاس کَ یکی اص ایشادات سا دسعت کشدیذ سّی آى ؽاخَ ‪ Commit‬کٌیذ‪ ،‬دس ًِایت کَ‬
‫ُوَ‌چیض تَ خْتی ّ تا اعویٌاى سّی آى ؽاخَ اًجام ّ توام ؽذ‪ ،‬ؽاخَ‌ی ‪ bugFix‬سا سّی ؽاخَ‌ی‬
‫‪ master‬ادغام کٌیذ‪) .‬‬
‫حالت‌ىای مختلف برای یک فایل در ‪Git‬‬
‫”‪ “Tracked‬سا «صیشرسٍ‌تیي ‪ Git‬تْدى» تؼشیف هیکٌین ّ ”‪ “Staged‬سا «اًذیظ‌گزاسی تغییشات عْسی‬
‫کَ آهادٍ تشای ایجاد ّ ثثت یک ؽئ ‪ Commit‬تاؽٌذ» تؼشیف هیکٌین‪ .‬هٌظْس اص اًذیظ‌گزاسی ؽذى‬
‫تغییشات‪ ،‬یؼٌی ایٌکَ یک ‪ hash‬هٌذقشتَ‌فشد اص سّی هذتْیات ُش فایل تِیَ ّ تَ ػٌْاى ًغخَ‌ی آى‬
‫تکفایل دسًظش گشفتَ هی‌ؽْد‪.‬‬
‫‪ .1‬یک فایل ّلتی تَ ّجْد هی‌آیذ ‪ Untracked‬اعت‪ ًَ( .‬صیشًظش ‪ Git‬تْدٍ ًَ ُن اًذیظ‌گزاسی ؽذٍ تشای‬
‫‪ Commit‬اعت)‬
‫‪ .2‬تؼذ کَ فایل سا ‪ Add‬هی‌کٌیذ‪ Git .‬فایل سا اص آى تَ تؼذ صیشًظش خْاُذ گشفت (‪ )Tracked‬ایي دعتْس‬
‫ُوچٌیي فایل سا اًذیظ‌گزاسی هی‌کٌذ ّ تشای ‪ Commit‬آهادٍ (‪ )Staged‬هی‌کٌذ‪( .‬یؼٌی تا ‪Commit‬‬
‫کشدى یک ‪ Commit-Object‬ایجاد ّ تَ ػٌْاى ًغخَ‌ی کل پشّژٍ ثثت هی‌ؽْد)‬
‫‪ .3‬تؼذ اص ‪ Commit‬اگش فایل سا هجذدا تغییش دُیذ‪ .‬فایل ُوچٌاى ‪ Tracked‬هی‌هاًذ ّلی دیگش ‪Staged‬‬
‫ًیغت‪ .‬یؼٌی اًذیظ‌گزاسی ًؾذٍ ّ آهادٍ تشای ‪ً Commit‬یغت هگش ایٌکَ آى سا هجذدا تَ کوک دعتْس‬
‫‪ Add‬دس دعتَ‌ی ‪ Staged‬لشاس دُیذ ّ تؼذ ‪ Commit‬کٌیذ‪.‬‬
‫(ّلتی ‪ Stage‬هی‌کٌیذ یک فایل سا؛ دس ّالغ یک ‪ hash‬اص سّی هذتْیات فایل تِیَ کشدٍ ّ دس اًذیظ‌ُای‬
‫هخقْؿ ‪ Git‬تَ ػٌْاى ًغخَ‌ی آى فایل لشاس هی‌دُیذ‪ّ .‬لتی ُن ‪ Commit‬هی‌کٌیذ کل اًذیظ‌ُا‬
‫تغتَ‌تٌذی ّ دس یک ؽئ ‪ Commit‬تا ؽٌاعَ‌ی هٌذقشتَ‌فشد لشاس هی‌گیشًذ‪).‬‬
‫‪ .4‬فایلی کَ ‪ Track‬ؽذٍ اعت فمظ تا پاک ؽذى اص صیش ًظش ‪ Git‬خاسج (‪ )Untracked‬هی‌ؽْد‪.‬‬
‫یک توصیف کلی تکنیکی از ‪Git‬‬
‫پشّژٍ‌ی ؽوا دس اتتذا ُیچ ‪ً Commit‬ذاسد‪.‬‬
‫اّلیي ‪ Commit‬سا کَ اًجام دُیذ‪ ،‬اؽاسٍ‌گش ‪ HEAD ّ master‬سا سّی آى ‪ Commit‬هی‌گزاسد‪ُ .‬ش‬
‫‪ Commit‬یک کذ هخقْؿ تَ ػٌْاى ؽٌاعَ تذت ػٌْاى ‪ Commit-id‬داسد‪ master .‬ؽاخَ‌ی افلی‬
‫پشّژٍ اعت ّ تَ عْس پیؼ‌فشك دس ُوَ‌ی پشّژٍ‌ُا ّجْد داسد‪ُ HEAD .‬ن اؽاسٍ‌گش هْلؼیت فؼلی پشّژٍ ّ‬
‫دایشکتْسی افلی سا ًؾاى هی‌دُذ‪( .‬پشّژٍ‌ی ؽوا ؽاهل توام فایل‌ُا ّ دایشکتْسی‌ُای دسّى «دایشکتْسی‬
‫افلی» اعت ّ عیغتن ًغخَ‌تٌذی ُن ًظاسٍ‌گش ُویي هذیظ اعت‪).‬‬
‫دس ؽکل تاال هی‌تیٌیذ کَ تؼذ اص اًجام چِاستاس ‪ Commit‬سّی ؽاخَ‌ی ‪ master‬دس چَ دالتی لشاس داسین‪.‬‬
‫اّلیي ‪ Commit‬کَ اًجام ؽذ «‪ »b325c‬تْد‪ ،‬تؼذ ‪ُ ّ c10b9‬ویي‌عْس تا ‪ُ .ed489‬ش ‪ Commit‬جذیذ‬
‫فشصًذ ‪ Commit‬لثلی هی‌ؽْد‪ُ ّ .‬واًغْس کَ دس ؽکل هؾاُذٍ هی‌کٌیذ ُش فشصًذ تَ پذسػ اؽاسٍ هی‌کٌذ‪.‬‬
‫اگش سّی اًؾؼاب افلی (‪ )master‬تاؽین ّ یکثاس دیگش‬
‫‪ Commit‬اًجام دُین‪ ،‬سًّذ اؽاسٍ‌ؽذٍ اداهَ پیذا هی‌کٌذ (تَ ؽکل تْجَ کٌیذ)‪ .‬یؼٌی یک ؽئ ‪Commit‬‬
‫جذیذ ایجاد هی‌ؽْد ّ ‪ HEAD ّ master‬سّی آى لشاس هی‌گیشًذ‪.‬‬
‫ؽکل تاال یک تغییش دالت سا ًؾاى هی‌دُذ کَ ‪:‬‬
‫‪ ‬پشّژٍ سّی ‪ Commit‬ؽواسٍ‌ی ‪ a47c3‬لشاس داؽتَ اعت‪ ،‬یک اًؾؼاب تا ًام ‪ maint‬ایجاد ؽذٍ‬
‫اعت (جؼثَ‌ی ًاسًجی سًگ کوشًگ کَ تاالی آى لشاس داسد) ّ سّی آى ُن عْییچ ؽذٍ تْد‬
‫(جؼثَ‌ی تٌفؼ کوشًگ تا ًام ‪.)HEAD‬‬
‫‪ ‬یک تغییش ایجاد ؽذٍ اعت ّ عپظ ‪ Commit‬ؽذٍ اعت‪( .‬دلت کٌیذ کَ چْى سّی اًؾؼاب‬
‫‪ maint‬تْدین تا ایجاد تغییش اص هغیش ‪ master‬خاسج ؽذین ّ سّی یک اًؾؼاب جذیذ سفتَ این‪).‬‬
‫خشّج اص ‪ ّ master‬یک اًؾؼاب‌ی جذیذ صدى کاستشدُای گًْاگًْی هی‌تْاًذ داؽتَ تاؽذ‪ .‬هثال ًوی‌خْاُیذ‬
‫اًؾؼاب‌ی افلی سا تَ «یک هیذاى آصهایؼ ّ خغا» تذل کٌیذ ّ لقذ داسیذ تغییشات سا پظ اص دقْل‬
‫اعویٌاى کافی تَ اًؾؼاب ‪ master‬هٌتمل کٌیذ‪.‬‬
‫تؼذ اص ایجاد ّ عْییچ سّی یک اًؾؼاب‪ُcommit ،‬ایی کَ اًجام هی‌دُیذ سّی ُواى اًؾؼاب خْاٌُذ‬
‫تْد‪ .‬پظ اص دقْل اعویٌاى اص ایٌکَ کاسُای هشتْط تَ اًؾؼاب کاهل ّ ًِایی ؽذٍ‌اًذ‪ ،‬تغییشات سا تایذ تا‬
‫اًؾؼاب افلی ‪ً merge‬وایین‪.‬‬
‫دستورات ساده ‪Git‬‬
‫‪1) Git init‬‬
‫ًغخَ‌تٌذی تا ایي دعتْس آغاص هی‌ؽْد‪ .‬یک هخضى هذلی تشای ًغخَ‌تٌذی دس پْؽَ‌ی فؼلی ایجاد هی‌ؽْد‪.‬‬
‫ایي سا دس اتتذا تایذ اًجام دُیذ (هگش ایٌکَ هخضى سا هغتمین آًالیي اص جایی لقذ داسیذ تگیشیذ ّ‬
‫ًوی‌خْاُیذ هخضى جذیذ ّ خالی ایجاد کٌیذ‪).‬‬
‫ایي کاس فْلذس ‪ .git‬سا تَ فْست ًاهشئی دس فْلذس جاسی ؽوا هی‌عاصد‪ .‬ؽوا تا ایي فْلذس ًاهشئی کاسی‬
‫ًخْاُیذ داؽت (اگَ لشاس تْد کاس داؽتَ تاؽیذ کَ ًاهشئی ًثْد !) ایي فْلذس اعالػات ًغخ الصم تشای‬
‫کاسکشد ‪ Git‬سا ًگَ‌داسی هی‌کٌذ‪.‬‬
‫”>>‪2) Git clone “<<git-online-repository-address‬‬
‫دسیافت کل ًغخَ‌ُا اص یک هخضى آًالیي ّ کپی آى دس پْؽَ‌ی فؼلی‪.‬‬
‫ًکتَ‪ :‬دلت کٌیذ کَ ها ُویؾَ هخضى آًالیي سا سّی عیغتن خْد کپی هی‌کٌین‪ .‬کاس سّی هخضى سا تَ فْست‬
‫هذلی دس عیغتن‌خْدهاى اًجام هی‌دُین (‪ ّ )local‬عپظ دس پایاى کاس سا ‪ push‬هی‌کٌین سّی هخضى‬
‫آًالیي‪( .‬یک اًؾؼاب تا تاسیخچَ‌اػ ‪ push‬هی‌ؽْد سّی هخضى آًالیي)‬
‫(ًکتَ‌ی تکیٌیکی؛ ػول ‪ clone‬کل یک اًؾؼاب (پیؼ‌فشك ‪ )master‬تا توام تاسیخچَ‌ی ‪ُCommit‬ای آى‬
‫سا تَ سّی دعتگاٍ کپی هی‌کٌذ‪ .‬دیگش اًؾؼاب‌ُای فشػی هخضى آًالیي سّی دعتگاٍ ها کپی ًوی‌ؽْد هگش‬
‫ایٌکَ اص پاساهتش‌ُای هخقْؿ ایي‌کاس اعتفادٍ کٌیذ‪).‬‬
‫]‪3) Git status [-s‬‬
‫ًوایؼ ّضؼیت فؼلی فایل‌ُای جاسی ّ همایغَ‌ی آًِا تا ‪ HEAD‬هخضى‪.‬‬
‫ًؾاى هی‌دُذ کَ آیا فایل‌ُا تغییش پیذا کشدٍ‌اًذ (‪ )Modified‬؟ دس فْستی کَ تغییش کشدٍ‌اًذ آیا تغییشات‬
‫ثثت ّ اًذیظ‌گزاسی ؽذٍ‌اًذ (‪ )Staged‬؟ ّ آیا ایي تغییشات اًذیظ‌گزاسی ؽذٍ ثثت ّ ًغخَ‌تٌذی‬
‫(‪ )Commit‬ؽذٍ‌اًذ ؟‬
‫‪ ‬پاساهتش ‪ّ -s‬ضؼیت سا خیلی خالفَ‌تش ًؾاى هی‌دُذ‪.‬‬
‫ًکتَ‪ :‬ؽایذ ػاللَ‌هٌذ تاؽیذ تذاًیذ فایل‌ُا چَ تغییشی کشدٍ‌اًذ ؟ پظ دعتْس ‪ Git diff‬سا اهتذاى کٌیذ‪.‬‬
‫‪4) Git add -A‬‬
‫کل فایل‌ُای ًشم‌افضاس سا دًثال هی‌کٌذ (‪ ّ )Track‬آًِایی کَ تغییش پیذا کشدٍ‌اًذ یا جذیذ عاختَ‌ؽذٍ اًذ‬
‫اًذیظ‌گزاسی (‪ )Staged‬هی‌کٌذ‪.‬‬
‫”>>‪5) Git commit –a –m “<<short-description-of-commit‬‬
‫تغییشات اًذیظ‌گزاسی ؽذٍ سّی ُوَ‌ی فایل‌ُا سا دس یک ؽئ ‪ Commit‬لشاس هی‌دُذ ّ ًغخَ‌تٌذی‬
‫هی‌کٌذ‪ُ .‬ش ًغخَ الضاها تایذ یک ؽشح کْتاٍ ُن داؽتَ تاؽذ‪( .‬اگش تکٌیکی تخْاُین تذث کٌین‪ ،‬یک‬
‫‪ commit-id‬ایجاد هی‌کٌذ ّ ‪ HEAD‬سا ُن سّی آى هی‌تشد)‬
‫ًکتَ‪ :‬اگش فمظ یک تغییش هختقشی دادیذ ّ ًوی‌خْاُیذ جذاگاًَ ثثت ؽْد اص پاساهتش ‪ --amend‬اعتفادٍ‬
‫کٌیذ (دس ػول ‪ commit-id‬لثلی پاک هی‌ؽْد ّ جذیذ جای آى هی‌ًؾیٌذ)‪.‬‬
‫الثتَ اگش تخْاُیذ تکٌیکی تگْییذ چیضی پاک ًوی‌ؽْد‪ .‬فمظ پذس ‪ Commit‬جذیذ ‪ Commit‬جاسی‬
‫ًوی‌ؽْد (دس دالت ػادی صًجیشٍ‌ّاس فشصًذ ُن هی‌ؽذًذ) تلکَ ‪ Commit‬جاسی سا الیك پذسی ًذاًغتَ ّ تَ‬
‫ُوَ پذسِپذسَػ سا جای پذسػ هؼشفی هی‌کٌذ !‬
‫ؽکل ‪ .1‬اّل سّی ‪ ed489‬تْدین‪ .‬یک ‪ Commit‬تا پاساهتش ‪ --amend‬اًجام دادین‪.‬‬
‫‪6) Git log‬‬
‫لیغتی اص توام ‪ُCommit‬ای اًؾؼاتی کَ االى سّی آى ُغتین تَ ُوشاٍ ‪ُ id‬ایؾاى ًؾاى هی‌دُذ‪.‬‬
‫ًکتَ‪ :‬تشای گشفتي یک لیغت خالفَ‌تش اص دعتْس ‪ Git shortlog‬اعتفادٍ کٌیذ‪.‬‬
‫ًکتَ‪ :‬یکثاس ُویي دعتْس سا تَ پاساهتش‌ُای ‪ --decorate --all --graph‬اهتذاى کٌیذ‪ .‬پؾیواى‬
‫ًوی‌ؽْیذ ! (کل اًؾؼاب‌ُا ّ ‪ُCommit‬ای هشتْط تَ آًِا سا سّی گشاف ًؾاى هی‌دُذ)‬
‫ًکتَ‪ :‬یکثاس ُن دعتْس ‪ git reflog‬سا اهتذاى کٌیذ کَ تغیاس جالة اعت‪( .‬لیغت توام تغییش جایگاٍ‌ُای‬
‫‪ HEAD‬سا تا تْضیخ ّ ‪ CommitId‬هشتْعَ ًؾاى هی‌دُذ)‬
‫‪7) Git branch‬‬
‫توام اًؾؼاب‌ُا (‪ )Branch‬سا لیغت هی‌کٌذ‪.‬‬
‫”>>‪8) Git branch “<<branch-name‬‬
‫یک اًؾؼاب سّی ّضؼیت فؼلی هی‌عاصد‪ .‬ایي اًؾؼاب یک ‪ Pointer‬اعت کَ سّی ‪commitObject‬‬
‫هْجْد لشاس داسد‪ .‬اگش سّی ایي اًؾؼاب عْییچ کٌیذ (تا ‪ checkout‬ایي کاس اًجام هی‌ؽْد) ّ تؼذ یک‬
‫‪ Commit‬اًجام دُیذ‪ ،‬آى‌گاٍ ‪ Commit‬اًجام ؽذٍ دیگش اص ؽاخَ‌ی افلی جذا هی‌ؽْد‪.‬‬
‫تْجَ‪ :‬ایي دعتْس فمظ اًؾؼاب سا هی‌عاصد ّلی سّی آى عْییچ ًوی‌کٌذ‪ .‬عْییچ کشدى سا جذاگاًَ دس‬
‫فْست ًیاص تایذ اًجام دُیذ (تا ‪.)checkout‬‬
‫”>>‪9) Git checkout “<<branch-name/commit-id‬‬
‫ایي دعتْس ‪ً( HEAD‬غخَ‌ی جاسی) سا تَ اًؾؼاب‌ی تؼییي ؽذٍ هی‌تشد‪ً ّ( .‬غخَ‌ی فایل‌ُا ُواى‬
‫ًغخَ‌ای هی‌ؽًْذ کَ ‪ HEAD‬سّی آى لشاس داسد)‬
‫ؽکل ‪ّ .2‬لتی اص اًؾؼاب افلی (‪ )master‬تَ اًؾؼاب (‪ checkout )maint‬کشدین‪،‬‬
‫اؽاسٍ‌گش ‪ HEAD‬سّی آى هی‌سّد‪.‬‬
‫ًکتَ‪ :‬اًؾؼاب سا اگش اص لثل ًغاختَ‌ایذ پاساهتش ‪ –b‬سا تضًیذ تا آى سا ایجاد تکٌذ تؼذ سّی آى عْییچ کٌذ‪.‬‬
‫ًکتَ هِن‪ :‬اگش دس یکی اص فایل‌ُا تغییش ایجاد کشدٍ‌ایذ ّ ٌُْص ‪ً commit‬کشدٍ‌ایذ؛ ّلتی تخْاُیذ‬
‫‪ checkout‬اًجام دُیذ؛ (دالت الف) اگش «ًغخَ‌ی ‪ Commit‬ؽذٍ اص فایل‌ُا دس اًؾؼاب همقذ» فشلی‬
‫تا «ًغخَ‌ی ‪ Commit‬ؽذٍ‌ی اًؾؼاب فؼلی‌تاى ًذاؽتَ تاؽذ» پظ تَ فایل دعت ًوی‌صد ّ تغییشات‬
‫ُن‌چٌاى دس جای خْد تالی هی‌هاًٌذ‪( .‬دالت ب) تیي ًغخَ‌ُای یاد ؽذٍ تفاّت ّجْد داسد پظ دعتْس‬
‫‪ checkout‬ایي هؼٌی سا هی‌دُذ کَ تایذ فایل هشتْعَ دس آى اًؾؼاب دس دایشکتْسی افلی کپی ؽًْذ‪ّ ،‬لی‬
‫‪ Git‬تشای ادتیاط ایي کاس سا ًوی‌کٌذ چْى ایي کاس تاػث هی‌ؽْد تغییشاتی کَ سّی آى فایل‌ُا اًجام دادٍ‌ایذ‬
‫اص تیي تشّد‪ .‬ؽوا دس ایي فْست هی‌تْاًیذ تا ‪ -f‬هجثْس کٌیذ ‪ git‬سا کَ تغییشات سا تی‌اُویت تلمی کٌذ ّ‬
‫جایگضیٌی سا دس ُشفْست اًجام دُذ‪ .‬یا ساٍ دیگش سا تشّیذ کَ اص تیي تشدى تغییشاتی اعت کَ دادٍ‌ایذ تا‬
‫دعتْس ‪.git reset HEAD --hard‬‬
‫اگش تَ جای ًام اًؾؼاب کذ ‪ّ Commit-Id‬اسد کٌیذ‪ HEAD ،‬سّی ‪ Commit-Id‬تؼییي ؽذٍ هی‌سّد‬
‫(ًَ اًؾؼاب !)‪ .‬تَ جای گشفتي ‪ Commit-Id‬اص یک سّػ دیگش ُن هی‌تْاًیذ اعتفادٍ ًواییذ؛ ُواًغْس کَ‬
‫گفتین ُش ‪ Commit‬جذیذ کَ اجشا هی‌کٌین ّ ایجاد هی‌ؽْد دس ّالغ فشصًذ ‪ Commit‬لثلی هی‌ؽْد‪.‬‬
‫~‪ HEAD‬تَ هؼٌی پذس جای فؼلی اعت یؼٌی ‪ Commit‬لثلی‪ master~3 ،‬یؼٌی عَ ‪ Commit‬ػمة‌تش‬
‫اص جایی کَ ‪ master‬اکٌْى اعت ‪:‬‬
‫ؽکل ‪ .3‬اؽاسٍ‌گش ّ فایل‌ُای دایشکتْسی افلی سا تَ ‪ Commit 3‬لثل تشگشداًذین‬
‫پظ تذاًیذ ّ آگاٍ تاؽیذ ‪ُ BranchName/HEAD/Commit-Id‬وگی اؽاسٍ‌گش تَ ؽئ‌ُای ‪Commit‬‬
‫ُغتٌذ ّ تشای اسجاع دس ُشدعتْسی هی‌تْاى اص ایٌِا جای یک‌دیگش اعتفادٍ کشد‪.‬‬
‫دال کَ اؽاسٍ‌گش تَ عَ ‪ Commit‬لثل تشگؾتَ اعت اگش فایل‌ُا سا تغییش دُین ّ ‪ Commit‬کٌین چَ‬
‫هی‌ؽْد ؟‬
‫ؽکل ‪ Checkout .4‬تَ لثل ّ تؼذ ‪ Commit‬اًؾؼاب ایجاد هی‌کٌذ‪( .‬دلت کشدیذ کَ ‪ٌُْ master‬ص جای خْد‬
‫تالی هاًذٍ اعت ّ فمظ ‪ HEAD‬جاتَ‌جا ؽذٍ اعت ؟ اگش هی‌خْاعتیذ ‪ُ master‬ن جاتَ‌جا ؽْد تایذ اص دعتْس‬
‫‪ reset‬اعتفادٍ هی‌کشدیذ) چٌیي اًؾؼاتی ًام ًذاسد ّ تایذ ‪ git branch‬تضًیذ تا ًام تشایؼ ایجاد کٌیذ‪.‬‬
‫]‪Git reset “<<commit-id>>” --soft[/hard‬‬
‫)‪10‬‬
‫دعتْس تغیاس تذسد تخْس ! ُن ‪ُ ّ HEAD‬ن ‪ Pointer‬اًؾؼاب سا جا‌تَ‌جا هی‌کٌذ تَ ػمة‪ ،‬دس ّالغ تَ‬
‫ُواى ؽئ ‪ Commit‬کَ آدسعؼ سا هی‌دُیذ‪( .‬اگش یادتاى تاؽذ ‪ checkout‬فمظ ‪ HEAD‬سا جا‌تَ‌جا‬
‫هی‌کشد ًَ ‪ Pointer‬اًؾؼاب سا‪).‬‬
‫اگش اص ‪ --soft‬اعتفادٍ کٌیذ فمظ اؽاسٍ‌گش اًؾؼاب سّی ‪ Commit‬هْسد ًظش هی‌سّد ّلی فایل‌ُا‬
‫(‪ ّ )WorkingDir‬اًذیظ‌ُا (‪ )Index‬تغییشی ًوی‌کٌٌذ‪ Pointer( .‬اًؾؼاب جاتَ‌جا هی‌ؽْد ّ ‪HEAD‬‬
‫جا‌تَ‌جا ًوی‌ؽْد)‬
‫اگش اص ‪ --hard‬اعتفادٍ کٌین ًَ تٌِا اؽاسٍ‌گش سّی هی‌سّد تلکَ دایشکتْسی افلی ّ اًذیظ‌ُا ُن هغاتك تا‬
‫اؽاسٍ‌گش تغییش هی‌کٌٌذ ّ ‪ُ HEAD‬ن ػْك هی‌کٌذ‪( .‬گْیی ُواى ‪ --soft‬سا صدٍ تاؽیذ ّ تؼذ ‪checkout‬‬
‫‪ُ –f‬ن تضًیذ)‬
‫ؽکل ‪ .5‬تشخالف ‪ reset ،checkout‬خْد اًؾؼاب سا ُن جاتَ‌جا هی‌کٌذ‪.‬‬
‫ظشیف‌تش اص دعتْس ‪ reset‬دعتْس ‪ revert‬هی‌تاؽذ کَ تَ جای ایٌکَ توام فایل‌ُای فؼلی سا دّس تشیضد ّ‬
‫فایل‌ُای لثلی سا جایگضیي کٌذ‪ ،‬تالػ هی‌کٌذ صًجیشٍ‌ی تغییشات (اص هکاى فؼلی تَ هکاى همقذ) سا ًگاٍ‬
‫کٌذ ّ آى‌ُا سا داًَ‌داًَ ‪ undo‬کٌذ‪.‬‬
‫! ‪Git merge “<<branch-name-X>>” with me‬‬
‫)‪11‬‬
‫ایي دعتْس «اًؾؼاب ‪ »X‬سا سّی «اًؾؼاب فؼلی» سیختَ ّ تشکیة هی‌کٌذ‪ .‬دلت کٌیذ کَ ایي دعتْس دس‬
‫فْستی کَ تا اختالف (‪ )Conflict‬هْاجَ ًؾْد‪ ،‬تَ عْس اتْهاتیک ‪ُ commit‬ن سّی اًؾؼاب فؼلی اًجام‬
‫هی‌دُذ‪( .‬هگش اص پاساهتش ‪ --no-commit‬اعتفادٍ کٌیذ)‬
‫ًکتَ ‪ merge :1‬اگش تا ‪ Conflict‬تشخْسد کٌذ‪ .‬یؼٌی یک فایل دس دّ ًغخَ هتفاّت تاؽٌذ‪ ّ ،‬آى‬
‫ُن تفاّتی کَ لاتل دل اتْهاتیک ًثاؽذ‪ّ( .‬لتی تفاّت عْسی‌عت کَ هثال یک فایل تَ آى فشفا‬
‫چیضی اضافَ یا کن ؽذٍ اعت تشادتی ‪ merge‬هی‌ؽْد ّلی دس غیش ایي فْست اختالف تایذ دل‬
‫ؽْد‪ّ ).‬لتی اختالف تَ ّجْد هی‌آیذ فایل‌ُایی کَ پظ اص ‪ merge‬تَ تماتل خْسدٍ‌اًذ دس دایشکتْسی‬
‫افلی دیگش ُواى فایل هؼوْلی ًیغتٌذ‪ ،‬تلکَ خْاُیذ دیذ فایل داّی یک عشی ػالئن اعت کَ‬
‫تفاّت‌ُا سا ًؾاى هی‌دُذ‪.‬‬
‫اکٌْى هی‌تْاًیذ فایل‌ُایی کَ اختالف دس آًِا تَ ّجْد آهذٍ اعت سا تَ عْس دعتی تاص ّ تشکیة سا‬
‫خْدتاى اًجام دُیذ ّ ػالئن سا پاک کٌیذ یا اص یک اتضاس کوک تگیشیذ‪( .‬تا کوک دعتْس ‪git‬‬
‫‪ )mergetool‬دلت داؽتَ تاؽیذ کَ پظ اص دل اختالف تایذ خْدتاى ‪ commit‬سا اًجام دُیذ‪.‬‬
‫اگش هی‌خْاُیذ کال تی‌خیال ایي ‪ merge‬ؽْیذ ّ فایل‌ُا ّ ّضؼیت سا تَ دالت لثل ‪merge‬‬
‫تشگشداًیذ دعتْس ‪ git merge --abort‬سا اجشا کٌیذ‪.‬‬
‫تِتشیي اتضاسی کَ تشای ادغام اکٌْى ّجْد داسد ‪ meld‬اعت‪ .‬کَ تؼذ اص ًقة تایذ آى سا تَ ‪git‬‬
‫تؾٌاعاًیذ‪ .‬فایل ‪ <git install dir>/etc/gitconfig‬سا تاص کٌیذ ّ ایي خغْط سا تَ اًتِای آى‬
‫اضافَ کٌیذ ‪:‬‬
‫]‪[merge‬‬
‫‪tool = meld‬‬
‫]"‪[mergetool "meld‬‬
‫‪cmd = \"C:\\\\Program Files (x86)\\\\Meld\\\\Meld\" $BASE $LOCAL‬‬
‫‪$REMOTE -o $MERGED‬‬
‫دلت کٌیذ کَ پاساهتش‌ُا سا دسعت تَ تشًاهَ سد کٌیذ‪.‬‬
‫ًکتَ ‪ :2‬دس ‪ Meld‬عَ پٌجشٍ خْاُیذ داؽت کَ اص چپ تَ ساعت اگش پاساهتشُا سا تَ فْست تاال‬
‫سد کشدٍ تاؽیذ‪ Remote ،Local ،Base ،‬خْاٌُذ تْد‪.‬‬
‫ًکتَ ‪ :3‬دس ‪ Meld‬خشّجی ُویؾَ پٌجشٍ‌ی ّعغی خْاُذ تْد یؼٌی تشکیة سا دس آى اًجام دُیذ ّ‬
‫رخیشٍ کٌیذ‪ّ .‬گشًَ ػوال ‪ Merge‬اًجام ًذادٍ‌ایذ‪.‬‬
‫تشای ایٌکَ ‪ git‬فایل‌ُا سا تَ ‪ mergetool‬سد کٌذ‪ ،‬یک‌عشی فایل اضافی تا پغًْذ‌ُای‬
‫‪ base/remote/local‬هی‌عاصد کَ ایي‌ُا تا ‪ git clean –f‬پاک هی‌ؽًْذ‪( .‬لثل اص پاک کشدى‬
‫تِتش اعت ‪ git clean -n‬تضًیذ تا تثیٌیذ کذام فایل‌ُا لشاس اعت پاک ؽًْذ)‬
‫ؽکل صیش تغیاس هِن اعت ‪:‬‬
‫ؽکل ‪ .6‬تَ هفِْم ‪ 3-way-merge‬دلت کٌیذ‪( .‬پایَ یا ‪ُ Base‬واى ‪ O‬دس ؽکل اعت‪ .‬یک ؽاخَ تَ ‪OA‬‬
‫(ؽاخَ‌ای کَ سّی آى ُغتین هی‌ؽْد ‪ ّ )Local‬یک ؽاخَ تَ ‪ OB‬سفتَ اعت (ؽا‌خَ‌ای کَ هی‌خْاُین آى سا سّی‬
‫ؽاخَ‌ی جاسی تشیضین هی‌ؽْد ‪)Remote‬؛ پظ هی‌ؽْد کواتیؼ تؾخیـ داد ُش ؽاخَ چَ چیضی تَ پایَ اضافَ‬
‫کشدٍ اعت تا آًِا سا تشکیة ًوْد‪).‬‬
‫اگش تماتلی پیذا ًؾْد‪ ،‬پظ اص ‪ merge‬کشدى خْدتَ‌خْد ًتیجَ ‪ Commit‬هی‌ؽْد‪ .‬دسغیشایي فْست دافل‬
‫فایل‌ُایی خْاٌُذ تْد داّی ػالهت‌ُایی کَ تَ ‪ُConflict‬ا اؽاسٍ هی‌کٌٌذ‪ .‬پظ اص سفغ دعتی‪/‬اتْهاتیک‬
‫‪ُConflict‬ا تایذ ‪ Commit‬سا ُن دعتی اًجام دُیذ‪.‬‬
‫ًکتَ ‪ :4‬چشا تؼضی‌ُا دس عشکالط ّلتی ‪ Merge‬هی‌صدًذ تا یک ؽاخَ‪ Git ،‬تَ اؽتثاٍ فکش هی‌کشد ّ پیام‬
‫هی‌داد کَ ”?‪ “Is already up-to-date‬؟‬
‫پاعخ سا تایذ «دس کاسی کَ لثال تَ اؽتثاٍ اًجام دادٍ‌ایذ» جغتجْ کٌیذ‪ .‬ؽوا دس لثل یکثاس ‪ merge‬اًجام‬
‫دادٍ تْدیذ ّلی ‪ُConflict‬ا سا تَ دسعتی سفغ ًکشدیذ (هي ّ ؽوا فکش کشدین خشّجی دس ‪ُ Meld‬واى‬
‫پٌجشٍ‌ی داّی ‪ُ Local‬غت ّلی خشّجی ُوْاسٍ پٌجشٍ‌ی ّعغی خْاُذ تْد‪ ،‬پظ ػوال تا تغییش دس‬
‫پٌجشٍ‌ی چپ ُیچ ‪merge‬ای اًجام ًذادیذ)‪ .‬پظ اص ایي ػول ‪ Git‬تَ ؽوا اػتواد کشد کَ ‪ Merge‬سا‬
‫دسعت اًجام دادٍ‌ایذ ّ دیگش ‪ base‬تشای ‪ merge‬سا ػْك کشد‪ .‬اکٌْى کَ ؽوا دّتاسٍ هی‌خْاُیذ ‪merge‬‬
‫اًجام دُیذ ّ اؽتثاٍ لثل سا جثشاى کٌیذ ‪ Git‬هی‌تیٌذ کَ فایل‌ُای اًؾؼاب ًغثت تَ ‪merge-base‬‬
‫تغییشی ًکشدٍ‌اًذ تشای ُویي اػالم هی‌کٌذ کَ ًیاصی تَ ‪ً merge‬یغت !‬
‫ؽکل ‪ّ .7‬لتی ‪ merge‬اًجام ؽذ دیگش ‪ merge-base‬اًؾؼاب ‪ maser ّ topic‬تَ جای ‪ C2‬هی‌سّد سّی ‪.C4‬‬
‫آعاى‌تشیي کاس تشای ایي‌کَ تتْاًیذ دّتاسٍ ‪ merge‬کٌیذ ایي اعت کَ تَ هشدلَ‌ی لثل اص ‪ )C6( merge‬تا کوک‬
‫‪ reset‬تشگشدیذ ّ اص اّل ‪ merge‬سا اًجام دُیذ ! تشای اعالػات تیؾتش تَ هغلة عایت هشجغ دستاسٍ‌ی تشگشداًذى‬
‫یک ‪ merge‬هشاجؼَ ًواییذ‪.‬‬
‫”>>‪Git rebase me to : “<<to-branch-name‬‬
‫)‪12‬‬
‫ایي دعتْس ُن کاکشدی هؾاتَ تا ‪ merge‬داسد ّ خیلی پیچیذٍ‌تش ّ ظشیف‌تش ػول هی‌کٌذ‪ .‬دس ایي دعتْس تایذ‬
‫تشخالف ‪ ،merge‬سّی اًؾؼاب فشػی تاؽیذ ّ پاساهتش «ًام اًؾؼاب» ُن تایذ اًؾؼاب افلی تاؽذ؛‬
‫ػولکشد ایي سّػ تَ ایي فْست اعت کَ «صًجیشٍ تغییشاتی کَ ‪ Commit‬تَ ‪ Commit‬اص پایَ‌ی هؾتشک‬
‫تا ؽاخَ‌ی فشػی ایجاد ؽذٍ اعت» یکی پظ اص دیگشی سّی ؽاخَ‌ی افلی کَ تَ ػٌْاى پاساهتش گشفتَ اعت‬
‫اػوال ّ ‪ Commit‬هی‌کٌذ‪( .‬دس هثال صیش «تفاّت ‪ 169a6‬تا ‪« ّ »a47c3‬تفاّت ‪ 2c33a‬تا ‪ »169a6‬سا‬
‫سّی ‪ master‬اػوال هی‌کٌذ ّ دسًِایت آى سا اًؾؼاب ‪ topic‬هی‌کٌذ)‬
‫ؽکل ‪ُ . 8‬واى تؼذاد ‪ Commit‬کَ اص ‪ Base‬دس اًؾؼاب فشػی اًجام دادٍ‌ایذ‪ ،‬سّی اًؾؼاب افلی اػوال‬
‫هی‌ؽْد‪.‬‬
‫‪Git stash‬‬
‫)‪13‬‬
‫ایي یک دعتْس خیلی تادال اعت کَ هثل یک ‪ ّ Stack‬تَ ػٌْاى هتغیش هیاًی (تافش) تشای ؽوا کاس‬
‫هی‌کٌذ ! تا ‪ git stash‬توام هذتْیات دایشکتْسی افلی سا (الثتَ فمظ آًِایی کَ ‪ Stage‬ؽذٍ‌اًذ) دس ‪stack‬‬
‫هخقْؿ ‪ push‬کٌیذ ّ ُشّلت خْاعتیذ ‪ pop‬کٌیذ‪( .‬تذّس اص پیچیذگی‌ُای اًؾؼاب ّ ‪ُCommit‬ا)‬
‫ًکتَ ‪ :‬اگش هی‌خْاُیذ تثیٌیذ دس داخل ‪ stack‬چَ هی‌گزسد اص دعتْس ‪ git stash list‬کوک تگیشیذ‪.‬‬
‫‪Git stash apply‬‬
‫)‪14‬‬
‫ایي دعتْس هکول دعتْس لثل اعت ّ ُواى ػول ‪ pop‬سا سّی ‪ stack‬اًجام هی‌دُذ (اص سّی ‪stack‬‬
‫هذتْیات دایشکتْسی افلی ّ ایٌذکظ سا هی‌خْاًذ)‪.‬‬
‫ًکتَ ‪ :‬ؽوا ایي لذست سا داسیذ کَ چیضی غیش اص اًتِای ‪ stack‬سا ‪ pop‬کٌیذ‪ .‬کافی اعت ؽواسٍ آیتن هْسد‬
‫ًظش خْد دس پؾتَ سا تَ فْست }‪ stash@{0‬جلْی ُویي دعتْس ّاسد ًواییذ‪( .‬تا ‪ git stash list‬تَ‬
‫هذتْیات ‪ً stack‬گاُی تیاًذاصیذ)‬
‫]]‪Git push <<online-repository>> [local-branch[:online-branch‬‬
‫)‪15‬‬
‫تا ایي دعتْس یک اًؾؼاب دس هخضى ‪ local‬عیغتن‌تاى سا سّی یک هخضى آًالیي تشیضیذ‪.‬‬
‫ًکتَ ‪ :1‬اگش ًام اًؾؼاب سا ّاسد ًکٌیذ‪ ،‬اًؾؼاب‌ی ‪ master‬تَ عْس پیؼ‌فشك دس ًظش گشفتَ هی‌ؽْد‬
‫ًکتَ ‪ :2‬تَ جای ّاسد کشدى هغتمین آدسط ایٌتشًتی‪ ،‬هی‌تْاًغتیذ آدسط ایٌتشًتی سا تَ کوک دعتْس ‪git‬‬
‫‪ remote‬تشایؼ یک ًام تگزاسیذ هثال ‪ myrepo‬تؼذ تشای ‪ push/pull/fetch‬دیگش تَ جای آدسط اص ًام‬
‫‪ myrepo‬اعتفادٍ کٌیذ‪.‬‬
‫]‪Git pull <<online-repository>> [branch-name‬‬
‫)‪16‬‬
‫تا ایي دعتْس یک اًؾؼاب سا اص سّی هخضى آًالیي تگیشیذ ّ دس هخضى ‪ local‬عیغتن‌تاى تشیضیذ‪.‬‬
‫(تکٌیکی‪ :‬ایي دعتْس هؼادل اعت تا اجشای ‪ ّ git fetch‬عپظ ‪ git merge‬کشدى آى سّی هخضى داخلی)‬
‫>>‪Git remote add <<repository-alias>> <<online-repository-address‬‬
‫)‪17‬‬
‫تشای یک هخضى آًالیي یک ًام هغتؼاس هی‌گزاسد ّ ایي ًام دیگش هؼشف ایي هخضى آًالیي خْاُذ تْد‪.‬‬
‫ًکتَ هِن‪ّ :‬لتی ؽوا یک هخضى آًالیي سا دس اتتذا ‪ clone‬کشدیذ‪ .‬تشای آى هخضى کَ ‪ clone‬کشدیذ تَ عْس‬
‫پیؼ‌فشك ًام هغتؼاس ‪ origin‬اختقاؿ گشفت‪ ّ .‬تؼذُا تشای ‪ push‬کشدى (ّ عایش کاسُا) تَ آى هخضى‬
‫هی‌تْاًیذ اص ایي ًام هغتؼاس اعتفادٍ کٌیذ‪.‬‬
‫ًکتَ ‪ :‬اسجاع تَ ؽاخَ‌ُای هخضى آًالیي ایٌغْس اًجام هی‌ؽْد ‪ online-repo-name/branch‬هثل‬
‫‪ origin/master‬کَ ؽاخَ‌ی افلی هخضى آًالیي کَ ‪ clone‬کشدٍ‌ایذ ًؾاى هی‌دُذ‪.‬‬
‫‪Git remote‬‬
‫لیغت توام هخضى‌ُای آًالیي کَ ثثت کشدٍ‌این ًؾاى هی‌دُذ‬
‫)‪18‬‬
‫کمی تکنیکی‌تر بو ‪ Git‬بنگریم‬
‫دس ‪ Git‬چِاس ًْع ؽئ هغشح‌اًذ‪.‬‬
‫تْضیخ‬
‫ًْع‬
‫‪Blob‬‬
‫داّی یک فایل اعت‪ُ .‬ش ‪ Blob‬ؽٌاعَ‌اػ یک ‪ hash‬اعت کَ اص سّی هذتْی فایل‬
‫‪Tree‬‬
‫یک لیغت اعت کَ ُش ػضْ آى اؽاسٍ هی‌کٌذ تَ یک ‪ Tree‬دیگش اعت یا یک ‪.Blob‬‬
‫‪Commit‬‬
‫عاختَ تْلیذ هی‌ؽْد‪.‬‬
‫(یک عاختواى‌دادٍ‌ی دسختی عادٍ تَ ّجْد هی‌آّسد)‬
‫ؽاهل چٌذ چیض اعت‪:‬‬
‫‪ .1‬یک اؽاسٍ‌گش تَ یک ‪َُ( Tree‬ؼ ‪ُ Commit-id‬ویي اؽاسٍ‌گش اعت‪).‬‬
‫‪ .2‬اؽاسٍ‌گش تَ ‪ Commit‬پذسػ (لثلی)‬
‫‪ .3‬هؾخقات فشد ‪ Commit‬کٌٌذٍ (ًام ّ ایویل)‬
‫‪ .4‬تْضیخ ‪Commit‬‬
‫‪ .5‬تاسیخ اًجام ‪Commit‬‬
‫‪Tag‬‬
‫فشفا یک ًام داسد ّ یک اؽاسٍ‌گش تَ یک ؽئ ‪Commit‬‬
‫تشای هؾاُذٍ‌ی لیغت ‪ Blob‬فایل‌ُای اًذیظ ؽذٍ‌ی پشّژٍ‌تاى دعتْس ‪ git ls-files –s‬سا ّاسد کٌیذ‪.‬‬
‫دلت کٌیذ کَ اگش فایل‌ُا سا تغییش دادٍ‌ایذ تا صهاًی کَ ‪Add‬ؽاى ًکشدیذ ّ ‪ً Stage‬ؾذٍ‌اًذ تشایؾاى ‪Blob‬‬
‫جذیذ عاختَ ًوی‌ؽْد ّ دس اًذیظ جایگضیي ًوی‌ؽًْذ‪ .‬یؼٌی ایي‌ُا ‪ Blob‬فایل‌ُایی ُغتٌذ کَ آخشیي تاس‬
‫‪ Stage‬ؽذٍ‌اًذ‪.‬‬
‫ؽوا ُشتاس کَ ‪ Commit‬هی‌کٌیذ ایي دسخت اًذیظ سا دس ؽئ ‪ Commit‬خْد جای هی‌دُیذ‪ .‬پظ دلت‬
‫کٌیذ کَ لثل اص ‪ Commit‬تغییشات خْد سا اًذیظ‌گزاسی کٌیذ تَ ػثاست دیگش ُوَ‌ی فایل‌ُا سا ‪Staged‬‬
‫کٌیذ تَ کوک دعتْس ‪.git add –A‬‬
‫مثال ساده از ‪Blob‬‬
‫تَ ؽکل صیش تْجَ کٌیذ‪ .‬تشای دالتی کَ پشّژٍ فمظ یک فایل ‪ README‬داسد ّ آى ‪ Stage‬ؽذٍ اعت‬
‫عاختاس داخلی ‪( Git‬دسّى ؽاخَ‌ی پٌِاى ‪ ).git‬تَ فْست تاال خْاُذ تْد‪.‬‬
‫هذتْیات فایل ‪ README‬تثذیل تَ یک ‪ Blob‬ؽذٍ اعت کَ یک ‪ 4۴ hash‬سلوی داسد‪ .‬دّ سلن اّل‬
‫‪ hash‬تشای اًذیظ‌گزاسی ‪ B-Tree‬اعتفادٍ ؽذٍ اعت ّ تمیَ‌ی ‪ُ hash‬ن تَ ػٌْاى ًام فایل اعت‪.‬‬
‫اًذیظ فمظ یک گشٍ داسد کَ آى ُن تَ ُواى ‪ Blob‬اؽاسٍ هی‌کٌذ‪.‬‬
‫مثال ساده از ‪Tree‬‬
‫یک دالت پیچیذٍ‌تش کَ پشّژٍ یک هجوْػَ فایل داؽتَ تاؽذ سا تثیٌیذ‪.‬‬
‫‪./README‬‬
‫‪./src/hello.c‬‬
‫‪./src/hello.py‬‬
‫‪./docs/hello‬‬
‫مثال ساده از ‪Commit‬‬
‫هثال اص ّلتی کَ دّ ‪ Commit‬داسین‪ .‬اّلیي ‪ Commit‬تا تْضیخ ”‪ “Initial commit‬اعت ّ دّهیي‬
‫‪ Commit‬تا تْضیخ ”‪.“Start test plan‬‬
‫دس ‪ Commit‬دّم ُواًغْس کَ هؾاُذٍ هی‌کٌیذ ًیاصی تَ دّتاسٍ عاختي دسخت‌ُای ‪ً docs ّ src‬ثْدٍ‬
‫اعت صیشا ُیچ‌فایلی دس پشّژٍ تغییش ًکشدٍ اعت ّ فمظ یک پْؽَ ّ یک فایل ‪ ./test/plan‬تَ پشّژٍ اضافَ‬
‫ؽذٍ اعت‪.‬‬
‫بازنگری تکنیکی دستورات ‪Git‬‬
‫ّلتی ساٌُوای دعتْسات سا اص هشجغ ‪ )git-scm( Git‬تخْاًیذ خْاُیذ دیذ کَ تشای تْفیف ّضؼیت‬
‫فؼلی ‪ 3‬هفِْم ّجْد داسد‪.Working directory ّ Index ،HEAD .‬‬
‫‪ HEAD ‬یک ‪ Pointer‬اعت تَ یکی اص ‪ُCommit‬ا کَ ػوْها ّضؼیت فؼلی سا ًؾاى هی‌دُذ‪.‬‬
‫‪ُ Index ‬واى دسخت اًذیظ فؼلی اعت‪( .‬تغییشات ‪ Stage‬ؽذٍ)‬
‫‪ Working directory ‬هذتْی دایشکتْسی پشّژٍ اعت‪.‬‬
‫ًکتَ ایي اعت کَ ایي ‪ 3‬هی‌تْاًٌذ تاُن تشاتش ًثاؽٌذ‪.‬‬
‫دس چَ فْست تشاتشًذ ؟ ّلتی توام تغییشات سا ‪ Commit ّ Add‬کشدٍ‌ایذ ایي ‪ 3‬تاُن تشاتشًذ‪.‬‬
‫اگش پظ اص آى تغییشی دس فایل‌ُا تذُیذ ‪ّ Index=HEAD‬لی ‪ WorkingDir‬هتفاّت هی‌ؽْد‪.‬‬
‫اگش تغییشی کَ دادٍ‌ایذ ‪ Add‬کٌیذ (یؼٌی ‪ Stage‬کٌیذ) ‪ HEAD‬فشق هی‌کٌذ تا ‪.WorkingDir=Index‬‬
‫ّ دسًِایت تغییش سا کَ ‪ Commit‬هی‌کٌیذ هجذدا ُشعَ تاُن تشاتش هی‌ؽًْذ‪.‬‬
‫‪1) Git add -A‬‬
‫هي اص پاساهتش ‪ –A‬اعتفادٍ کشدم یؼٌی ُوَ‌ی فایل‌ُا سا ‪ ّ Stage‬اًذیظ‌گزاسی کي؛ ّلی هی‌تْاى فمظ‬
‫تخؾی اص فایل‌ ُا سا دس لالة آسگْهاى تَ ایي دعتْس سد کشد‪ .‬ایي دعتْس دسخت اًذیظ سا تشّص هی‌کٌذ‪ .‬تشّص‬
‫سعاًی آى یؼٌی فایل‌ُا یا دایشکتْسی‌ُایی کَ دس آى تغییش دادٍ‌ایذ پیذا هی‌کٌذ (تا همایغَ تا اًذیظ‌ُای‬
‫فؼلی) ّ آًِایی کَ تغییش کشدٍ‌اًذ اگش فایل تاؽذ ‪ Blob‬ؽاى سا هجذدا هی‌عاصد ّ ‪ Tree‬پْؽَ‌ُای هشتْط‬
‫تَ آى سا ُن ػْك هی‌کٌذ‪.‬‬
‫”‪2) Git commit –a -m “msg‬‬
‫یک ؽئ ‪ Commit‬هی‌عاصد تا تْضیخ ‪ msg‬کَ تَ دسخت اًذیظ فؼلی اؽاسٍ هی‌کٌذ‪ .‬اؽاسٍ‌گش پذس‬
‫‪ Commit‬جذیذ عاختَ ؽذٍ سا سّی ‪ Commit‬لذیوی هی‌گزاسد‪ .‬اؽاسٍ‌گش ‪ُ ّ HEAD‬وچٌیي اًؾؼاب‬
‫فؼلی سا سّی ‪ Commit‬جذیذ هی‌گزاسد‪.‬‬
‫>‪3) Git checkout <branch‬‬
‫اؽاسٍ‌گش ‪ HEAD‬سا سّی آى ؽاخَ هی‌گزاسد (دسخت اًذیظ هغاّی هی‌ؽْد تا دسخت اًذیظ هْسد‬
‫اؽاسٍ‌ی ؽئ ‪ Commit‬هشتْط تَ آى ؽاخَ)‪ ّ .‬هذتْیات دایشکتْسی افلی سا هغاتك تا دسخت اًذیظ‬
‫ػْك هیکٌذ‪.‬‬
‫اگش ‪ Blob‬هشتْط تَ فایلی دس دسخت اًذیظ ‪ Commit‬کَ ‪ HEAD‬سّی آى لشاس داسد ‪ BCurrent‬تاؽذ‪ّ .‬لی‬
‫دس دایشکتْسی افلی ‪ُ Blob‬واى فایل ‪ BNow‬تاؽذ‪ ،‬ایي تذیي هؼٌی اعت کَ فایل تغییش کشدٍ اعت‪.‬‬
‫اگش ‪ُ Blob‬ویي فایل دس ؽاخَ‌ای کَ هی‌خْاُین ‪ Checkout‬کٌین ‪ BBranch‬تاؽذ‪.‬‬
‫اگش ‪ BBranch = BCurrent‬آى‌ّلت فایل تغییش کشدٍ ػْك ًوی‌ؽْد تا تغییشاتی کَ سّی آى اًجام دادٍ‌ایذ اص‬
‫تیي ًشّد‪( .‬هگش ‪ –f‬دس جلْی دعتْس ّاسد کٌیذ)‬
‫اگش ‪ BBranch < > BCurrent‬آى‌ّلت ‪ Git‬دیگش ًوی‌داًذ چکاس کٌذ ّ اص ؽوا عْال هی‌پشعذ !‬
[1] http://gitref.org/
[2] http://git-scm.com/docs/
[3] https://www.atlassian.com/git/tutorials/
[4] http://www.gitguys.com/