جسوهی 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/
© Copyright 2025 Paperzz