Türkçe Git 101
Transkript
Türkçe Git 101
TableofContents 1. Introduction 2. VersiyonKontrolüneGiriş i. VersiyonKontrolüNedir? ii. VersiyonKontrolüneNedenİhtiyacımızVar? iii. KısaGitTarihçesi iv. GitİleÇalışmayaBaşlamak v. BasitAnlamdaVersiyonKontrolüİşAkışı vi. Localbirprojeoluşturmak vii. Remotebirprojeoluşturmak viii. ProjemizÜzerindeÇalışmayaBaşlayalım 3. Branching(Dallanma)veMerging(Birleştirme) i. BranchingÇalışmaŞekliniziDeğiştirebilir ii. Branch'lerİleÇalışmak iii. DeğişiklikleriniziGeçiciOlarakKaydetmek->GitStash iv. LocalBirBranch'deÇalışmak v. DeğişiklikleriMergeEtmek vi. BranchingİşAkışları 4. RemoteRepository'ler i. RemoteBirRepository'yeBağlantıSağlamak ii. RemoteRepository'dekiVerilerinİncelenmesi iii. RemoteDeğişiklikleriEntegreEtmek iv. LocalBirBranch'iYayınlamak(Publish) v. Branch'leriSilmek 5. İleriSeviyeKomutlarveİşlemler i. DeğişiklikleriniziGeriAlmak ii. DiffİleFarklarıİncelemek iii. ÇakışmalarıGidermek iv. MergeAlternatifiOlarakRebaseKullanımı 6. GitAraçveServisleri i. GörselGitİstemcileri ii. Diff/MergeAraçları iii. GitServisleri iv. KaynakçaveReferanslar TürkçeGit101 Önsöz Son4-5yıldayazılımgeliştiricilerinveyazılımşirketlerininvazgeçilmezaraçlarındanbiriolanvebenimdebiryazılım geliştiriciolarakçokbaşarılıbulduğumGitDağıtıkVersiyonKontrolSistemini(DistributedVersionControlSystem)örnekler ileelealaraksizetanıtmayaçalışacağım. İngilizceTerimler YazılımGeliştirmeileilgiliçoğukonudaolduğugibimaalesefGitileilgilikaynaklardaağırlıklıolarakİngilizce.Terminoloji anlamındaTürkçebirkaynakhazırlamanınenbüyükzorluğuİngilizceterimlereTürkçeuygunkarşılıkbulmaktır.AncakGit 101kitabındaİnglizce->Türkçegeçişinibirebiryapmayacağım,mümkünolduğukadarVersiyonKontrolüveGitileilgili terimlerinİnglizcehallerinikullanmayaçalışacağım. KonularındizilimindeveiçeriğinoluşturulmasındaLearnVersionControlwithGitisimlikitapçığınonlineversiyonubaz alınmıştır.BelirtilenkaynaktakibaşlıklaraveiçeriğeilaveolarakdahaayrıntılıbirkitapolanProGitkitabındanveson bölümdelinklerinipaylaştığımonlinediğerkaynaklardandafaydalanılmıştır. Örnekler ÖrneklerimiziTerminal(komutsatırıveyacommandlineolarakdatabiredilen)üzerindenAppleMacOSXişletimsistemi kullanarakoluşturacağız.BukaynağınoluşturulduğuandabenimbilgisayarımdakiAppleMacOSXvegitversiyonları aşağıdakigibi OSXversiyonu:10.9.4(Mavericks) Gitversiyonu:1.8.5.2(AppleGit-48) Git,OSX'inyanısıratümLinuxdağıtımlarıveWindows'dadaçalışmaktadır.Gitkomutlarıkullandığınızişletimsistemine göredeğişmezancakGitkurulumukullandığınızişletimsisteminegöredeğişebilir.İşletimsisteminizebağlıolarakkurulum yönergeleriiçinaramamotorlarınıkullanarakgerekliadımlarıöğrenebilirsiniz. VersiyonKontrolüneGiriş Bubölümdeaşağıdakikonularıelealacağız VersiyonKontrolüNedir VersiyonKontrolüneNedenİhtiyacımızVar GitİleÇalışmayaBaşlamak BasitAnlamdaBirVersiyonKontrolüİşAkışı LocalBirProjeOluşturmak RemoteBirProjeOluşturmak ProjemizÜzerindeÇalışmayaBaşlayalım VersiyonKontrolüNedir? Versiyonkontrolünedirvebizinedenilgilendirmeli?Versiyonkontrolünübirdosyaveyabirkümedosyadakideğişiklikleri takipedebilmekiçinuyguladığımızbiryöntemolaraktanımlayabiliriz.Gitgibisistemlertümbudeğişikliklerintarihçesinive içeriğinielektronikolarakbizimiçintakipederekkayıtaltınaalmamızısağlayanveritabanlarıolarakdüşünülebilir. Busistemlerikullanarakherhangibirandaüzerindeçalıştığınızdosyalarınoankihallerinikaydedebilir,dahasonrada istersenizbudosyalarınkaydedilmişvekontrolaltınaalınmışherhangibirhalinegeridönebilirsiniz. Dosyalarınkayıtaltınaalınmışherhangibirandakihallerineversiyondiyoruz Görsel:AtlassianGitWorkflowssayfasındanalıntı Versiyonkontrolünü,kullandığınızprogramlamadili,yardımcıprogramlamakütüphaneleri(framework),dosyatipiveya işletimsistemindenbağımsızbiryaklaşımolarakdüşünmelisiniz.Çünküversiyonkontrolü HTMLdosyalariçinkullanılabileceğigibi,mimaritasarımamaçlıprojedosyalarıveiPhoneuygulamasıkaynakkodunuz içindekullanılabilir Dosyalarınızüzerindeçalışırkenhangiişletimsisteminiveyahangiprogramlarıkullandığınızileilgilenmez(Sublime Text,Notepad,VisualStudio,Word,AutoCAD) BendebukitabınversiyonkontrolüiçinGitkullanıyorum Versiyonkontrolsistemlerienbasitanlamdadosyalarınızdakideğişikliklerintarihçesinitakipedipkayıtaltındatutan sistemlerdir.Bunedenleversiyonkontrolsistemleriniyedeklemeveyadiğeryazılımgeliştirmearaçlarıilekarşılaştırmak doğruolmaz. VersiyonKontrolüneNedenİhtiyacımızVar? Versiyonkontrolsistemikullanmanınbirçokfaydasıvarvebubölümdeversiyonkontrolsistemikullanımınınbizesağladığı avantajlardanbahsediyoruz. Uyumluekipçalışması Herhangibirversiyonkontrolsistemikullanmadığınızdaberaberçalıştığınızdiğerkişilerileaynıdosyalarüzerinde çalışabilmekiçinmuhtemelenherkesinerişimineaçıkpaylaşımlıbirklasörkullanmakzorundakalacaksınız. Butürbirsenaryodakullanılanyazılımlarınçoğudeğiştirilendosyayakilitkoyarvebaşkabirisiaynıdosyayıdüzenlemek istediğinde Kullandığıprogramabağlıolarakdosyayazmakorumalıolaraksaltokunurmodda(readonly)açılırveya Değişikliklerkaydedilmekistendiğindehataverir Butürbirçalışmahemçokzahmetlihemdehatalaraaçıktır.Örneğinbirdosyanınensongeçerliversiyonununnerede olduğununtakipedilmesigibiçözümbulunmasıgerekensorunlarileuğraşmakzorundakalırsınız. Üzerindeçalıştığınızdosyadasizdenöncebaşkasınındeğişiklikyapıpyapmadığındanhaberinizyoksahatalıiçerik üretmeihtimalinizvardır. Versiyonkontrolsistemikullanıldığındaiseekibinizdekiherkesözgürbirşekildeistediğidosyalarüzerindegüvenlibir şekildeistediğideğişikliğiyapabilir.Herkesdeğişikliklerinitamamladıktansonradatümdeğişikliklerversiyonkontrolsistemi kullanılaraksağlıklıbirşekildemerge(birleştirme)edilebilir. Versiyonlarındüzgünbirşekildetakipedilebilmesi Üzerindeçalıştığınızbirdosyanınveyabirdiziprojedosyasınınzamaniçindefarklıversiyonlarıoluşurvebuversiyonların kayıtaltınaalınmasıgerekir.Busorumlulukgeneldeçokzahmetlivesıkıcıbirişvesüreçtir.Aşağıdakinebenzersorular canınızıgereğindenfazlasıkabilir Sadecedeğişendosyalarmıyoksabirprojedekitümdosyalarınversiyonlarımıkaydedilmeli? Birsürüdosyaiçindensadecedeğişendosyalarınbelirlenmesizordur Herseferindedosyalarınhepsinintekertekerkaydedilmesidurumundaiseihtiyaçduyulandandahafazla diskalanıkullanılır Dosyalaraverilecekisimlertambirbaşağırısınadönüşebilir. Personel_Maas.xlsx Personel_Maas1.xlsx Personel_Maas_Ozet.xlsx Personel_Maas_BrutHaricDetay.xlsxşeklindedosyaisimleriüretmekzorundakalabilirsiniz. Belkidecanınızıençoksıkacakşeyprojenizinikiversiyonuarasındatamolaraknetürfarklarınolduğunusağlıklıbir şekildebilmeşansınızolmamasıolacaktır Versiyonkotrolsistemikullandığınızdasizinçalıştığınızdiskalanındaprojedosyalarınınsadecebirversiyonubulunur,bu dosyalarındahaöncekihalleriversiyonkontrolsisteminindenetimindedir.Busayedeistediğinizzamanöncekiversiyonlara geridönebilir,versiyonlararasındakifarklılıklarırahatlıklainceleyebilirveversiyonlarıkaydederkeneklediğinizilavebilgileri veyorumlarınızırahatlıklagörebilirsiniz. ÖncekiVersiyonlaraGeriDönebilme Dosyalarınızınveyaaslındatümprojenizindahaöncekiversiyonunageridönebilmeimkanınsizeciddianlamdaözgürlük sağlar;dosyalarınızıveprojeniziistediğinizgibideğiştirmeözgürlüğü.Yaptığınızdeğişikliklerprojeniziçöpedöndürdüyse, geliştirdiğinizbirişlevtamistediğinizgibiolmadıysaveyamüşterinizveyapatronunuzgeliştirdiğinizbirişleviartık istemediğinekararverirseprojenizinöncekitemizhalineçokhızlıverahatbirşekildedönebilirsiniz. Dosyalarınızınnedendeğiştiğinianlama Versiyonkontrolsistemlerideğişikliklerinizitamamlayıpcommitetmekistediğinizdecommentadıverilenaçıklamalar girmeniziisterler.Bucommentlersayesindeprojenizinherhangibirversiyonundakideğişikliklerinnedenlerinidekayıtaltına alıpihtiyaçhalindegeridönüpinceleyebilirsiniz. Git'decommitişlemiyapılırkencomment(yorummetni)girilmesizorunludur Yedekleme Gitgibidağıtıkversiyonkontrol(DVCS)sistemlerininyanetkiolaraksağladığıfaydalardanbirisideyedeklemedir.Git sayesindeaynıprojedeçalışanherkesinkendibilgisayarındaprojenintambirtarihçesitutulur.Merkeziversiyonkontrol sistemisunucusundabirsorunoluştuğundatakımdakiherhangibirininkendidiskindekiproje'yisunucuyageriyüklemesi yeterlidir.Diğerleridekendibilgisayarlarındakiprojedosylarınıgeriyüklenenprojedosyalarıilesenkronizeedebilirler. KısaGitTarihçesi Git2005yılında,baştaLinusTorvaldsolmaküzereLinuxçekirdeğinidekodlayanekiptarafındanLinuxkaynakkodunu versiyonkontrolüaltındatutmakvekendiişakışlarınıdüzenlemekiçingeliştirilmiştir Linux'unkaynakkodu1991-2002yıllarıarasındakidönemdemanuelolarakdosyalarınpaylaşılmasışeklindeyönetiliyordu. 2002yılındaLinuxgeliştiricilerinormaldeücretliolanancakaçıkkaynakprojeleriçinücretsizlisanslamamodelisunan BitKeeperisimlidağıtıkversiyonkontrolsisteminikullanmayabaşladılar.2005yılındaBitKeeper'ınücretsizsağladığılisansı geriçekmesiüzerineLinusTorvaldsveLinuxekibikendidağıtıkversiyonkontrolsisteminigeliştirmeyekararverdiler. LinuxekibiBitKeeperileolandeneyimlerinidedikkatealaraköncelikliolarakaşağıdakikriterlerisağlayankendi yazılımlarınıgeliştirmeyebaşladılar Hızlı Kullanımıkolay Lineerolmayangeliştirmeişakışınauygun(branching) Tamamendağıtık Büyükprojeleridestekleyebilecek 2005yılındanbugüneGitgelişmeyedevamediyor.Git'eyenieklenenözelliklererağmenGitbugünbileyukarıda bahsettiğimönceliklikriterlerdentavizvermedenmiliyolarcayazılımgeliştiricininhayatınıkolaylaştırmayadevamediyor. GitİleÇalışmayaBaşlamak Komutsatırımıyoksagörselarayüzmü? Gitileçalışmakiçingit'inkendikomutsatırıarayüzünü(GitCommandLineInterface)veyagörselkullanıcıarayüzüolan masaüstüuygulamalar(SourceTree,TortoiseGit,TowerveyaGitHub)kullanabilirsiniz. GitileçalışırkengörselarayüzüolanbiruygulamakullanmanızüretkenliğiniziarttırıpGit'inçoksayıdakikarmaşıkkomutuna dahahızlıvekolayerişmenizisağlar.DiğeryandanGit'inkomutsatırıarayüzünükullanmanızGitileilglidahaayrıntılı bilgilenmenizive3.partiuygulamalarabağımlıkalmadanGitileçalışabilmenizisağlar. Gitkomutlarınıkomutsatırındaöğrendiktensonragünlükçalışmanızdagörselarayüzüolanbiruygulamayımutlaka kullanmanızıöneriyorum. Kurulum Git'inkurulumuhemWindowshemdeMacOSXiçinoldukçakolaybirişlemdir.Herikiişletimsistemiiçintektıklakurulum yapmanızısağlayankurulumsihirbazlarıvardır. Windows İşletimsisteminizWindowsisegitileçalışmakiçin"msysgit"paketinikullanabilirsiniz. msysgitpaketinikurmakiçinhttp://msysgit.github.io/adresindenkurulumuygulamasınıindiripçalıştırmalısınız.Kurulum adımlarısırasındakarşınızaçıkacakolanekranlardavarsayılanayarlarıseçiliolarakbırakarakkurulumunuzu tamamlayabilirsiniz. KurulumtamamlandıktansonraWindowsBaşlangıçmenüsündenGitklasörüaltındakiGitBashuygulamasınıçalıştırıp Git'inkomutsatırıarayüzünükullanmayabaşlayabilirsiniz. Git'inkurulumununsorunsuzgerçekleştiğiniteyidetmekiçinGitBash'iaçıpgit--versionkomutunuyazın.Bukomut ekranaGit'inversiyonbilgisinibasar.Eğerhataalırsanızmsysgitanasayfasındansorunungiderilmesiiçinne yapmanızgerektiğiniöğrenebilirsiniz. MacOSX İşletimsisteminizMacOSXiseGitkurulumuiçinikiyöntemkullanabilirsiniz. Apple'ingeliştiriciaraçlarınıkurarak(XCode)AppletarafındansağlananGitdağıtımınıkurabilirsiniz GitOSXInstallerpaketiniindiripGit'ikurabilirsiniz. GitkurulumunutamamladıktansonraApplicationsklasörüaltındakiTerminal.appuygulamasınıçalıştırın. Spotlight'aterminalyazarakdaTerminal.appuygulamasınıbulupçalıştırabilirsiniz Kurulumunuzudenetlemekiçinkomutsatırındagit--versionkomutunuçalıştırın.BukomutGit'inversiyonunuekrana basar.Herhangibirhataalmanızdurumundakurulumyönteminizegöreilgilikaynaklarıaraştırmanızgerekebilir. GitKonfigürasyonu Git'ikurduğumuzagöreartıkGitileçalışmakiçinbazıayarlaryapabiliriz.BuayarlariçinGitbizegitconfigisimlibir araç/komutsunar.Gitayarlarınıbirdefayapmanızyeterliolacaktır. Buayarlarıistediğinizzamandeğiştirebilirsiniz. Gitayarlarınızaşağıdabelirtilenüçkonumdakaydedilirvehiyerarşikolarakbukonumlardanyüklenir 1. Seviye(/etc/gitconfigdosyası):Tümkullanıcıveprojeleriçingeçerliolanayarlarbudosyadakaydedilir.gitconfig komutunu--systemseçeneğiileçalıştırırsanızayarlarbudosyadakaydedilecekvebudosyadanokunacaktır 2. Seviye(/.gitconfigdosyası):Sadecesizinkullanıcınıziçintanımlananayarlarınkaydedildiğidosyadır.gitconfig komutunu--globalseçeneğiileçalıştırısanızayarlarbudosyayakaydedilecekvebudosyadanokunacaktır 3. Seviye:Projeklasörünüzün(projenizinGitileversiyonkontrolünealınmışolmasıgerekiyor)altındayeralan .git/configdosyasındaiseprojebazındakigitayarlarınızyeralır. Git,ayarlarınızındeğerinibelirlemekiçinbuüçkonumdakidosyaları3.seviye,2.seviyeve1.seviyesıralamasıile hiyerarşikolarakokur.Belirlibirayar'ailişkindeğereilkhangiseviyederastlandıysaoseviyedekideğerdikkatealınırdiğer seviyelerdekideğerlerdikkatealınmaz. Windows'daglobal(gitconfig--globalkomutu)gitayarlarınızWindows'un$HOMEklasörüaltındayeralan(genellikle C:\DocumentsandSettings$USER).configdosyasındayeralır.ProjeseviyesindekiayarlarınıziseOSX'deolduğugibi [ProjenizinAnaKlasörü].git\configdosyasındakayıtaltınaalınır. Kullanıcıadınızıveemailbilgisi Gitayarlarındanenönemliolanlarıkullanıcıadınızveemailadresinizdir.Git,ayarolaraktanımladığınızdeğerlericommit vbişlemlerdeotomatikolarakkullanır.Buayarlarındeğerinibelirlemekiçinkomutsatırındaaşağıdakikomutları çalıştırıyoruz gitconfig--globaluser.name"aliözgür" gitconfig--globaluser.email"ali.ozgur@example.com" Yukarıdakikomutlarda --globalseçeneğiileGit'eglobalayarlarıdüzenlediğinizisöylüyoruz user.name(veuser.email)iledeğerinideğiştirmekistediğinizayarınanahtar'ınıbelirtiyoruz Ardındandaçifttırnakiçindeilgiliayarındeğerinigiriyoruz Buayarları--globalibaresiiletümprojelerinizdegeçerliolacakşekildeyaptık,projeseviyesindebuayarlarıyapmakiçin komutsatırında(terminal'de)projenizinklasörünekonumlanıpgitconfiguser.name"aliözgür"komutuile--global seçeneğinikullanmadanyapabilirsiniz. Kendiyaptığımızveyakurulumilehazırgelenayarlarındeğerlerinigörmekiçinaşağıdakikomutlarıkullanabiliriz. Globalseviyedetümayarlarılistelemekiçin gitconfig--global-l Globalseviyedetekbirayar'ındeğerini(örneğimizdeuser.nameanahtarınasahipayar)görmekiçinise gitconfig--globaluser.name İPUCU Git'inkomutlarıvebukomutlarınseçenekveparametreleriileilgiliyardımalmakistediğinizde git[komutadı]--help(örneğin:gitinit--help) githelp[komutadı](örneğin:githelpinit) komutlarınıkullanabilirsiniz. Editörayarı Git'inbazıkomutlarısizdeninteraktifolarakyorumveyabilgigirmeniziister.ButürdurumlariçinGit'inhangimetin düzenlemeuygulamasınıkullanacağınıayarlayabilirsiniz.GitvarsayılanolarakViveyaVim)kullanır.Ancakbueditörlerin kullanımıbaşlangıçseviyesindekikullanıcılariçinzorolabilir.Ben,ViveyaVimilekarşılaştırıldığındakullanımınındaha kolayolduğunudüşündüğümGNUMidnightCommander(MC)kullanmanızıöneriyorum. MidnightCommander'iMacOSX'eHomebrewkullanarak brewinstallmidnight-commander komutuilekurabilirsiniz. MidnightCommanderveyaGit'idestekleyeneditörkurulumunutamamladıktansonra gitconfig--globalcore.editormcedit ileGit'inkullanacağıeditörayarınızıyapabilirsiniz. Diffaracıayarları Diffkavramınıilerleyenbölümlerimizdedahaayrıntılıelealacağız,ancakkısacadeğinmekgerekirse BirdosyanınTxanındakiiçeriğiileTyanındakiiçeriğininarasındakifarklarıtespitetmevegöstermeişlemidir. İngilizcededifference(fark)kelimesininkısaltmasıolandiffşeklidekullanılır. Buişlemigözileyapmakzorundakalmadandosyalarve/veyaklasörlerarasındakifarklarıtespitetmekvegörselleştirmek içinkullanılanaraçlaragenelolarakDiffAraçlarıismiverilir. Ben,MacOSXüzerindeücretsizbiruygulamaolanSourceGearDiffMergekullanmayıtercihediyorum.Git'indiffaracı olarakSourceGearDiffMerge'ikullanmasınısağlamakiçin gitconfig--globalmerge.tooldiffmerge komutuileayaryapabilirsiniz.DiffmMerge'inOSX'detamolarakayarlarınınnasılyapılacağınıöğrenmekiçinbulinktegöz atabilirsiniz. Windows'daiseyineücretsizbiruygulamaolanWinMergeveyaücretlibiruygulamaolanAraxisMerge'ikullanılabilir.Bu araçlarınGitayarlarınınnasılyapılacağınıyardımdokümanlarındanfaydalanaraköğrenebilirsiniz. BasitAnlamdaVersiyonKontrolüİşAkışı Git'inderinliklerinedalmadanöncegelinbasitbirversiyonkontrolişakışınaadımadımgözatalım. Versiyonkontrolününentemelbileşenirepositorydenilenyapıdır.Repository,dosyalarınızdakitümdeğişikliklerivebu değişikliklerileilgliilavebilgileri(değişikliğikim,nezamanyaptıvedeğişiklikileilgiligirilenaçıklamalar)ayrıbirerversiyon olarakkayıtaltındatutanbirvertabanıdır.Gittümbubilgilerigenellikledosyasistemindegizlibirklasörolarakoluşturulan .gitisimliklasöriçindebirdizidosyaolaraktutar. Yukarıdabahsettiğimizrepository'yikendibilgisayarınızdaoluşturmakiçinikiyöntemkullanabilirsiniz. Henüzversiyonkontrolüdeolmayanbirprojenizvarsa*gitinitkomutuileprojenizitümklasörvedosyalarıilebirlikte versiyonkontrolünealabilirsiniz ProjenizuzaktakiveyaşirketağınızdakibirGitsunucusundaversiyonkontrolüaltındatutuluyorsaprojeyikendi bilgisayarınızagitclonekomutuileindirebilirsiniz. Projeniziçinyukarıdakiyöntemlerdenbiriilerepositoryoluşturduktansonraaşağıdakibasitakışıkullanarakdeğişikliklerinizi yapmayabaşlayabilirsiniz 1. Projenizinrepositorysinioluşturduktansonradosyalarınızüzerindeistediğinizdeğişiklikleriistediğinizuygulamayı kullanarakyapabilirsiniz.Buaşamadayaptığınızdeğişiklikleriversiyonkontrolüiçinbirebirvedoğrudantakipetmenize gerekyoktur. 2. Yaptığınızdeğişiklikleristediğinizbirnoktayaulaştığındaveyabirözellikveyasorungidermedüzenlemesiileilgili çalışmanıztamamlandığındaversiyonkontrolübakışaçısıiledeğişikliklerinizideğerlendirmenizgerekir.Buaşamada değişikliklerinizicommitadıverilenbirbütünüolaraktarifetmelisiniz.Böyleceprojenizinyenibirversiyonunu oluşturmaişlemininilkadımınıtamamlamışolacaksınız. 3. Fakat,commitişlemiöncesindedosyalarınızdayaptığınızdeğişikliklerinbirözetinigörmekisteyebilirsiniz.gitstatus komutuilehangidosyalarıdeğiştirdiğinizi,sildiğiniziveyahangidosyalarıeklediğinizikolaycagörebilirsiniz. 4. Birsonrakiaşamadadeğişendosyalarınızdanhangilerinincommit'edahilolduğunubelirlemenizgerekiyor.Buadımda commit'edahiletmekistediğinizdosyalarıstagingareadenilenarabiralanaalırız. Dosyalarıniçeriğinindeğiştirilmişolması,silinmesiveyayenidosyaeklenmesibudosyalarınotomatikolarak stagingarea'yaeklenmesinisağlamaz.Buişlemiilgilidosyalarıseçereksizinyapmanızgerekir. 5. Dosyalarınızıstagingarea'yaeklediktensonraşimdicommitişleminehazırsınız.Commitişlemiiledosyalarınızdaki değişiklikleryenibirversiyonolarakGit'dekayıtaltınaalınır. 6. Zamanzaman,özellikledebirtakımçalışmasısözkonusuise,projenizdekideğişiklikleregözatmakisteyebilirsiniz. Projeniziçinoluşturduğunuzcommit'lerintarihçesiniincelemekiçingitlogkomutunukullanabilirsiniz. 7. Yaptığınızdeğişikliklerintakımıngerikalanıtarafındandagörülmesinivekullanılmayabaşlanmasınısağlamakiçin değişikliklerinizizamanzamanuzaktakirepositorydeyayınlamanızgerekir.Bununiçingitpushkomutunukullanırız. Local(Yerel)&Remote(Uzak)Repository'ler Localrepository,kendibilgisyarınızdaprojeklasörünüzünaltındabulunan.gitklasörüdür.Burepositoryüzerinde sadecesizçalışabilirsinizvedeğişiklikleryereldiskinizekaydedilir. Remoterepository'lerisegenellikleuzaktakibirsunucudayeralırlarvebusunucudaki.gitklasöründen ibarettirler.Takımçalışmasısözkonusuisetakımdakikişilerdeğişikliklerinibuuzaktakirepositoryüzerinden paylaşırlar. Localbirprojeoluşturmak Henüzversionkontrolüaltındaolmayanbirprojeniziversiyonkontrolüaltınaalmakiçingitinitkomutunukullanırız.Bu işlemigerçekleştirmekiçinMacOSX'deTerminaluygulamasınıWindows'daiseGitBash'iaçarakaşağıdakikomutları çalıştırmanızgerekir $cdproje/klasörünüzün/yolu/ $gitinit Buişlemdensonra ls-la komutuileprojeklasörünüzaltındakidosyalarılistelediğinizdeklasörüniçinde.gitisimligizlibirklasörünolduğunu göreceksiniz.gitinitkomutuileprojemiziçinboşbirrepositoryoluşturduk.Ancakprojeklasörümüzdedosyalarvebaşka klasörlerbulunmasınarağmenbudosyaveklasörlerinhiçbirihenüzGittarafındanversiyonkontrolüaltınaalınmadı. Workingcopy:ProjenizinanaklasörüneWorkingCopyveyaWorkingDirectoryismiverilir.Buklasördeprojenizde yeralandosyalarınveklasörlerinbirkopyasıbulunur.Versiyonkontrolsistemineprojenizinherhangibirversiyonunu WorkingCopy'nizekopyalamasınısöyleyebilirsiniz,ancakbirandaWorkingCopy'nizdeprojenizinsadecebir versiyonuyeralır. Versiyonkontrolüaltınaalmakistemediğimizdosyalar Tümgeliştirmeortamlarıveişletimsistemlerindekullandığımızaraçlartarafındanarabirürünolaraküretilenveaslında doğrudanversiyonkontrolüaltınaalmakistemediğimizdosyaveyaklasörlerolacaktır.ÖrneğinMacOSX'inotomatikolarak ürettiğigizliDS_StoreisimliklasörveyaC++derleyicileritarafındanüretilen.ouzantılıobjdosyalarıgibi.Hangidosyaların versiyonkontrolüaltındatutulacağınavehangileriningözardıedileceğineGitotomatikolarakkararvermez,bukararısizin vermenizgerekir. KullandığınızgeliştirmearaçlarınabağlıolarakhangidosyalarıngözardıedilebileceğiileilgiliGitHub'inyayınladığı derlemeyegözatabilirsiniz. Versiyonkontrolüaltınaalmakistemediğinizdosyaveklasörleritanımlamakiçinprojeklasörüneeklenen.gitignoredosyası kullanılır.Budosya'yagözardıetmekistediğinizdosyaveklasörlerintespitedilebilmesiiçindoğrudanisimlerveyabasit kurallarekleriz.ProjeleriniziversiyonkontrolüaltınaaldıktansonrailkişolarakGitHub'inyayınladığıderlemeyiveyakendi deneyiminizvebilginizilekararvereceğinizdosyaveklasörleri.gitignoredosyasınaekleyiniz.Projenizinilerleyen aşamalarındabuişlemiyapmanızbirazdahazahmetliolacaktır. Şimdigelin.gitignoredosyasındakurallarınasıltanımlayabileceğimizebirgözatalım *.[oa] .~ İlksatırdaoveyaauzantısıilebitendosyalarınversiyonkontrolüdışındatutulmasıiçinbirkuraltanımlıyoruz.İkincisatırda ise~karakteriilebiten(çoğumetindüzenlemeuygulamasıgeçicidosyaları~ilebitendosyalarolarakotomatikoluşturur) dosyalarınversiyonkontrolüharicindetutmasıiçinkuraltanımlıyoruz. .gitignoredosyasındatanımlamayaparkenaşağıdakikurallargeçerlidir Boşsatırlarveya#ilebaşlayansatırlardayaptığınıztanımlamalarGittarafındandikkatealınmaz. *,?,[],{},[!]ve\gibikarakterlerkullanılarakoluşturulanveglobbingpatternsadıverilentanımlayıcılarkullanabilirsiniz Klasörleribelirtmekiçin/karekterikullanılır.Örneğin/projemde/versiyon/kontrolü/istemedigim/bir/klasor/şeklinde birtanımyaptığımızdailgiliklasörvealtındakitümdosyalarGittarafındangözardıedilir. Tanımladığınızbirkuralıntersini!simgesiiletanımlarız.Örneğin!/projemin/kaynak/kodu/şeklindebirtanım yaptığımızdabuklasördışındakitümklasörvedosyalarGittarafındangözardıedilecektir. İlkcommitimiz Projemiziversiyonkontrolünealıpgözardıedilmesiniistediğimizklasörvedosyalarıdabelirlediktensonraaşağıdaki komutlarileilkcommitişlemimiziyapabiliriz $gitadd-A $gitcommit-m"İlkcommitişlemimiziyaptık" Bukomutlarınneişeyaradığınasonrakibölümlerdedeğineceğiz,şimdilik İlkkomutuntümprojedosyalarınınStagingArea'yaeklenmesiiçin, İkincikomutunisedosyalarımızınbiraçıklamailecommitedilmesiiçinkullanıldığınısöylemekileyetinelim. Yukarıdakiikikomut'uarkaarkayakullanmakyerineaynıişlemigitcommit-akomutuiledeyapabiliriz. Remotebirprojeoluşturmak VersiyonkontrolüGitileyapılanbirprojedeyeralıyorsanızremoterepository'lerinizinasılyöneteceğinizideöğrenmeniz gerekir.Remoterepository'leriprojeleriniziinternet'deveyasınırlıerişimeizinverilenşirketağındayeralanversiyonları olarakdüşünebilirsiniz. Diğerekipüyeleriilebirlikteverimliçalışabilmek,onlarınyaptığıdeğişikliklerikendiyerelçalışmaalanınızaalmak,kendi yaptığınızdeğişikliklerionlarilepaylaşabilmekiçinremoterepository'lerinizidoğruveetkinbirşekildeyönetmelisiniz. GitileversiyonkontrolüyapılanbirprojeyedahilolduğunuzdasizeverilecekilkbilgilerprojeninGitadresi(URL)veprojeye erişimiçinkullanacağınızkullanıcıadıveşifrenizdir.Uzaktakibirrepository'nin(URL)adresiaşağıdakiformatlardanbirinde olacaktır ssh://user@server/git-repo.git kullanıcıadı@sunucuadı:git-repo.git http://example.com/git-repo.git https://example.com/git-repo.git git://example.com/git-repo.git BuadresformatlarındanilkikitanesiSSH(SecureShell)protokolünekarşılıkgelir.http://vehttps://protokolleriisenormal interneterişimiiçindekullanılanprotokollerdir.Sonformatisegit'inkendiprotokolünekarşılıkgelir. Remoterepository'nizinadresiniveerişimiçingereklikullanıcıadınızıveşifreniziöğrendiktensonrayapmanızgerkentek şeybuadrestenprojenizindosyalarınıyereldiskinizeklonlmak.Bununiçinöncelikleyereldiskinizdeprojeniziindireceğiniz birklasöroluşturmanızveTerminal'denbuklasöregitemenizgerekiyor.SırasıylaaşağıdakikomutlarıTerminal'deyazınız YukarıdakiekrangörüntüsündeyeralanilkcdkomutuileprojeklasörümüniçindeyeralacağıanaklasörolanProjects klasörünekonumlanıyoruz.İkincikomutolanmkdirileprojeklasörümüzolangit101_kitapklasörünüoluşturuyoruz. Üçüncükomutumuziledeyenioluşturduğumuzgit101_kitapklasörünekonumlanıyoruz. Yereldiskimizdeboşprojeklasörümüzüoluştruduğumuzagöreşimdiremoterepository'miziyerelklasörümüzegitclone komutuileindirebiliriz. Kullanıcıadınızıveşifrenizivererekremoterepository'yiklonlamakiçinaşağıdakigitclonekomutunabubilgileri aşağıdakiformattavermenizgerekiyor gitclonehttps://kullanıcıadı:şifre@github.com/username/repository.git ProjemizÜzerindeÇalışmayaBaşlayalım Üzerindeçalışacağımızprojenindosyalarıartıkyereldiskimizdeyeraldığınagöreprojemizileilgilinormalçalışmamıza başlayabiliriz. Projeniziisterlocalbirprojeolarakoluşturmuşolunistersenizremotebirrepository'yiklonlamışoluntüm değişikliklerinizyereldiskinizdegerçekleşecekvecommitlerinizileoluşturacağınıztümversiyonlargittarafından yereldiskinizdeki.gitklasöründetakipedilecektir.İlerleyenbölümlerdeayrıntılıolarakelealacağımızgitpush komutunuçalıştırmadığınızsüreceyaptığınızdeğişikliklersadeceyereldiskinizdekayıtaltınaalınır. DosyaDurumları Git'dedosyalarınızgenelolarakikidurumdaolabilir Untracked(TakipEdilmeyen):Budosyalarversiyonkontrolüaltındaolmayanveyasizinhenüzversiyonkontrolü yapmakiçingit'eeklemediğinizdosyalardır.Budosyalardakideğişikliklersizdosyalarıgit'eeklemediğinizsürece versiyonkontrolünetabideğildir Tracked(TakipEdilen):Budosyalarisegit'inversiyonkontrolütakibialtındaolandosyalardır.Budosyalarüzerinde yapacağınıztümdeğişikliklergittarafındantakipedilmektedir. StagingArea Çoğuversiyonkontrolsistemindedeğişikliklerinizikiyerdekaydedilir Yereldiskinizdekiçalışmaklasörünüz(workingfolder)veya Versiyonkontrolsistemininveritabanı Ancakgit'dedeğişikliklerinizinkayıtaltınaalındığıüçüncübiralandahavardırkibunaStagingAreadenirvegit'inentemel kavramlarındanbirisidir.StagingArea'yı,projedosyalarımızdakibirdizideğişikliğiremoterepository'yegöndermedenönce kayıtaltındatuttuğunuzveritabanı/alanolaraktanımlayabiliriz. VersyonKontrolününAltınKuralları #1SadeceBirbiriİleAlakalıDeğişiklikleriCommitEdin Değişikliklerinizicommitetmeyekararverdiğinizdebirbiriilealakalıdeğişiklikleritekbircommitolarakelealmayaözen gösterin.Birbiriilealakalıolmayandeğişiklikleriaynıcommitileversiyonkontrolsistemindekayıtaltınaaldığınızda aşağıdakilerebenzersorunlaryaşamaihtimalinizartacaktır Commitinizdekideğişiklikleriinceleyenekiparkadaşlarınızyaptığınızdeğişikliklerdenhangisininhangikonuileilgili olduğunuanlamaktagüçülükçekeceklerdir. Alakalıalakasızdeğişikliklertekbircommitiçindeyeraldığıiçinherhangibirnedenlebelirlivetekbirdeğişikliği gerialmaktagüçülükçekeceksiniz. Alakalıalakasızdeğişiklikleritekbircommitileelealmakyerineörneğinikiayrısorunugidermekiçinyaptığınız değişikliklerikiayrıcommitilekayıtaltınaalınmalıveyadahabüyükbirözelliküzerindeçalışırkenbuözelliğioluşturan veanlamsalbirbütünolarakifadeedilendahaküçüközelliklerideayrıcommitlerilekayıtaltınaalmalısınız. Projenizüzerindeçalışırkenbelirlibirzamanaralığındayaptığınızdeğişikliklerintamamınınaynıkonuveyaözellikleilgili olmasımümkünolmayacaktır.TamdabunoktadaStagingAreamekanizmasınıngüzelliğiortayaçıkar,çünkügithangi değişikliğinizinStagingArea'yagideceğinekararvermeniziçinsizindevreyegirmeniziister.Dahaöncedebelirttiğimizgibi yaptığınızdeğişikliklergittarafındanotomatiktakipedilmez,bununyerinegittümdeğişikliklerisizingözdengeçirerek kontrollübirşekildeStagingArea'yaalmanızıister. YaptığınızDeğişiklikleriListelemek Soncommitişleminizdensonraprojedosyalarınızdayaptığınızdeğişikliklerilistelemekiçingitstatuskomutunu kullanabilirsiniz. Yukarıdakiterminalekrangörüntüsündedegörebileceğinizgibigitoldukçaayrıntılıdurumbilgisisunmaktadır.gitstatus komutuilegitaşağıdaki3anagruptayeralandosyalarısizelisteler Changestobecommitted(Commitedilmeyehazırdosyalar):Bugruptakidosyalargitaddveyagitrmkomutuile StagingArea'yaeklediğimizdosyalardır.Budosyalarbirsonrakicommit'imiziniçindeyeralacaktır Changesnotstagedforcommit(Commitiçinhenüzhazırolmayandosyalar):Bugruptakidosyalardeğişiklikyaptığımız fakathenüzStagingArea'yaeklemediğimzidosyalardır.Budosyalarbiröncekigrubuniçineeklemediğimizsürecebir sonrakicommit'edahilolmayacaklarıdır Utrackedfiles(Versiyontakbinideolmayandosyalar):Bugruptakidosyalarisehenüzversiyonkontrolüaltına almadığımızdosyalardır. "gitadd"ve"gitrm"komutları Biröncelkibaşlıktadeğindiğimizvegitstatuskomutusonrasındagit'inbizeözetlediği3gruptansonikisindeyeralan dosyalarınilkgrubadahiledilmesiiçingitaddvegitrmkomutlarınıkullanabiliriz. Aşağıdaoluşturduğumuzgitaddkomutuilebaslik_2.mdvebaslik_2_1.mddosyalarıileresimlerklasörüaştındakitüm dosyalarınStagingArea'yaeklenmesinisağlayabiliriz. $gitaddbaslik_2.mdbaslik_2_1.mdresimler/* Benzerşekildeaşağıdakigitrmkomutuileornek2.mddosyasınınbirsonrakicommitimiz'deyeralmayacağınıbelirtebiliriz. $gitrmornek2.md DeğişikliklerimiziCommitEdelim DeğişikliklerinizigitaddvegitrmileStagingArea'yaaldıktansonragitcommitkomutuileyenibirversiyonolarakkayıt altınaalabilirsiniz. $gitcommit-m"1.7numaralıaltbaşlıkiçeriğitamamlandı" Yukarıdakikomuttayeralan-mparametresiileyaptığınızdeğişiklikleriözetleyenbirmesajıdacommit'inizeekleyebilirsiniz. Eğerbirdenfazlasatırıolanbircommitmesajıgireceksiniz-mparametresinikaldırmanızyeterliolacaktır.Budurumda1.3 numaralıbölümdeayarladığınızeditöraçılırvebueditör'emesajınızıistediğimizuzunluktagirebilirsiniz. VersyonKontrolününAltınKuralları #2AnlamlıCommitMesajları Commitişlemisırasındayazacağınızbilgilendiricibirmesajhemekibinizdekidiğerkişilerinhemdedahasonra kendinzinyapılandeğişikliğidaharahatvehızlıanlamanızısağlayacaktır.Mesajınızakısabirözetsatırıyazdıktan sonrabirsonrakisatırdadadeğişikliğinnedeniveiçeriğihakkındabilgiverebilirsiniz. İyiBirCommitNasılOlmalı? 1. Commit'inizdesadecekavramsalolarakilişkilideğişiklikleriiçermeyeözengöstermelisiniz.Zamanzamanikifarklıkonu veyasorunileilgiliaynıandaveyaçokkısaaralıklarladeğişimliolarakçalışmakzorundakalabilirsiniz.Buşekilde yapılanbirçalışmasonrasındacommitzamanıgeldiğindemümküniseikikonuileilgilideğişikliklerinizibirdefada commitetmekyerineikidefadaayrıayrıcommitedin.Buçokzoroluyorsakısayoldanbirandatekbirdeğişikliğe odaklanmayıdadüşünebilirsiniz. 2. Tamamlanmamışdeğişikliklerinizikesinliklecommitetmemeyeözengösterin.Eğerzamanzamandeğişikliklerinizikayıt altınaalmakisytiyorsanızcommitişlemiyerineGit'inStashözelliğini/komutunukullanabilirsiniz. 3. Testedilmemişdeğişikliklericommitetmemeyeözengösterin.Buöneriaslındabiröncekiönerimizilepratikteaynı anlamageliyor 4. Commit'lerinizkısaveaçıklayıcımesajlariçermeli. 5. Sonolarakdasıksıkcommitişlemiyapmayıalışkanlıkhalinegetirmeniziönerebiliriz.Bualışkanlıkilebirlikte yukarıdakimaddelerideyerinegetirebilirsenizişyapmaşeklinizvekonsantrasyonunuzdaolumluyöndeetkilenecektir. CommitTarihçesi Gitprojenizüzerindeçalıştığınızherandayaptığınızcommitişlemlerinikayıtaltınaalmaktadır.Özellikleekipçalışmasısöz konusuisecommitişlemleriileilgiligittarafındankayıtaltınaalınanbubilgilerdahadaönemkazanmaktadır. Git'incommitlerinizileilgilikayıtaltınaaldığıtarihselbilgilerigörmekiçingitlogkomutunukullanıyoruz.BUkomuttüm commitlerileilgilibilgileri,ensoncommitenüstteolacakşekilde,tarihselolaraksıralar.EğerTerminalpencerenize sığımayacakkadarçoktarihselkayıtvarisesonsatırda:simgesiyeralacaktır,klavyenizdenSPACE/BOŞLUKtuşuna basarakbirsonrakisayfanınlistelenmesiniqtuşunabasarakdalistelemeninsonlandırılmasınısağlayabilirsiniz. Terminal'delistelenenhercommittarihçesikaydı,diğerbilgilerinyanısıra,aşağıdakitemelbilgileriiçerir Commit'inHashdeğeri Commit'igerçekleştirenkişininadıveemail'i Committarihi Commitmesajı CommitHash:Herbircommit'inbenzersizvetekbirtanımlayıcıdeğerivardır.Budeğergittarafındancommit'e dahilolantümdeğişikliklerinizvecommit'inkendisiileilgilibilgilerdekullanılarakotomatikhesaplanır.Genelolarak git'inlistelemelerindevebazıkomutlarınparametresiolarakbudeğerinilk7karakterininkullanılmasıyeterlidir.Çünkü builk7karakterindenerdeysebenzersizvetekilolduğunusöyleyebiliriz. gitlogkomutuilebirliktecommitişlemiileilgilibilgilendiriciçoğubilgiyigörmeklebirlikteparametreolarak-pdeğerini kullanırsanızdosyalardayapılandeğişikliklerdeayrıntılıolaraklsitelenecektir. Kitabımızınilerleyenbölümlerindegitlog-pkomutuilegördüğümüzbilgilerinasılyorumlayacağımızıayrıntılıolarakele alacağız. Branching(Dallanma)veMerging(Birleştirme) Bubölümümüzdeaşağıdakikonularıelealacağız BranchingÇalışmaŞekliniziDeğiştirebilir Branch'lerİleÇalışmak DeğişiklikleriniziGeçiciOlarakKaydetmek->GitStash BasitBirBranchingAkışı DeğişiklikleriMergeEtmek FarklıBranchingİşAkışları BranchingÇalışmaŞekliniziDeğiştirebilir Bazıaraçlarınsağladığıimkanlargünlükişyapmaşeklimiziçokderindenetkileyip,yaptığımızişedahafarklıbakabilmemizi sağlar.Git'inbranchingyaklaşımı(Türkçe'yedallanmaolarakdaçeviebiliriz)dabahsettiğimbudönüştürücüetkiyesahip araçlardanbirisidir.Branchingkonusundakihakimiyetimizinartmasıvesağlamlaşmasıilebirliktedahafarklıişyapmaya başlayıpdahaiyibireryazılımgeliştiriciolabilirsiniz. BranchingdenilenyöntemaslındaGitdışındakidiğerversiyonkontrolsistemlerindedeötedenberikullanılmaktaveyazılım geliştiricilerinhayatınıönemliderecedekolaylaştırmaktadır.Ancak,Git'dekibranchingyaklaşımıkullanımkolaylığıve yüksekperformansınedeniylekendindehasolduğunudasöylemeliyiz. Öyleysegelinşimdiyavaşyavaşbranching'in(dallanma)neolduğunuanlayalım. BirdenFazlaBağlamdaÇalışmak Dahaöncekibölüm'ünsonaltbaşlığında(gitcommit)zamanzamanbireyselolarakkısazamandilimlerindeaynıprojenin farklıözellikleriileilgilideğişiklikleryapılmasıgerekebileceğindenbahsetmiştik.Büyükprojelerdeisebudurumkişiselbir terciholmaktançıkıpişbölümü/uzmanlıkgibikriterlerebağlıolarakproje/ürünyönetimininönemlibirparçasıhalindeele alınır.Örneğin5kişilikbirekibinherbirüyesiaynıyazılımınfarklıözellikleriileilgiliçalışabilirveyaikifarklıkişiaynıözelliğin farklışekillerdenasılgeliştirilebileceğiileilgilideneyselçalışmayapıyorolabilirler.Bahsettiğimtümbualternatifsenaryolar aslındakendiyaşamdöngüleriolabilen,çoğuzamankısaveyauzunsürelieşzamanlıilerleyenfarklıbirerbağlamadenk gelir. Pratikteüzerindeçalıştığınızprojenin/yazılımınherzamansonstabildurumuyansıtananabirbağlamıveXnumaralıhata bildiriminindüzeltilmesi,yenibirYözelliğiüzeirndeyapılançalışmaveyadeneyselbirözellikileilgiliyapılançalışmagibi birdenfazlayanbağlamıolacaktır. Branchingolmasadaolurmu? Netolarakbirbirindenayrılmışfarklıbağlamlaroluşturmakiçinbranchingbenzeriaraçlarolmasaydıaşağıdakilerebenzer senaryolardanasıldavranacağımızkonusundasıkıntılaryaşayacaktık Örneğinmüşterinizveyayöneticinizikialtermatifsayfatasarımındanbirincisinideğildeikincisinibeğendivebuarada sizdesayfatasarımıdışındabirkaçtanebugfixvebirkaçtanededokümantasyondeğişikliğinifarklızamanlarda tamamladınız.Budurumdamüşterinizinbeğendiğiikincitasarımıdiğertümdüzenlemelerikaybetmedennasıldevreye alacaktınız? ÜzerindeçalıştığınızalışverişsitesiiçinözelolarakgeliştirdiğinizSepetmodülüyerine3.partibirmodülkullanılması kararıalındıvesizindekendimodülünüzüanayazılımdansökmenizistendi.Budurumdasökmenizgerekenmodül kodunutespitedipdiğermodüllerietkilemedennasılsökecektiniz? YenigeliştirdiğinizBeniHaberdarEtişleviyazılımınızıngerikalanözelliklerininbirçoğunundeğiştirilmesinesebep olmuşkenbirdenBeniHaberdarEtişlevininsaçmavegereksizolduğunakararverilseydibuişleviaradangeçen zamandayazılımınfarklıyerlerindeyapılandiğerdeğişikliklerdenizoleedereknasılçöpatacaktınız? Birdenfazlakonuileilgilideğişikliklerintamamınıtekbirbağlamileyönetmeyeçalışırsanızişlerhızlasarpasaracaktır.Bu karmaşanınönünegeçmekiçinherbirdeğişiklikiçinprojenizintamamınınfarklıklasörlerekopyalamayıdeneyebilirsiniz. Ancakbudurumda Buklasörlerversiyonkontrolündeolmadığıiçinekibingerikalanıileişbirliğiyapmanızçokzorlaşacak Farklıdeğişikliklerientegreetmekçokzorvehatayaaçıkbirişlemolacak Uzunlafınkısasıprojenizdekideğişiklikleriprofesyonelbiryaklaşımlaelealmakistiyorsanızfarklıbağlamlardaçalışmakve bubağlamlarıdüzgünyönetmekiçinbiryolbulmanızgerekiyor. Neysekibranchingvar Branchingbiröncekibölümdedeğindiğimiztümsorunlarınönünegeçmekiçinkullanabileceğimizbiraraçveyaklaşımdır. Branchingilefarklıbağlamlarıbirbirindekolaycaizoleederekherbirinikolaycaveayrıayrıyönetebilirsiniz. Görsel:AtlassianGitWorkflowssayfasındanalıntı Herhangibirandayaptığınızdeğişikliklersadeceaktifolaraküzerindeçalıştığınızbranch'e(dal)yansıyacakdiğerbranchler budeğişikliklerdenetkilenmeyecektir.Böyleceaynıandabirdenfazlabranchüzerindeözgürceçalışabilirsinizveen önemlisidebuçalışmalarınızdanbirkısmınınçöpedönmesindençekinmedendenemeleriniziyapabilirsiniz. VersyonKontrolününAltınKuralları #3Branch'leriBolBolKullanın Branchlergit'inengüçlüözelliklerindenbirisidir.Hızlıvekullanımıkolaybranchingmekanizmasıgit'intasarımındailk günündenitibarenciddibirgereksinimolarakelealınmıştır.Branch'lerfarklıbağlamlardaçalışmaktan kaynaklanabilecekkarmaşanınönünegeçmekiçinbiçilmişkaftandır.Branch'leribugfix'ler,yeniözelliklerüzerinde çalışmakveyadeneyselözelliklerigeliştirmekiçinbolbolkullanın Branch'lerİleÇalışmak Git'debranchkullanımıtercihebağlıdeğildir,aslındafarkındaolmasanızbileprojenizüzerindeçalışırkenherzamanaktif tekbirbranchüzerindeçalışırsınız.Git'deprojeniziilkoluşturduğunuzdaGitvarsayılanolaraksiziniçinmasteradıveilen birbrancholuştururvesizbubranchüzerindeçalışmayabaşlarsınız. Gelinşimdigitbranchkomutununbasitkullanımıileilgilibirkaçörnekgörelim. gitbranchdenemekomutunuçalıştırdığınızdagitsiziniçinprojenizdekidosyalarınoankihalinibarındırandenemeisimli birbrancholuşturur. Gitgitbranchkomutuileoluşturduğunuzyenibranch'iotomatikolarakaktifhalegetirmez. Branch'inizioluşturduktansonragitbranchkomutunuçalıştırdığınızdagitsizeprojeniziçinoluşturduğunuztümbranch'leri listelerveaktifolanbranch'ibaşınada*simgesiolacakşekildegösterir. gitstatuskomutunuçalıştırdığınızdadaaktifolanbranch"Onbranch...."ifadesiilegösterilir Branch'lerinizileilgilidahafazlaayrıntıgörmekiçinisegitbranchkomutunu-vparametresiileçalıştırabilirsiniz. Yenioluşturduğumuzbranchileçalışmayabaşlamadanöncegelinbirdefadahagitstatuskomutuileprojemizinne durumdaolduğunabakalım. Yukarıdakiekrangörüntüsündedegördüğümüzüzereaktifolanmasterbranch'imizdedosya2.mdisimlidosyamızdahenüz commitetmediğinizbirdeğişiklikvar.Budosyadakideğişikliğinyenieklediğimizbranch'deyeralmasınıistemediğimizive henüztamanlamıylabitirilmediğinivarsayalım.Budurumdadosyadakideğişikliğicommitmietmeliyizyoksatamamengöz ardımıetmeliyiz? VersyonKontrolününAltınKuralları #4YarımYamalakDeğişiklikleriAslaCommitetmeyin Tamanlamıylabitirmediğinizvetestetmediğinizbirdeğişikliğiaslacommitetmeyin.Üzerindeçalışacağınız değişiklikleriplanlarkenbudeğişikliklerimümkünolduğuncaküçükparçalarhalindeelealmayaözengösterirseniz yağtığınızdeğişikliklerikayıtaltınaalmakiçinhenüztamamlanmamışdeğişikliklericommitetmekzorundakalmazsınız. BunarağmenarasafhadakayıtaltınaalmakistediğinizdeğişiklikerolursaGit'inStashözelliğinikullanabilirsiniz. DeğişiklikleriniziGeçiciOlarakKaydetmek->GitStash Commitişlemiiledosyalarınızdayaptığınızdeğişikliklerkalıcıolarakrepository'dekayıtaltınaalınır.Ancakgünlük çalışmamızdabazentamolarakbitmeyendeğişiklikleridekayıtaltınaalmakisteyebiliriz.Örneğinbirdeğişikliküzerinde çalışırkenbaşkabirkonuileilgilikritikbirsorunbildirildiğindeyapmaktaolduğumuzişiyarımbırakıpyenisoruna odaklanmakzorundakalabilirsiniz. Bugibidurumlardayenisorunileilgilienmeyebaşlamakiçinöncekideğişikliklerinizikaybetmedenyenivetemizbirbranch oluşturmalısınız.Yarımkalandeğişikliklerikayıtaltınaalmakiçingitstashkomutunukullanmalısınız. gitstashileüzerindeçalıştığınızancakhenüzcommitetmediğinizdeğişiklikleringeçiciolarakGittarafındankayıtaltına alınmasınıveaktifbranch'inizinherhangibirdeğişikliğinolmadığıtemizbirdurumagetirilmesinisağlarsınız.gitstash komutunuçalıştırdıktansonratekrargitstatuskomutunuçalıştırırsanızöncekibölümüdecommitedilmemişbirdeğişiklik olarakgörünendosya2.mddosyasındakideğişiklikartıklistelenmezçünkümasterbranchimizgitstashsonrasıtemizbir durumageldi. gitstashlistkomutunukullanarakaktifbranch'inizdegeçiciolarakkayıtaltınaaldığınızdeğişikliklerinlistelenmesini sağlayabilirsiniz. Yukarıdagörünenlsitedeensonstashişlemiilegeçiciolarakkaydedilendeğişikliklerenüstteyeralır.Stash'deyeralanbir değişikliğigeriyüklemekistediğinizdeikiseçeneğinizvar gitstashpopkomutuileyukarıdakilisteninenüstündeyeralandeğişiklikgeriyüklenecekvebudeğişikliklisteden silinecek. gitstashapplykomutuileistediğinizdeğişikliğigeriyükleyebilirsiniz.Ancakbuişlemsonrasındayüklediğiniz değişikliklistedensilinmeyecek. Herhangibirdeğişikliğilistedensilmekiçingitstashdropkomutunukullanabilirsiniz. StashBaşkaHangiDurumlardaKullanılabilir? Stashişleminiüzerindeçalıştığımızaktifbranch'imizitemizbirdurumagetirmekiçinkullanabiliriz.Bunundışındaaşağıdaki durumlardadaGit'inStashözelliğinikullanabilirsiniz Farklıbirbranch'iaktifhalegetirmedenönce RemoteRepositorydeğişiklikleriniziyereldiskinizeindirmedenönce Branch'inizimergeetmedenönce BasitBirBranchingAkışı Gelinşimdihepbirliktegünlükçalışmanızsırasındakullanabileceğinizbasitbirbranchingakışınıelealalım.Çalışma senaryomuzunşöylegeliştiğinidüşünelim 1. Birwebsitesiüzerindeçalışmayabaşladınız 2. Busiteyeyenibirözellikeklemekiçinbirbrancholuşturdunuz 3. Buyenibranchüzerindendeğişiklikleriniziyapmayabaşladınız Busıradawebsitesindebirgüvenlikaçığıtespitedildiğinibildirenbiremailaldınız.Acilolarakbugüvenlikaçığını gidermeniziçinyapmaktaolduğunuzçalışmayıbırakmanızvebudurumudüzeltmenizgerekiyor.Böylebirdurumda aşağıdakiadımlarıtakipedebilirsiniz 1. Aktifbranch'iniziwebsitenizinsonstabilversiyonunbulunduğumasterbrancholarakdeğiştirdiniz gitcheckoutmasterkomutunukullandık 2. Güvenlikaçığınıgidermeçalışmanıziçinyenibirbrancholuşturdunuz. gitbranchloginsorunukoutunukullanarakbrancholuşturdukve gitcheckoutloginsorunukomutuilebubranch'iaktif>halegetirdik 3. Güvenlikaçığınıgiderecekdeğişikliğitamamladınız,testleriniziyaptınızvebudeğişikliğiStagingArea'yaekleyip sonrasındadacommitettiniz gitaddlogin.xyzlogin.htmllogin.cssiledeğişiklikleriStagingArea'yagönderdik gitcommit-m"Özelkarakteriçerenkullanıcıadlarındaortayaçıkangüvenliksorunugiderildi"ile değişikliklerimizicommitettik. 4. masterbranchimiziaktifhalegetirdik gitcheckoutmasterkomutuile 5. Commitettiğinizdeğişikliğiwebsitenizinstabilversiyonunuiçierenmasterbranchimizemergeettik. gitmergeloginsorunu 6. Dahaönceüstündeçalışmaktaolduğunuzyeniözellikileilgilideğişiklikleriiçerenbranch'iniziaktifhalegetirerek çalışmanızakaldığınızyerdendevamedebilirsiniz. gitcheckoutyeniozellik_xyzkomutuile Checkout,HEADveWorkingCopykavramları Git'debirbranchotomatikolarakobranchiçinyaptığınızsoncommitişleminebirişaretçitutarvehangidosyalarıno branch'eaitolduğunubilir.Herhangibirandabirprojeiçintekbirbranchaktifolabilir.Bubranch'eHEADdenirveWorking Copyiçindeki(WorkingCopy'yiprojenizinyereldiskinizdekidosyalarınıntamamıolarakdüşünebilirsiniz)dosyalaraktifolan branch'eyaniHEAD'eaittir.DiğerbranchlerinizdekidosyalardisikinizüzerindedeğilGit'inveritabanında(.gitklasörüiçin özelbirformatta)bulunur. Farklıbirbranch'iaktifhalegetirmekiçingitcheckoutkomutukullanılır.BudurumdaGitotomatikolaraksiziniçinikişey yapar 1. Aktifhalegetirdiğinizbranch'iHEADyaparve 2. Aktifhalegetirdiğinizbranch'eaitdosyalarıGitveritabanınızdanyereldiskinizekopyalarveöncekibranch'eait dosyalarıdiskinizdenkaldırır.YaniWorkingCopy'nizeyenibranch'eaitolandosyalarıkoyar. DeğişiklikleriMergeEtmek Projemizdeyaptığımızfarklıkonularvebağlamlardakideğişiklikleritakipetmekbiröncekibölümdeanlattığımızbasitiş akışıilegünlükçalışmamızdabizeciddikolaylıklarveesnekliklersunmaktadır.Ancakbranch'lerimizüzerinde değişikliklerimizitamamlayıpStagingveCommitişlermlerimiziyaptıktansonratümbudeğişiklikleriprojemizinstabil versiyonuolanmasterbranchilemergeetmemizgerekiyor(branch->[merge]->master).Mergingenbasitanlamda herhangibirbrach'deyaptığımızdeğişikliklerimasterbranch'imizilebirleştirmeveyamasterbranch'eentegreetme işlemidir. Birbranch'dekideğişikliklerinizisadecemasterbranchinizilemergeetmekzorundadeğilsiniz.KullandığınızGit çalışmapratiğinebağlıolarakherhangibirbranch'ibaşkabirbranch'emergeedebilirsiniz. Değişikliklerinizimasterbranchinizemergeetmekdurumlardansadecebirtanesidir,günlükçalışmanızsırasında karşılaşacağınızdiğerbirdurumiseüzerindeçalıştığınızbranch'emasterbranch'dekideğişikliklerinmergeedilmesidir (master->[merge]->branch).Budurumudoğurabilecekaşağıdakilerebenzerdurumlarilekarşılaşabilirsiniz Büyükbirekipteçalışıyorsunuzveekiparkadaşlarınızyaptıklarıdeğişikliklerisıksıkmasterbranch'emergeediyorlar. Budurumdasizdeuzunzamandırüzerindeçalıştığınızbranch'inmaster'dangerikalmamasıiçinmergeişlemiyapmak isteyebilirsiniz. Tekbaşınızaçalışıyorsunuzancakfarklızamanlardafarklısebeplerilemasterbranch'emergeettğinizbirçokdüzeltme yaptınız.Diğeryandandadahauzunsoluklubirçalışmanızıayrıbirbranchüzerindeyapıyorsunuz.Üzerinde çalıştığınızbranch'inmaster'dakideğişikliklerdengerikalmamasıiçinmergeişlemiyapmakisteyebilirsiniz. Commit'lerideğilbranch'lerientegreetmek!Git'dedeğişikliklerinizimergeetmeişlemisırasındakaynak branch'inizdetekilolarakhangideğişiklikleri(commit'ler)mergeetmekistedğinizitekersöylemezsiniz.Bununyerine Git'dedorğrudankaynakbranch'inizintamamınıhedefbranch'emergeedersiniz,çünkügithangideğişikliklerinhedef branch'debulunmadığınıotomatikolaraktespitedipsadecebunlarınentegreedilmesinisağlar.Kaynakbranch'deki değişikliklerherzamanHEAD'eyaniaktifbranch'inizhangisiiseonaentegreedilir. Git'demergeişlemiçokbasitikiadımdayapılır. 1. gitcheckoutkomutuiledeğişikliklerinaktarılacağıhedefbranch'iniziaktif(HEAD)halegetirirsiniz. 2. gitmergekomutuilekaynakbranch'dekicommitedilmişdeğişiklikleriHEAD'eentegreedilir Mergeişlemindensonragitlogkomutunuçalıştırdığınızdaisehangideğişikliklerimizin(commit)masterbranch'imize entegreedildiğini(merge)kolaycagörebilirsiniz. AncakGitmergeişleminiherzamanbukadarsadebirşekildeyapamaz,yaniGitherzamankaynakbranch'inizdeki commit'leriniziHEAD'esırasıylaentegreedemeyebilir.Budurumgenelliklehedefbranch'devekaynakbranch'de birbirindenbağımsızdeğişikliklerinyapılmasıdurumundagündemegelecektir.BudurumdaGit"mergecommit"adıverilen vehedehvekaynakbranch'dekiensoncommitilegerçekleşendeğişiklikleribirleştirenotomatikbircommitadımı eklediktensonramergeişleminigerçekleştirir. Görsel:Tower-LearnGitsayfasındanalıntıdır BazıdurumlardaGitbirdenfazlaotomatikmergecommitoluşturmakzorundakalabilir.Budurumdasizinhangi mergeconflictnoktasınıseçipişlemindevametmesiniistediğinizibelirtmenizgerekecektir(MergeConflict Resolution) BranchingİşAkışları Nasılkullanıldıklarınabağlıolarakbranch'leriikianagrupaltındatoplayabiliriz. Bugruplamasadeceanlamsalvekullanımpratikleriileilgilibirgruplandırmadır,sonuçitibariylebranchkavramıdaha öncekibölümlerdeanlattığımızkadarbasitbirGitaracıdır KısaVadeli/KonuBazlıBranch'ler Dahaöncekibölümlerdebranchkullanımınoktasındaelinizikorkakaalıştırmamanızileilgilitavsiyelerdebulunduk.Örneğin yeniözelliklerikodlarken,bugfixyaparkenveyadeneyselözelliklerileilgiliçalışırkenistediğinizşekildekolaycavehızlıbir şekildeüstelikdüşükmaliyetlibranch'leroluşturabilirsiniz.Butüramaçlariçinoluşturulanbranch'lerinikiortaközelliğivardır Bubranch'lertekkonuveyadeğişiklikiçinoluşturulur.Örneğinsizebildirilenbirhataiçinoluşturduğunuzbranch üzerinde"GitHubİleSistemeGiriş"benzeriyenibirözelliğikodlamayız Bubranch'lerüzerindekiçalışmanızgörecelikısasürmektedir.Çalışmamıztamamlandığındabubranch'lerimaster veyadahagenişkapsamdatarifedilenbirbranch'emergeedipsileriz UzunSolukluBranch'ler İkincitürdekibranch'lerisedahaüstseviyedeanlamtaşırlarveyeniözellikler,bugfixvedeneyselçalışmalargibi odaklanmışkonularyerineprojenizistabil,testvedevelopmentgibiaşamalarınıtemsilederler.Butürbranchlerprojeniz üzerindegeliştirmeyaptığınızsürecevarlıklarınısürdüreceklerdir.Tipikolarakbutürbranch'lerileilgiliaşağıdakikurallar geçerlidir Geneldebutüruzunsoluklubranchlerüzerindedoğrudandeğişiklikyapmazsınız.Çalışmalarınızıkısavadelibranchler üzerindeyaparakdeğişiklikleribubranch'lereentegreedersiniz. Uzunsoluklubranch'lerarasındabirhiyerarşivardır.Genelliklemasterbranchprojenizinstabilversiyonudurve hiyerarşikolarakbiraltındageliştirmelerinizientegreettğinizvedahaazstabilolabilendevelopmentbranch'iyeralır. Uzunsoluklubranch'lerinhangikriterleregöreoluşturulacağı,nasılyönetileceğiveisimlerininneolacağıgenellikleçalışan ekibeveprojeyegöredeğişebilir.Ancakherhalukardanasıbirbranch'ingstratejisininizleneceğineekipolarakfikirbirliği içindekararverilmelidir. BasitveFaydalıBranchingStratejileri Yukarıdadabelirttiğimizgibibranch'instratejileriekibeveprojeyegöredeğişebilir,ancakaşağıdaçoğuekiptarafından kullanılabilecekbasitbirişakışıkullanabilirsiniz Sadecebirtaneuzunsoluklubranchkullanın Dahaöncedebelirttiğimizgibibirdenfazlauzunsoluklubranchkullanabilirsinizancakçoğuzamanbutipbiryaklaşım karışıklıklaravefazladaneforsarfetmekgibizorluklarasebepolabilir.Tekbiruzunsoluklubranchkullanmanızdurumunda (geneldemasterismikullanılır)işinizönemlimiktardasadeleşipkolaylaşacaktır. Buyaklaşımileçalışmanızdurumundamasterbranch'inizprojenizistabilkodunubarındırmalıdır.Kodunuzunstabil olmasınıgarantilemekiçinmasterbranch'eentegreedilen(merge)tümdeğişikliklerintestler,kodokumavsgibi kalitekontrolyöntemleriiledenetlenmesigerekecektir.Bununbiryansımasıolarakdeğişikliklerindoğrudanmaster branchüzerindeyapılmamasıgibibirzorunlulukdadoğacaktır.Eğergitcheckoutmastervesonrasındagitcommit komutlarınıçalıştırıyorsanızbilinkistabilitekuralınıihlalediyorsunuz. KonuBazlıBranchler'iBolcaKullanabilirsiniz Projeniziçinyenibirözelliküzerindeçalışmakiçin,bugfixyapmakiçinveyadeneyselözellikleriveiyileştirmelerikodlamak içinayrıbirerbrancholuşturmaktanvebubranch'lerüzerindedeğişiklikleriniziyapmaktanimtinaetmeyin.Buyaklaşım nerdeysetümbranchingişakışlarındaçoksıkkullanılanvesizindealışkanlıkhalinegetirmenizgerekenbiryaklaşımdır. Sadecebirtaneuzunsolukluvestabilbranch'iniz(master)olduğuiçinkonubazlıbranchlerinizinhepsinibuanabranch'i bazalarakoluşturupdeğişiklierinizitamalayıpkalitekontrolsürecinizi(testler,kodokumavs)deişlettiktensonrabu değişiklikeritekraranabranch'inizolanmaster'aentegreetmeliziniz. Diğeryandansizkendikonubazlıbranch'inizdedeğişiklikleriyaparkenekiparkadaşlarınızdaaradakendideğişikliklerini masterbranch'eentegreediyorolacaklarıdır.Budurumdadakendibranch'inizimasterbranch'dekideğişikliklernedeniyle günceltutmakiçinmaster'dakideğişiklikleridekendikonubazlıbranch'inizesıkçaentegreetmelisiniz. Bubasitakıştaunutmamanızgerekentekbiraltınkuralvar;değişiklikerinizikalitekontrolsüreçleriniziişletmedenana branch'iniziolanveherzamanstabilolmasıgerekenmaster'aentegreetmeyinaksidurumdamasterbranch'inizin stabilitesinibozabilirsiniz. RemoteveYerelBranch'leriniziSenkronizeEdin Git'deremoteveyerelbranch'lerinizpratikolarakbirbirindentamamenbağımsızdırlar.Ancakgündelikçalışmanızsırasında kendibilgisayarınızdaoluşturduğunuzbranch'lerinuzaktakisunucudakieşleniğinindeolmasınısağlamalısınız. DeğişiklikleriniziSıkçaRemoteBranch'lereYükleyin(Push) Remotebranchlerileyerelbranchlerisadeceyapısalolarakdeğilyaptığınızdeğişiklikleranlamındadasenkronize etmelisiniz.Buşekildeekibinizingerikalanıdasizinyaptığınızgünceldeğişikliklerdenhaberdarolacakilaveolarakyerel branch'leriniziyedeğinialmışolacaksınız. DiğerBranchingStratejiler Bubölümdebahsettiğimizbasitstratejilerveişakışlarıgeneldeküçükveçevik(agile)takımlartarafındankullanıma uygundur.Dahabüyükprojelerdevefarklıtakımkurgularındadahasıkıkurallarvedahafarklıbranch'ingyaklaşımlarının kullanımınıgerektirebilir. Gitflow,ForkingvePullRequestadıverilenalternatifişakışlarıileilgiliaramayaparakfarklıyaklaşımlarıkendiniz inceleyebilirsiniz. RemoteRepository'ler Günlükçalışmamızsırasındastagingvecommitgibiversiyonkontrolüileilgiliişlemlerinçoğunuyereldiskimizdeyeralan localrepositoryüzerindeyaparız.Proje'deçalışantekkişisizisenizmuhtemelenInternet'deveyayerelağıdayeralan remotebirepositoryoluşturmanızadagerekolmayacaktır. Ancaktakımçalışmasısözkonusuolduğunda,takımdakigeliştiricilerinbirlikteçalışabilmesiiçinherkesindeğişikliklerini ortakbiralandayayınlamasıvediğerlerinindebuortakalanüzerindenbudeğişikliklerikendibranch'lerineentegreetmesi gerekecektir.BudurumdabaşvuracağınızenetkinaraçGit'dekiRemoteRepositoryişlevleridir.Remoterepository'lerien basitanlamdatümekibinerişimiolandosyalsunucusuolarakdüşünebilirsiniz. GelinşimdiLocalveRemoterepository'leribirbirindenayırantemelözellikleregözatalım Konum Localrepository'lergeliştiricilerinkendibilgisayarlarındayeralırkenRemoterepository'ler,çoğunluklainternetolmaküzere, ekiptekiherkesinerişebileceğibirsunucudayeralırlar. Özellikler Teknikolarakremoterepository'lerilelocalrepositorylerarasındabirfarkyoktur.Localrepository'leriçinöncekibölümlerde elealdığımızcommitişlemi,brancholuşturmagibiişlemlerintamamıremoterepository'leriçindeyapılabiliyor.Ancaktüm bubenzerliklererağmenremoterepository'leriçinWorkingCopy(aktifbranch'dekidosyalarındiskimizdekikopyaları)yapısı geçerlideğildir,remoterpository'lerdesadeceGit'inveritabanınıntutulduğu.gitklasörüyeralır. RepositoryOluşturma Localbirrepositoryancakikişekildeoluşturulabilir Boşbirrepositoryolaraksıfırdangitinitkomutuileoluşturabilirsinizveya Remotebirrepository'yigitclonekomutuileyereldiskinizdeindirebilirsiniz. Remoterepository'lerdeikiyöntemileoluşturulabilir Localrepository'nizigitclonekomutunu--bareparametresiilekullanarakremotebirrepoository'yeklonlayabilirsiniz veya Boşbirremoterepositoryoluşturmakiçingitinitkomutunuyine--bareparametresiilekullanabilirsiniz. Local/Remoteişakışı Git'deremoterepositoryişlemleriiçinazsayıdakomutvardır.Günlükçalışmamızsrasındabölümünbaşındadabelirttiğimiz gibiGitişlemlerimizinçoğulocalrepositorymizüzerindegerçekleşirveinternetveyaağbağlantısınaihtiyaçduymayız. Ancakremoterepositorykomutlarınıkullanabilmekiçininternetveyaağbağlantısınaihtiyaçvardır. BubölümümüzdeRemoteRespository'lerileilgiliaşağıdakikonularıelealarakayrıntılarıöğreneceğiz RemoteBirRepository'yeNasılBağlantıSağlanır RemoteRepository'dekiVerilerinİncelenmesi RemoteDeğişiklikleriEntegreEtmek LocalBirBranch'iYayınlamak(Publish) Branch'leriSilmek RemoteBirRepository'yeBağlantıSağlamak Remotebirrepository'yiyereldiskinizegitclonekomutuileindirdiğinizdeGitotomatikolarakbuişlemiyapmakiçin kullandığınızbağlantıbilgilerinihatırlar.Gitbubilgi'yivarsayılanolarakoriginadıverilenremotebirrepositoryolarakkayıt altınaalır.Localolanbirrespositoryiçiniseböylebirbilgitutulmaz.AncakbölümgirişindedeelealdığımızgibiLocalbir repository'yibazalarakyenibirremoterepositoryoluşturabiliriz.Bununiçingitclonekomutunukullanabiliriz.Örneğin Yukarıdakiekrangörüntüsündeilkkomutumuzolangitremoteaddilelocalrepository'mizileremoterepository'miz arasındakbağlantıyıkuruyoruz.İkincikomutumuzolangitremote-vilederemoterepositorymizileilgilibilgilerigörebiliriz. Dikkatettiysenizherbirremoterepositoryiçinbirifetchdiğeridepushişlemleriiçinkullanılanikiadresbulunur.fetch adresiniremoterepository'denyapılacakolanokumaişlemleri,pushadresinideremoterepository'yeyapılanyazma işlemleriiçinkullanılır.Genelolarakbuikiadresaynıolmaklabirlikteperformansvegüvenlikgibigerekçelerileikifarklı adresdekullanılabilir. Localbirrepository'niziistediğinizsayıdaremoterepositoryileilişkilendirebilirsiniz.Yukarıdakiekrançıktısında sadecebizimoluşturduğumuzgit101_ornekisimliremotelisteleniyor,birdenfazlaremoteilişkisiolsaydıhepsi listelenecekti. RemoteRepository'dekiVerilerinİncelenmesi gitclonekomuturemotebirrepository'yiyereldiskimizeindirdiktensonragitbranch-vakomutunuçalıştırdığımızda aşağıdakigörüntüdeyeralanbilgilerlistelenecektir. Dikkatedecekolursanızlocalrepository'lerimizhalayerindeduruyorancaklistemizdeilaveolarakorigin/HEADve origin/masterisimliikiremotekaydıvar.Pekiyidahaöncekibölümdegitaddgit101_ornekkomutuileoluşturduğumuz remoterepositorykayıtlarımıznedenlistlenmiyor?Bununnedeniöncekibölümdekullandığımızgitaddkomutuilelocalve remoterepositoryarasındasadecebirilişki/bağlantıtanımladık,aslındabukomutsonrasındalocalveremotearasında herhangibirveritrasferigerçekleşmez. RemoteRepositorybilgilerigüncelolmayabilir!Gitremoterepository'lerileilgiliyereldiskinizdebirtakımbilgileri içerir.AncakGitarakplandaotomatikolarakbubilgilerisiziniçinbelirliaralıklardagüncellemez!Buişlemin gerçekleşmesivesizindiğertakımarkadaşlarınızyaptığıdeğişikliklerdenhaberdarolabilmeniziçinGit'ebubilgileri güncellemesinisöylemenizgerekir. Git'inremoterepositoryileilgiliyereldiskinizdetuttuğubilgilerigüncellemesinisağlamakiçingitfetchkomutunu kullanmanızgerekir. FetchkomutuyereldiskinizdekibranchlerinizeveWorkingCopy'dekidosyalarınızıgüncellemezveyadeğiştirmez.Bu komutilesadecetakımarkadaşlarınızınremoterepository'deyayınladıklarıdeğişikliklereilişkinbilgileryereldiskinize indirilir.Dahasonrabudeğişikliklerdenhangilerinihangilocalbranch'eentegreedeceğinizekendinizkararverebilirsiniz. Buişlemdensonratekrargitbranch-vakomutunuçalıştırdığımızdagitornek_101/masterisimliremoterepositorymizdeki branchlereilişkinbilgileridegörebiliriz. Bilgilerinigüncellediğimizgit101_ornek/masterisimlibranch'dedeğişiklikleryapmakiçinönceliklebubranch'ibazalarak yenibirlocalbrancholuşturupdosyalarınWorkingCopyalanımızakopyalanmasınısağlamamızgerekiyor.Bununiçingit checkoutkomutunu--trackparametresiilekullnıyoruz. gitcheckout--trackkomutuileaşağıdakiişlemlergerçekleşir 1. Remotebranchileaynıisimdelocalbirbrancholuşturulur 2. Yenioluşturulanbranchaktifhalegetirilir 3. --trackingparametresinikullandığımıziçinyenioluşanlocalbranchileremotebrancharasında"trackingrelationship" adıverilenvelocalbranch'inhangiremotebranch'dekideğişiklikleritakipettiğinigösterenilişkikurulur TrackingRelationship(Takipİlişkisi):Git'dedahaöncekibölümlerdedebahsettiğimizgibibranchleraslında birbirindentamamenbağımsızdırvearalarındadoğrudanbirilişkiyoktur.Ancaktrackparametresiilelocalbir branch'inhangiremotebranch'dekideğişiklikleritakipedeceğinitanımlayabiliriz.BudurumdaGitikibranch'den herhangibirindeyeralanancakdiğerindeyeralmayancommit'leritespitederekbizibilgilendirecektir.Yani Localbranch'inizderemotebranch'eyayınlamadığınız(push)commit'lervarsabudurumdalocalbranch'inizin remotebranch'denönde(ahead)olduğu Takımarkadaşlarınızremotebranch'ebazıcommitleripushettiğindevesizdelocalbranch'inizi güncellemediğinizdurumdalocalbranch'iniziremotebranch'ingerisinde(behind)olduğubilgisiGittarafından "TrackingRelationship"tanımısayesindegitstatuskomutununçıktısıolarakgösterilir Localbranch'imizihazırladığımızagöregelinşimdibirkaçdeğişiklikyapalım.Budeğişiklikleriyaptıktansonraherzamanki gibiöncedeğişikliklerimiziStagingArea'yaalıyoruzvesonrasındadacommitişleminigerçekleştirereklocalrepository'de versyonkontrolüneilişkinişlemlerimizibitiriyoruz.Sonadımolarakdagitpushkomutuilelocaldekibudeğişikliklerimizi remotebranch'deyayınlıyoruz. gitpushpushkomutuaslındagitpushformatındadır.Ancaklocalbranch'imizioluştururkenkullandığımıztrack parametresisayesindekurulan"Takipİlişkisi"sayesindepushkomutununuzunhaliyerinesadehaliolangitpush formatındakullanabiliyoruz. RemoteDeğişiklikleriEntegreEtmek Takımarkadaşlarınızkendideğişikliklerinitamamlayıpremotebranch'deyayınladıktansonrasizdebudeğişiklikleri inceleyipkendilocalbranch'inizeentegreederekçalışmanızadevamedebilirsiniz.Ancakremotebranch'dekideğişiklikleri entegreetmedenöncebudeğişikliklereilişkinbilgileri(dosyalarıdeğilsadecedeğişiklikleredairGit'detutulanbilgiler) görmenizveincelemenizgerekir. Remotebranch'dekideğişiklikleridirmekiçingitfetchkomutunukullanıyoruz.Gitfetchkomutunageçilenorigindeğeriise dahaöncekibölümlerdegösterdiğimizremotes/origin/masterisimliremotebranchbağlantısınareferansvermekiçin kullanılır. origindeğerigitfetchkomutununbirparçasıdeğilsadecebirparametre.Originyerinedahaöncelocalbranchimiz ilebağlantısını/ilişkisinikurduğumuzherhangibirremotebranch'igösterenbirdeğerolabilir. gitfetchkomutuileremotebranch'dekideğişiklikleriindirdiktensonraisegitlogkomutunukullanarakburemote branch'dekideğişikliklerileilgilibilgilerigörebiliriz.(değişikliktarihi,kiminyaptığı,değişendosyalarvecommtisırasında girilenmesajgibi) Değişiklikleriincelediktensonrabunlarılocalbranch'inizeentegreetmeyekararverdiğimizdeisegitpullkomutunu kullanmamızgerekecek Remotebranchdekideğişikliklerinbilgileriniindirmekiçinkullanılanfetch(türkçeanlamıgetirmek)vebudeğişiklikleri entegreetmekiçinkullanılanpull(türkçeanlamıçekmek)ifadelerininbirbirineyakınanlamlarıolduğuiçin karıştırabilirsiniz.Bukarışıklığınönünegeçmekiçinyapacağınızengüzelşeygitpullkomutunuhiçkullanmamak olacaktır.AyrıntılariçinİngilizcebirblogpostolanGit:fetchandmerge,don'tpullinceleyebilirsiniz. Gitpullkomutuaslındaarkaarkayaikişeyyapmanızısağlar Remotebranch'dekideğişikliklerileilgilibilgileriindirmek,yanigitfetch Remotebranch'dekideğişikliklerilocalbranch'inizeentegreetmekyanigitmerge İlerleyenbölümlerdeçakışmalarıntespitedilmesi,çözülmesivedeğişikliklerinentegreedilmesikonularınıayrıntılıolarakele alacağızşimdiliksadeceişakışımızıözetleyipbukonuyuburadasonlandıralım.Akışımızözetleşöyleolacak gitfetch:remote'dangüncellemebilgileriniindir gitdiff:remotevelocalarasındakifarklarıincele gitmerge:değişiklikleriotomatikmergeetçakışmavarsabirsonrakiadımageçin Çakışmaolandosyalarınızıaçınveçakışmalarıdüzeltin gitadd:çakışmanıngiderildivedeğişiiklikStagingArea'yaalındı LocalBirBranch'iYayınlamak(Publish) KendibilgisayarınızdaoluşturduğunuzLocalbirbranchsizyayınlamayakararvermediğinizsürecesadecesizin bilgisayarınızdayeralacaktır.Yanilocalbazıbranchlerinizisadecekendibilgisayarınızdatutarkenistediklerinizidetakım arkadaşlarınızvehattatümdünyailepaylaşabilirsiniz. Gelinşimdisuperyeniozellikisimlilocalbranch'iremoterepositorymizdepaylaşalım. Öncegitcheckoutkomutuilebranch'imiziaktifhalegetiriyoruzvesonragitpushkomutuve-useçeneğiilelocal branch'imiziremoterepository'mizdeyayınlıyoruz.Pushkomutuiçinverdiğimizoriginvesuperyeniozellikdeğerleriile HEADbranch'imizioriginremoterepository'desuperyeniozellikisimlibrancholarakyayınlanmasınıistediğimizi tanımlıyoruz.-useçeneğiiselocalbranchimizileremotebranchimizarasında,öncekibölümlerdedebahsettiğimiz,Takip İlişkisi(TrackingRelationship)kurulmasınısağlar. gitbranchkomutunu-vvaseçeneğiileçalıştırdığınızdakurulmuşTakipİlişkisibilgilerinidegörebilirsiniz. Localbranch'iremoterepository'deyayınladıktansonralocalbranch'deyaptığımızdeğişikliklerigitpushkomutunu parametresizkullanarakremotebranch'imizdeyayınlayabiliriz. Artıkremoterepository'yeerişimyetkisiolanherkessuperyeniozellikisimlibubranchinizigörebilirvebubranch'ibaz alarakkendideğişiklikleriüzerindeçalışmayapabilir. Branch'leriSilmek Biröncekibölümdeoluşturduğumuzsuperyeniozellikisimlibranchüzerindekiçalışmamızıtamamlayıpkalitekontrol sürecimizideişlettiktensonrabudeğişikliklerimasterbranch'imizeentegreettiğimizivarsaylım.Buentegrasyon sonrasındasuperyeniozellikisimlibranch'eihtiyacımızyokveartıkbubranch'isilebiliriz.Bubranch'ikendi bilgisayarımızdansilmekiçingitbranch-dsuperyeniozellikkomutunu,remoterepository'densilmekiçindegitbranchdrsuperyeniozellikkomutunukullanabiliriz. Silmekistediğinizlocalbranchaktifisegitbranch-dkomutuhataverecektir.Silmeişlemiöncesindesileceğinizlocal branch'denfarklıbirbranch'igitcheckoutkomutuileaktifhalegetirmeyiunutmayın. Remotebranch'igitbranch-drkomutuilesildiğinizhalderemoterepository'yeerişipbranchlerikontrolederseniz superyeniozellikisimlibranch'insunucudahaladurduğunuzgöreceksiniz.Bununnedenigitbranch-drkomutundaki seçeneklerdenrseçeneğininsuncudakibranch'ideğilyerelbilgisayarınızdaremotebranchbilgilerinisiler.Budeğişikliğin suncudadageçerliolmasıiçinyanisunucudakibranch'idesilmekiçingitpushorigin:superyeniozellikkomutuile değişikliğibiranlamdaremoterepositry'deyayınlamanızgerekiyor. Dahaayrıntılıbilgiiçinbakınız(StackOverflow-İngilizce) İleriSeviyeKomutlarveİşlemler Bubölümdeaşağıdakiileriseviyeişlemleriveilişkilikomutlarıelealacağız DeğişiklikleriniziGeriAlmak VersiyonlarArasındakiFarklarıİncelemek ÇakışmalarıGidermek MergeAlternatifiOlarakRebaseKullanımı DeğişiklikleriniziGeriAlmak Git'inengüzelyanlarındanbirideyaptığınızherhangibirdeğişikliğikolaycagerialabilmemızıağlamasıdır. SonCommitBilgileriniDüzeltmek Commitişlemlerinizinekadardikkatliyaparsanızyapınbazencommit'edahiletmeyiunuttuğunuzveyayanlışlıkladahil ettiğinizdosyalarolabilirveyacommitmesajındaeksikbilgivermişolabilirsiniz.Budurumdasoncommitişleminiziyeniden yapmakiçingitcommitkomutunu--amendseçeneğiilekullanabilirsiniz.Sadececommitmesajınızıdeğiştirmek istiyorsanız--amend-mseçenekleriilegitcommitkomutunuçalıştırabilirsiniz,eğersoncommit'edosyaeklemekveya dosyaçıkarmakistersenizcommitkomutundanönceöncekibölümlerdedebahsettiğimizgitaddvegitrmkomutlarıile önceStagingişleminiyapabilirsiniz. VersyonKontrolününAltınKuralları #5AslaYayınlanmışCommitleriniziDüzeltipTekrarYayınlamayın gitcommitkomutunun--amendseçeneğicommithatalarımızıhızlıcavekolaycadüzeltebilmemiziçinoldukçafaydalı birseçenektir.Ancakbuseçeneğikullanmadanönceaşağıdakinoktalarıdikkatealmalısınız Buseçeneksadecesoncommitişlemimizidüzeltmemizisağlar,öncekicommitlerimizibuseçenekile düzeltemeyiz. Buseçenekilecommitişlemisonrasındabiröncekicommitişleminedairbilgilersilinir.Projeüzerindeçalışantek kişiisenizbuseçeneğikullanmanızsorunyaratmayacaktırancakbirtakımiçindeyeralıyorsanızdiğertakım arkadaşlarınızsonradan--amendiledüzeltttiğinizhatalıcommitişleminizibazalarakkendileridedeğişiklikler yapmışolabilirler.Budurumtakımarkadaşlarınıziçinsorunoluşturacaktır,çünküonlarınbazaldıklarıcommitile ilgiliGit'deartıkherhangibirkayıtyeralmaycak. LocalDeğişiklikleriGeriAlmak HenüzcommitetmediğimizdeğişiklikliklereLocaldeğişiklikdenir.Bazenöncekihalindendahakötüolankodyazabilirsiniz vebudeğişikliğigerialmakisteyebilirsiniz.Bugibidurumlardadeğiştirdiğinizhalindenmemnunolmadığınızdosyadaki değişikliklerigerialıpdosyanınsoncommitedilmişhalinegeridönmekistediğinizde,öncekibölümlerdedesıkca kullandığımız,fitcheckoutkomutunu--seçeneğiileçalıştırmanızyeterliolacaktır. $gitcheckout--dosya1.mdveya $gitcheckout--klasor/dosya2.mdşeklindekullanabilirsiniz. Tümdosyalardayaptığınızdeğişikliklerigerialmakistiyorsanızgitresetkomutunu--hardseçeneğiilekullanabilirsiniz $gitreset--hardHEAD BukomutileGittümdosyalarınsoncommitedilendeğişiklikleriiçerenHEADversiyonundakihallerininWorkingCopy'nize geriyükler. gitcheckout--vegitreset--hardkomutlarısonrasındakayıtaltınaalınmamışolantümdeğişikliklergeridönüşü olmayacakşekildeyokolur.Bunedenlebukomutlarıçalıştırırkendikkatliolmalısınızveikidefadüşünmelisiniz. CommitEdilenBirDeğişikliğiGeriAlmak Hatalıbirdüzenlemeyaptığınızda(kibugeneldetestedilmedenyapılancommit'lersonrasındaoluşanbirdurumdur)veya geliştirdiğinizbirözelliğinartıkgerekliolmadığınakararverildiğindeyaptığınızdeğişikliğigerialmanızgerekecektir. gitrevertkomutucommitettiğinizherhangibirdeğişikliğigerialmakiçinkullanılır.Bukomutilecommitişleminizinkendisi veyabilgilerisilinmezsadececommitişleminizdekideğişiklikgerialınır.Örneğineklediğinizbirsatırıkaldırmakistersenizgit revertkomutuilebunuyapabilirsiniz.Aslındagitrevertkomutudeğişkliğinizigerialmakiçinotomatikolarakyenibircommit oluştururvegerialmaişlemibucommitsayesindedeğişikliktarihçesindegörünürhalegelir. Yukarıdakiekrangörüntüsündeilköncegitrevertkomutunuçalıştırdık.Bukomutunenönemliparametresigerialmak istediğimizcommit'inhashdeğeri(hash'inilkaltıkarakterinikullanabiliriz).Komutuçalıştırdıktansonradeğişikliktarihçesini incelediğimizdegit'inotomatikolarakbircommitoluşturduğunuvebucommit'inbilgilerindehangideğişikliğingerialındığına dairayrıntılarınyeraldığınıgörüyoruz. Değişikliklerigerialmakiçinkullanabileceğimizdiğerbirkomuisegitresetkomutun.Bukomutdaherhangibirbilginizi silmedenişlemigerçekleştirir,ancahgitrevertkomutundanfarklıolarakotomatikyenibircommitüretmedendeğişikliğinizi gerialmanızısağlar. Bukomutiçindegitrevertkomutundaolduğugibigerialmakistediğimizcommit'inhashdeğeriniveriyoruz.Kullandığımız diğerbirseçenekolan--hardseçeneğiiselocaltümcommitlerinizisilerekgerialmaişlemininyapılmasınanedenolur,bu nedenle--hardseçeneğinikulllanırkendikkatliolmalısınız.Localcommit'lerinizinkorunmasınıistiyorsanız--keepkomutunu kullanabilirsiniz. 30güniadegarantisi!gitresetkomutuilegerialmaişlemisonrasındagerialdığınıznoktadansonrakitüm değişikliklertarihçedensilinecektir.Ancakgitbusilinenbilgileri30günkadarveritabanındatutmayadevamedecektir. Eğeryanlışlıklagerialmaişlemiyaptığınızıfarkederseniz30güniçindesilinenherhangibircommit'inizigeri alabilirsiniz. 30günlüksürenasıldeğiştirilebiliri Silinencommithangikomutlarilegerialınır VersiyonlarArasındakiFarklarıİncelemek Dahaöncekibölümlerdebolcakullandığımızgitstatusvegitlogkomutlarıyaptığınızdeğişikliklerileilgiliönemlibilgiler sunar.Ancakbuikikomutilesadecedeğişikliklerimizingenelbilgilerinigörebiliriz,dosyalarımızdayaptığımızdeğişikliklerin ayrıntılarınıbukomutlarilegöremeyiz.Git'debuikikomutdışındadeğişikliklerivefarklarıincelemekiçinfarklıkomutlarda yeralır. İkiversiyonarasındakifarklarıyorumlamak Versiyonkontrolsistemlerindeikiversiyonarasındakideğişikliklereİngilizcedifference(fark)kelimesininkısaltmasıolandiff denir.Git'deikiversiyonarasındakifarklarıgörmekiçingitdiffkomutunukullanabilirsiniz.Örneğingitdiff374c6f..5d903e dosya1.mdkomutuiledosya1.mddosyasının374c6fve5d903ehash'licommmitlerdekiikiversiyonunundiff'inialıyoruz. gitdiffkomutunuçalıştırdığımızdayukarıdakigibibirekranilekarşılaşacaksınız.Gelinşimdibuekranda numaralandırdığımızönemlialanlardahangibilgilerinbizegösterildiğinielealalım 1. KarşılaştırılanDosyalar(A/B):Diffkomutuikidosyayıbirbiriilekarşılaştırır,AdosyasıveBdosyası.BuAveB dosyalarıgeneldeaynıdosyanın(bizimörneğimizdedosya1.md)farklıversiyonlarıdır.Çoksıkolmasadadiffişlemiile tamamenfarklıolandosyaları(örneğindosya1.mdvedosya1_enyeni.md)dakarşılaştırabilirsiniz.Hangidosyaların karşılaştırıldığınıaçıkçabelirtmekiçindiffkomutununçıktısıherzamanhangidosyanınAhangidosyanındaB olduğunubelirterekbaşlar. Bubilgininhemenaltındaindexilebaşlayansatırdapratikolarakpekişinizeyaramayacakdosyabilgileriyer alır.Bubilgilerdenilkikisikarçılaştırılanversiyonlarınhashdeğerisonuncusuda(1000644)dosyamodu bilgisidir. 2. A/BDosyaSimgeleri:DosyaiçeriğininhangikısmınınAhangikısmınındaBdosyasınaaitolduğunubelirtmekiçin kullanılan-ve+sembollerindenhangisininhangidosyayaaitolduğubilgisi. 3. Farkİşaretçileri:Diffkomutuilesadeceikidosya(aslındaversiyondadenilebilir)arasındakifarklarınolduğusatırlar gösterilir,dosyanıntamamı(değişmeyensatırlardadahil)gösterilmez.@@simgeleriilebaşlayansatırdaAveB dosyalarıarasındakifarklısatırlarınhangisatırdanbaşlayıpkaçsatırolduğubilgisigösterilir.Bizimekran görüntümüzdeyeralan@@-1,4+1,2@@bilgisibizeşunusöyler (-)simgesiiletanımlananAdosyasından1.satırdanbaşlayarak4satır,+simgesiiletanımlananBdosyasından 1.satırdanbaşlayarak2satırbirbirindenfarklı 4. DeğişiklikleriOkumak:Değişenhersatırınbaşında(-)veya(+)simgesiyeralır.BusimgelerileAveB versiyonlarınıniçeriğininneolduğunuanlamamızdabizeyardımcıolacaktır.Örnekekrangörüntüsünde(-)ilebaşlayan veAversiyondakisatırlarındahasonra(+)ilebaşlayanBversiyonundakisatırlariledeğiştirildiğinigörüyoruz. LocalBranch'dekifarklarıincelemek DahaöncekibölümlerdegitstatuskomutuileLocalbranch'imizdehangidosyalarındeğiştiğinigörebileceğimizi örğrenmiştik.gitstatuskomutuiledosyalarıniçeriğindekideğişikliklerigöremeyiz.İçerikdeğişikliklerinidegörmekiçin doğrudangitdiffkomutunuherhangibirparametreveyaseçenekbelirtedenkullanabilirsiniz. SadeceStagingArea'yacommitedilmeküzereeklenmiş/çıkarılmışdosyalardakideğişikliklergörmekistersenizgitdiff-stagedkomutunukullanabilirsiniz. Commitedilmişdosyalardakifarklarıgörmek gitlogkomutunucommitişlemleriileilgiliözetbilgilerigörmekiçinkullanabiliriz.Bukomutuherhangibirparametreveya seçenekbelirtmedenkullanırsanızdosyaiçeriğindekifarklarıgöremezsiniz.Dosyalarıniçeriğindekifarklarıdagörmekiçin gitlogkomutunu-pseçeneğiilekullanabilirsiniz. $gitlog-pşeklinde İkiFarklıBranch'iKarşılaştırmak İkifarklıbranch'inarasındakiiçerikfarklarınıgörmekiçingitdiffkomutunakarşılaştırmakistediğinizbranchisimlerini paremetreolarakverebilirsiniz.Örneğinmasterilesuperyeniozellikbranch'inikarşılaştırmakiçingitdiffkomutuaşağıdaki gibioalcaktır $gitdiffmaster..superyeniozellik Branch'lerikarşılaştırabildiğinizgibiikifarklıversiyonarasındakitümdosyalarıniçeriğinideversiyonlarınhashdeğerlerini gitdiffkomutunaparametreolarakvererekkarşılaştırabiliriz.Örneğin $gitdiff74c6f..5d903e komutuile74c6fhashdeğeriolancommit(versiyon)ile5d903ehashdeğerinesahipcommit'indosyalarıarasındakifarkları görebilirsiniz. ÇakışmalarıGidermek Versiyonkontrolüileilgiliinsanlarınensevmediklerivekorktuklarışeydeğişikliklerientegreetme(merge)işlemisırasında oluşançakışmalarvebuçakışmalarınçözülmesisürecidir.Bubölümdeçakışmalardankorkmamamızgerektiğiniev çakışmalarıenkolayveefektifbirşekildenasılçözebileceğimizielealacağız. Gitilegüvendesiniz Gitileçalışıyorsanızistediğinizzamanyanlışyaptığınızdeğişiklikentegreetmeişleminigerialarakbuişlemetemiz dosyalarileyenidenbaşlayabilirsiniz.BukonudaGit'egüvenmenizyeterliolacaktır.MergeişlemisırasındaişinçoğunuGit sizinyerinizeotomatikolarakyapacakvesizesadecebasitçakışmalarıçözmekkalacaktır.Git'indiğerbirgüzeltarafıise çakışmalarınsadecekendilocalbranch'inizdeolmasıvehiçbirzamansunucutarafındaolamamasıdır.Böylecemerge işlemisırasındameydanagelençakışmadatakımarkadaşlarınızetkilenmeyecektir. ÇakışmaNasılOluşur? Git'demergeişlemibşakabirbranch'dekideğişiklikleriüzerindeçalıştığınızkendibranch'inizeentegreetmeişlemidir.Git mergeişlemisırasındadeğişikliklerinçoğunusiziniçinotomatikolarakentegreeder. AncakbazıdurumlardaGitmergeişleminiotomatikolarakgerçekleştiremezvesizinmüdahaleederekhangideğişikliğin nasılentegreedileceğinekararvermenizgerekir.Budurumgenellikleaynıdosyaüzerindedeğişiklikleryapıldığındaortaya çıkar,budurumdabileGitdosyadakideğişikliklerinasılentegreedileceğineçoğuzamanotomatikkararverebilir.Fakataynı satırdayapılandeğişikliklerveyatakımdakibirkişininbirsatırısilmesidurumundasizinbudeğişikliğikendibranch'inize nasılentegreedileceğinekararvermenizgerekir.BudurumdaGitdosyanızıconflicted(çakışmalı)olarakişaretlervesizin çalışmanızadevamedebilmeniziçinbuçakışmayıçözmenizgerekir. ÇakışmalarıNasılÇözeriz Çakışmaoluştuğundailkyapmanızgerekenşeyçakışmanınnedenolduğunuanlamakolmalıdır.Örneğintakımarkadaşınız aynıdosyadasizindedeğiştirdiğinizbirsatırımıdeğiştirdiveyaaynıdısyadabirsatırmısildiveyasizinleaynıisimliyenibir dosyamıoluşturdu? gitstatuskomutunuçalıştırdığınızdaGitsizebranch'inizdeentegreedilmemişdosyalarolduğunusöyleyecektir. Yukarıdakiekrangörüntüsündedosya1.mdisimlidosyamızdaçakışmaolduğunugörebiliriz.Buçakışmayıdüzeltmekiçin dosyamızıaçıpçakışansatırlarıdüzeltmemizgerekiyor. dosya1.mddosyasınıaçtığımızdayukarıdakinebenzerbirgörüntüilekarşılaşıyoruz. <<<<<<<<<HEADilebaşlayanve============kadardevamedenkısımdosyanınbizimbranch'imizdeolan versiyonunaait ================belirtecindensonrakikısımdadeğişikliklerientegreetmekistediğinizbranch'deyeralan dosyanıniçeriğinigösterir. $gitmergetooldosya1.mdkomutunuçalıştıraraköncekibölümlerdekonfigürasyonayarlarınıyaptığımızDiffMerge uygulamasınıdaaçabilirsiniz. Dosyamızıniçeriğininneolacağınakararveripkaydettiktensonranormalbircommitişlemiileçakışmayıçözmeişlemini tamamlıyoruz. $gitadddosya1.mdiledosyamızıStagingArea'yaekliyoruz $gitcommit-m"değişikliklerentegreedildi"komutuiledecommitişleminitamamlarız. MergeİşleminiNasılGeriAlabiliriz? Dosyanızınmergeişleminebaşlamadanöncekihalineistediğinizzamangeridönebilirsiniz.Bununiçinyapmanızgereken tekşeygitmerge--abortkomutunuçalıştırmak. MergeAlternatifiOlarakRebaseKullanımı Mergekomutuikibrancharasındakideğişikliklerientegreetmeninenkolayyoluolmaklabirliktetekyoldeğildir.Rebase komutudaikibranch'ıentegreetmekiçinkullanılanmergekomutunaalternatifbirkomuttur.Budurumdakafanızda"Neden mergeyerinerebasekullanmakisteyelim?"şeklindebirsoruoluşabilir.Busorununcevabınıbulmakiçinöncegelinmerge komutununbirazdahaiyianlamayaçalışalım. Mergekomutunadahayakınbirbakış Gitmergeişleminigerçekleştirmedenönceaşağıdakiüçcommit'itespiteder İkibranch'inortakcommit'i:İkibranch'indetarihçesinidahayakındanincelediğinizdebubranch'lerinzamanınbir noktasındaortakbircommit'esahipolduklarınıgörürüz.Buandaherikibranch'indeiçeriğibirerbiraynıdır. Branch'lerinsoncommit'leri:Herikibranchiçindeyapılansoncommit'ler BuüçcommittespitedildiktensonraGitbuüçcommit'ibirleştirerekentegrasyonuyapabilir. Fast-ForwardveMergeCommit Basitbazıdurumlardabranch'lerdenbirtanesindeherhangibirdeğişiklikyapılmamıştırvebubranch'inyukarıdakibölümde belirttiğimizortakcommit'ivesoncommit'iaynıdır.Budurumdamergeişlemiçokbasitleşirvegitdiğerbranch'intüm commit'leriniortakcommit'inüzerineekleyerekmergeişleminiyapar.BuözeldurumaGitterminolojisinde"Fast-Forward Merge"denirveherikibranch'intarihçesideortaktır. Fakatçoğuzamanherikibranch'debirbirindenbağımsızolarakdeğişikliğeuğrarvetarihçeaçısındanbirbirinden uzaklaşırlar.BudurumdamergeişleminiyapmakiçinGit'inherikibrancharasındakideğişiklikleriiçerenotomatikbir commitoluşturmasıgerekir.Oluşturulanbucommit'eGitterminolojisinde"MergeCommit"denir. NormalCommitleriveMergeCommitleriAyırdetmek Normalcommit'leriyazılımgeliştiricilerinceeleyipsıkdokuyarakoluşturulurlar,diğeryandanMergeCommitleriseGit tarafındanotomatikoluşturulurlar.Mergeişlemiileilgiliayrıntılarıdahasonradanincelemekistersenizherikibranch'in committarihçesinevecommitçizelgesinebakmanızgerekir. Rebaseiledeğişikliklerientegreetmek Bazıtakımlarikibranch'iyukarıdaanlattığımızotomatikmergecommit'leryerinerebaseileentegreetmeyitercihedebilir. Rebasesonrasındaprojenizinikifarklıbranch'iolduğunadairherhangibbirtarihselizoluşmaz. Gelinşimdirebaseişlemininnasılyapıldığınabakalım.ÖrneksenaryomuzdaBranch-B'dekideğişiklikleriBranch-A'ya entegreedeceğizRebaseişleminigitrebasekomutunuaşağıdakigibikullanarakyapıyoruz. $gitrebaseBranch-B BukomutileGitöncelikleBranch-AileBranch-B'ninortakensoncommit'inibuluportakcommitsonrasındaBranch-A'da yapılandiğertümcommit'lerigerialır.Aslındabucommitlersilinmezsadecegeçiciolarakfarklıbiryerdesaklanır.Daha sonraBranch-B'dekitümcommitlerBranch-A'yauygulanır.SonaşamadaiseBranch-A'nıngeçiciolarakfarklıbiryerde saklanancommit'leritekraruygulanır.BuişlemlersonrasındatümdeğişikliklersankisadeceBranch-Aüzerinde gerçekleşmişgibigörünür. GitAraçveServisleri Bubölümdeaşağıdakikonulardanbahsedeceğiz GörselGitistemcileri Gitilekullanılabilecekdiff/mergearaçları Gitservisleri KaynaklarveReferanslar GörselGitİstemcileri ÖncekibölümlerdeTerminalkullanarakbirçokGitkomutunununnasılkullanıldığınısizegösterdik.Ancakgünlük çalışmanızdaherbirkomutunayrıntılıolarakneişeyaradığını,hangiparametrelerveseçeneklerikabulettiğiniaklınızda tutumakzorolacaktır.BunedenleGit'igünlükişakışınızaentegreedipGitkavramlarınıöğrendiktensonragörselbirGit istermcisikullanmakişiniziciddiorandakolaylaştıracaktır. AtlassianSourceTree SourceTreeücretsizbiruygulamadırveMacOSX,WindowsveLinuxişletimsistemlerindeçalışmaktadır. SourceTree'yibulinktenindirebilirsiniz Linux'aÖzelİstemciler GitEye:Linux'unyanısıraOSXveWindowsişletimsistemlerindedekullanılabilir. gitg giggle GitForce RabbitVCS Tower Tower,sadeceMacOSX'deçalışanücretlibiruygulama.Bulinkikullanarakuygulamanın30günlükdenemesürümünü indirebilirsiniz. GitHub ProjelerinizinkaynakkodunuGitHub'datutuyorsanızGitHub'ınücretsizMacOSXveWindowsiçingeliştirdiğikullanımı oldukçakolayolanveGit'inkarmaşasındansizibirnebzeolsunuzaklaştırabilecekuygulamasınıkullanabilirsiniz.Bu uygulamanınMacOSXversiyonunuburadanveWindowsversiyonunudaburadanindirebilirsiniz. WindowsversiyonundaGitShellisimliTerminalbenzeriuygulamanınkurulumudayeralıyor.Bunedenledaha karmaşıkGitkomutlarıiçinTerminalbenzeribirdeneyimistiyorsanızGitShell'irahatlıklakullanabilirsiniz. TortoiseGit WindowskullananlarücretsizbiruygulamaolanTortoiseGituygulamasınıbulinktenindiripkullanabilirler.Özellikledaha önceSubversionveTortoiseSVNkullananlariçinTortoiseGitbenzerbirdeneyimsunmaktadır. DiğerUygulamalar DiğergörselGituygulamalarınıGit'inkendisayfasındaninceleyebilirsiniz. Diff/MergeAraçları Projenizdenelerolupbittiğinianlamakiçinzamanzaman(aslındabirtakımiçindeyeralıyorsanızsıksıkdadenilebilir) dosyalarınversiyonlarıarasındakifarklarınneolduğunabakmanızveçakışmadurumundadaçakışmalarıinceleyip çakışmadurumunugidermenizgerekir. 4.BölümdeTerminal'denherhangibiryardımcıuygulamayagerekkalmadandaGit'inbizebufarklarıgösterebildiğinevebu farklar'ınasılokuyabileceğimizedeğinmiştik.AncakbüyükprojelerdeGit'insunduğubuişlevilefarklarıokumakçokkolay olmayacaktır.Bunedenlefarklarıdaharahatinceleyebilmekiçinbufarklarırenklerveformatlamayöntemleriile görselleştirenaraçlardanfaydalanmakişinizikolaylaştıracaktır.Farklarıgörselleştirenbuuygulamalarınnerdeysetamamı aynızamandaçakışmalarıdagörselleştiripmergeişleminidekolaycayapmanıziçinaraçlarsunar. WindowsüzerindeçalışıyorsanızWinMerge(ücretsiz)veyaAraxisMerge(ücretli)kullanabilirsiniz. MacOSXüzerindeçalışıyorsanızSourceGearDiffMerge(ücretsiz)veyaAppleXCodeilebirlikteücretsizgelenApple'in FileMergearacınıkullanabilirsiniz. GitServisleri Takımçalışmasısözkonusuolduğundaenönemlikonulardanbirisidekaynakkodununveyadahagenelanlamda dosyalarınnasılpaylaşılacağınakararvermektir.Bunoktadaikiseçeneğinizvar1)dosyalarınızıkendisunucularınız üzeridenpaylaşmakveya2)işipaylaşımvebarındırmahizmetivermekolanonlineservislerkullanmak Dosyalarınızıkendisunucularınızüzerindenpaylaşmanınaşağıdakigibiavantajlarıvardır Düşükmaliyet Dosyalarınızkendisunucularınzdadır Git'inveyahangiversiyonkontrolsisteminikullanıyorsanızbusistemintümözellikleriniistediğinizgibikullanabilirsiniz. Ancakbuseçeneğinaşağıdakidezavantajlarınıdagözardıedemeyiz Sunucularınçalışırhaldeveerişilebilirolmasınısağlamaksizinsorumluluğunuzdadır Yedeklemesorumluluğusizdeolacak Güvenlikveyazılımgüncellemelerinidesizintakipetmenizgerekir Eğersunucukaynaklarıyeterliolan,yedekleme,güncellemegibisunucuyönetimikonularındaayrıveuzmanekibiolanbir kurumdaçalışıyorsanızdosyalarınızıkendisunucularınızdabarındırmakilktercihinizolacaktır.Ancakküçükbirgirişimseniz veyaaçıkkaynakbirprojenizvarsasunucuyönetimiileilgiliyeterinceuzmanlığınızvekaynağınızolmayabilir.Budurumda dosyalarınızıonlinebirservisüzerindebarındırmakveburadanpaylaşımaaçmaksiziniçindahamantıklıolacaktır. GitHub ÖzellikleaçıkkaynakprojeleriçinoldukçapopülerbirservisolanGitHub'ıkullanabilirsiniz.GitHubaçıkkaynakprojeleriçin ücretsizolmaklabirlikte,kurumlarveözelprojeleriçindeoldukçamakulfiyatlaraGitsunucuhizmet'isunmaktadır GitHubAnaSayfa BitBucket DahaönceküçükbirgirişimolarakMercurial(budadağıtıkbirversiyonkontrolsistemi)hizmetisunmakiçinkurulan BitBucketAtlassiantarafındansatınalındıktansonraGitsunucuhizmetidesunmayabaşladı.BitBucketaçıkkaynakveya özel5kullanıcıyakadarolansınırsızsayıdaprojeniziçinücretsizhizmetsunaraynızamandaoldukçamakulfiyatlarada dahafazlakullanıcıiçinücretlishizmetseçeneğidevar. BitBucketAnaSayfa KaynakçaveReferanslar Gitoldukçaçokseçeneğivefarklıkullanımşekliolanbirdağıtıkbirversiyonkontrolsistemidir.Gitileilgilidahafazlabilgi edinmekistiyorsanızönceiyiderecedeİngilizceöğrenmenizitavsiyeediyorum.Dahasonradaaşağıdakikaynaklardan başlayarakGitileilgilibilginiziarttırabilirsinzi. 1. Git-ScmReferansDokümanı 2. GitRefReferansDokümanı 3. LearnVersionControlwithGit 4. AtlassianGitTutorials 5. ProGitBook 6. AtlassianGitWorkflows 7. LearnGitBranchingOnlineTutorialApplication 8. Git:fetchandmerge,don'tpull 9. Resolvingamergeconflictfromcommandline 10. AddingAndRemovingRemoteBranches–GitBranch