i. Versiyon Kontrolü Nedir? · 2015-01-12 · Text, Notepad, Visual Studio, Word, AutoCAD) ......
Transcript of i. Versiyon Kontrolü Nedir? · 2015-01-12 · Text, Notepad, Visual Studio, Word, AutoCAD) ......
1. Introduction2. VersiyonKontrolüneGiriş
i. VersiyonKontrolüNedir?ii. VersiyonKontrolüneNedenİhtiyacımızVar?iii. KısaGitTarihçesiiv. GitİleÇalışmayaBaşlamakv. BasitAnlamdaVersiyonKontrolüİşAkışıvi. Localbirprojeoluşturmakvii. Remotebirprojeoluşturmakviii. ProjemizÜzerindeÇalışmayaBaşlayalım
3. Branching(Dallanma)veMerging(Birleştirme)i. BranchingÇalışmaŞekliniziDeğiştirebilirii. Branch'lerİleÇalışmakiii. DeğişiklikleriniziGeçiciOlarakKaydetmek->GitStashiv. LocalBirBranch'deÇalışmakv. DeğişiklikleriMergeEtmekvi. BranchingİşAkışları
4. RemoteRepository'leri. RemoteBirRepository'yeBağlantıSağlamakii. RemoteRepository'dekiVerilerinİncelenmesiiii. RemoteDeğişiklikleriEntegreEtmekiv. LocalBirBranch'iYayınlamak(Publish)v. Branch'leriSilmek
5. İleriSeviyeKomutlarveİşlemleri. DeğişiklikleriniziGeriAlmakii. DiffİleFarklarıİncelemekiii. ÇakışmalarıGidermekiv. MergeAlternatifiOlarakRebaseKullanımı
6. GitAraçveServislerii. GörselGitİstemcileriii. Diff/MergeAraçlarıiii. GitServisleriiv. KaynakçaveReferanslar
TableofContents
Son4-5yıldayazılımgeliştiricilerinveyazılımşirketlerininvazgeçilmezaraçlarındanbiriolanvebenimdebiryazılımgeliştiriciolarakçokbaşarılıbulduğumGitDağıtıkVersiyonKontrolSistemini(DistributedVersionControlSystem)örneklerileelealaraksizetanıtmayaçalışacağım.
YazılımGeliştirmeileilgiliçoğukonudaolduğugibimaalesefGitileilgilikaynaklardaağırlıklıolarakİngilizce.TerminolojianlamındaTürkçebirkaynakhazırlamanınenbüyükzorluğuİngilizceterimlereTürkçeuygunkarşılıkbulmaktır.AncakGit101kitabındaİnglizce->Türkçegeçişinibirebiryapmayacağım,mümkünolduğukadarVersiyonKontrolüveGitileilgiliterimlerinİnglizcehallerinikullanmayaçalışacağım.
KonularındizilimindeveiçeriğinoluşturulmasındaLearnVersionControlwithGitisimlikitapçığınonlineversiyonubazalınmıştır.BelirtilenkaynaktakibaşlıklaraveiçeriğeilaveolarakdahaayrıntılıbirkitapolanProGitkitabındanvesonbölümdelinklerinipaylaştığımonlinediğerkaynaklardandafaydalanılmıştır.
ÖrneklerimiziTerminal(komutsatırıveyacommandlineolarakdatabiredilen)üzerindenAppleMacOSXişletimsistemikullanarakoluş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şletimsisteminegöredeğişmezancakGitkurulumukullandığınızişletimsisteminegöredeğişebilir.İşletimsisteminizebağlıolarakkurulumyönergeleriiçinaramamotorlarınıkullanarakgerekliadımlarıöğrenebilirsiniz.
TürkçeGit101
Önsöz
İngilizceTerimler
Örnekler
Bubölümdeaşağıdakikonularıelealacağız
VersiyonKontrolüNedirVersiyonKontrolüneNedenİhtiyacımızVarGitİleÇalışmayaBaşlamakBasitAnlamdaBirVersiyonKontrolüİşAkışıLocalBirProjeOluşturmakRemoteBirProjeOluşturmakProjemizÜzerindeÇalışmayaBaşlayalım
VersiyonKontrolüneGiriş
Versiyonkontrolünedirvebizinedenilgilendirmeli?Versiyonkontrolünübirdosyaveyabirkümedosyadakideğişiklikleritakipedebilmekiçinuyguladığımızbiryöntemolaraktanımlayabiliriz.Gitgibisistemlertümbudeğişikliklerintarihçesiniveiçeriğinielektronikolarakbizimiçintakipederekkayıtaltınaalmamızısağlayanveritabanlarıolarakdüşünülebilir.
Busistemlerikullanarakherhangibirandaüzerindeçalıştığınızdosyalarınoankihallerinikaydedebilir,dahasonradaistersenizbudosyaları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),dosyatipiveyaişletimsistemindenbağımsızbiryaklaşımolarakdüşünmelisiniz.Çünküversiyonkontrolü
HTMLdosyalariçinkullanılabileceğigibi,mimaritasarımamaçlıprojedosyalarıveiPhoneuygulamasıkaynakkodunuziçindekullanılabilir
Dosyalarınızüzerindeçalışırkenhangiişletimsisteminiveyahangiprogramlarıkullandığınızileilgilenmez(SublimeText,Notepad,VisualStudio,Word,AutoCAD)
BendebukitabınversiyonkontrolüiçinGitkullanıyorum
Versiyonkontrolsistemlerienbasitanlamdadosyalarınızdakideğişikliklerintarihçesinitakipedipkayıtaltındatutansistemlerdir.Bunedenleversiyonkontrolsistemleriniyedeklemeveyadiğeryazılımgeliştirmearaçlarıilekarşılaştırmakdoğruolmaz.
VersiyonKontrolüNedir?
Versiyonkontrolsistemikullanmanınbirçokfaydasıvarvebubölümdeversiyonkontrolsistemikullanımınınbizesağladığıavantajlardanbahsediyoruz.
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üzenlemekistediğinde
Kullandığıprogramabağlıolarakdosyayazmakorumalıolaraksaltokunurmodda(readonly)açılırveyaDeğişikliklerkaydedilmekistendiğindehataverir
Butürbirçalışmahemçokzahmetlihemdehatalaraaçıktır.Örneğinbirdosyanınensongeçerliversiyonununneredeolduğ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şikliklerversiyonkontrolsistemikullanılaraksağlıklıbirşekildemerge(birleştirme)edilebilir.
Üzerindeçalıştığınızbirdosyanınveyabirdiziprojedosyasınınzamaniçindefarklıversiyonlarıoluşurvebuversiyonlarınkayıtaltınaalınmasıgerekir.Busorumlulukgeneldeçokzahmetlivesıkıcıbirişvesüreçtir.Aşağıdakinebenzersorularcanınızıgereğindenfazlasıkabilir
Sadecedeğişendosyalarmıyoksabirprojedekitümdosyalarınversiyonlarımıkaydedilmeli?
BirsürüdosyaiçindensadecedeğişendosyalarınbelirlenmesizordurHerseferindedosyalarınhepsinintekertekerkaydedilmesidurumundaiseihtiyaçduyulandandahafazladiskalanıkullanılır
Dosyalaraverilecekisimlertambirbaşağırısınadönüşebilir.
Personel_Maas.xlsxPersonel_Maas1.xlsxPersonel_Maas_Ozet.xlsxPersonel_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,budosyalarındahaöncekihalleriversiyonkontrolsisteminindenetimindedir.Busayedeistediğinizzamanöncekiversiyonlarageridönebilir,versiyonlararasındakifarklılıklarırahatlıklainceleyebilirveversiyonlarıkaydederkeneklediğinizilavebilgileriveyorumlarınızırahatlıklagörebilirsiniz.
VersiyonKontrolüneNedenİhtiyacımızVar?
Uyumluekipçalışması
Versiyonlarındüzgünbirşekildetakipedilebilmesi
ÖncekiVersiyonlaraGeriDönebilme
Dosyalarınızınveyaaslındatümprojenizindahaöncekiversiyonunageridönebilmeimkanınsizeciddianlamdaözgürlüksağ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ıkistemediğinekararverirseprojenizinöncekitemizhalineçokhızlıverahatbirşekildedönebilirsiniz.
Versiyonkontrolsistemlerideğişikliklerinizitamamlayıpcommitetmekistediğinizdecommentadıverilenaçıklamalargirmeniziisterler.Bucommentlersayesindeprojenizinherhangibirversiyonundakideğişikliklerinnedenlerinidekayıtaltınaalıpihtiyaçhalindegeridönüpinceleyebilirsiniz.
Git'decommitişlemiyapılırkencomment(yorummetni)girilmesizorunludur
Gitgibidağıtıkversiyonkontrol(DVCS)sistemlerininyanetkiolaraksağladığıfaydalardanbirisideyedeklemedir.Gitsayesindeaynıprojedeçalışanherkesinkendibilgisayarındaprojenintambirtarihçesitutulur.Merkeziversiyonkontrolsistemisunucusundabirsorunoluştuğundatakımdakiherhangibirininkendidiskindekiproje'yisunucuyageriyüklemesiyeterlidir.Diğerleridekendibilgisayarlarındakiprojedosylarınıgeriyüklenenprojedosyalarıilesenkronizeedebilirler.
Dosyalarınızınnedendeğiştiğinianlama
Yedekleme
Git2005yılında,baştaLinusTorvaldsolmaküzereLinuxçekirdeğinidekodlayanekiptarafındanLinuxkaynakkodunuversiyonkontrolü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ücretsizlisanslamamodelisunanBitKeeperisimlidağıtıkversiyonkontrolsisteminikullanmayabaşladılar.2005yılındaBitKeeper'ınücretsizsağladığılisansıgeriçekmesiüzerineLinusTorvaldsveLinuxekibikendidağıtıkversiyonkontrolsisteminigeliştirmeyekararverdiler.
LinuxekibiBitKeeperileolandeneyimlerinidedikkatealaraköncelikliolarakaşağıdakikriterlerisağlayankendiyazılımlarınıgeliştirmeyebaşladılar
HızlıKullanımıkolayLineerolmayangeliştirmeişakışınauygun(branching)TamamendağıtıkBüyükprojeleridestekleyebilecek
2005yılındanbugüneGitgelişmeyedevamediyor.Git'eyenieklenenözelliklererağmenGitbugünbileyukarıdabahsettiğimönceliklikriterlerdentavizvermedenmiliyolarcayazılımgeliştiricininhayatınıkolaylaştırmayadevamediyor.
KısaGitTarihçesi
Gitileçalışmakiçingit'inkendikomutsatırıarayüzünü(GitCommandLineInterface)veyagörselkullanıcıarayüzüolanmasaüstüuygulamalar(SourceTree,TortoiseGit,TowerveyaGitHub)kullanabilirsiniz.
GitileçalışırkengörselarayüzüolanbiruygulamakullanmanızüretkenliğiniziarttırıpGit'inçoksayıdakikarmaşıkkomutunadahahı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ımutlakakullanmanızıöneriyorum.
Git'inkurulumuhemWindowshemdeMacOSXiçinoldukçakolaybirişlemdir.Herikiişletimsistemiiçintektıklakurulumyapmanızısağlayankurulumsihirbazlarıvardır.
İşletimsisteminizWindowsisegitileçalışmakiçin"msysgit"paketinikullanabilirsiniz.
msysgitpaketinikurmakiçinhttp://msysgit.github.io/adresindenkurulumuygulamasınıindiripçalıştırmalısınız.Kurulumadımlarısırasındakarşınızaçıkacakolanekranlardavarsayılanayarlarıseçiliolarakbırakarakkurulumunuzutamamlayabilirsiniz.
KurulumtamamlandıktansonraWindowsBaşlangıçmenüsündenGitklasörüaltındakiGitBashuygulamasınıçalıştırıpGit'inkomutsatırıarayüzünükullanmayabaşlayabilirsiniz.
Git'inkurulumununsorunsuzgerçekleştiğiniteyidetmekiçinGitBash'iaçıpgit--versionkomutunuyazın.BukomutekranaGit'inversiyonbilgisinibasar.Eğerhataalırsanızmsysgitanasayfasındansorunungiderilmesiiçinneyapmanızgerektiğiniöğrenebilirsiniz.
İşletimsisteminizMacOSXiseGitkurulumuiçinikiyöntemkullanabilirsiniz.
Apple'ingeliştiriciaraçlarınıkurarak(XCode)AppletarafındansağlananGitdağıtımınıkurabilirsinizGitOSXInstallerpaketiniindiripGit'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'inversiyonunuekranabasar.Herhangibirhataalmanızdurumundakurulumyönteminizegöreilgilikaynaklarıaraştırmanızgerekebilir.
Git'ikurduğumuzagöreartıkGitileçalışmakiçinbazıayarlaryapabiliriz.BuayarlariçinGitbizegitconfigisimlibiraraç/komutsunar.Gitayarlarınıbirdefayapmanızyeterliolacaktır.
Buayarlarıistediğinizzamandeğiştirebilirsiniz.
GitİleÇalışmayaBaşlamak
Komutsatırımıyoksagörselarayüzmü?
Kurulum
Windows
MacOSX
GitKonfigürasyonu
Gitayarlarınızaşağıdabelirtilenüçkonumdakaydedilirvehiyerarşikolarakbukonumlardanyüklenir
1. Seviye(/etc/gitconfigdosyası):Tümkullanıcıveprojeleriçingeçerliolanayarlarbudosyadakaydedilir.gitconfigkomutunu--systemseçeneğiileçalıştırırsanızayarlarbudosyadakaydedilecekvebudosyadanokunacaktır
2. Seviye(/.gitconfigdosyası):Sadecesizinkullanıcınıziçintanımlananayarlarınkaydedildiğidosyadır.gitconfigkomutunu--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ıilehiyerarşikolarakokur.Belirlibirayar'ailişkindeğereilkhangiseviyederastlandıysaoseviyedekideğerdikkatealınırdiğerseviyelerdekideğerlerdikkatealınmaz.
Windows'daglobal(gitconfig--globalkomutu)gitayarlarınızWindows'un$HOMEklasörüaltındayeralan(genellikleC:\DocumentsandSettings$USER).configdosyasındayeralır.ProjeseviyesindekiayarlarınıziseOSX'deolduğugibi[ProjenizinAnaKlasörü].git\configdosyasındakayıtaltınaalınır.
Gitayarlarındanenönemliolanlarıkullanıcıadınızveemailadresinizdir.Git,ayarolaraktanımladığınızdeğerlericommitvbişlemlerdeotomatikolarakkullanır.Buayarlarındeğerinibelirlemekiçinkomutsatırındaaşağıdakikomutlarıçalıştırıyoruz
gitconfig--globaluser.name"aliözgür"
gitconfig--globaluser.email"[email protected]"
Yukarıdakikomutlarda
--globalseçeneğiileGit'eglobalayarlarıdüzenlediğinizisöylüyoruzuser.name(veuser.email)iledeğerinideğiştirmekistediğinizayarınanahtar'ınıbelirtiyoruzArdındandaçifttırnakiçindeilgiliayarındeğerinigiriyoruz
Buayarları--globalibaresiiletümprojelerinizdegeçerliolacakşekildeyaptık,projeseviyesindebuayarlarıyapmakiçinkomutsatırında(terminal'de)projenizinklasörünekonumlanıpgitconfiguser.name"aliözgür"komutuile--globalseçeneğinikullanmadanyapabilirsiniz.
Kendiyaptığımızveyakurulumilehazırgelenayarlarındeğerlerinigörmekiçinaşağıdakikomutlarıkullanabiliriz.
Globalseviyedetümayarlarılistelemekiçingitconfig--global-l
Globalseviyedetekbirayar'ındeğerini(örneğimizdeuser.nameanahtarınasahipayar)görmekiçinisegitconfig--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.
Kullanıcıadınızıveemailbilgisi
Editörayarı
Git'inbazıkomutlarısizdeninteraktifolarakyorumveyabilgigirmeniziister.ButürdurumlariçinGit'inhangimetindüzenlemeuygulamasınıkullanacağınıayarlayabilirsiniz.GitvarsayılanolarakViveyaVim)kullanır.Ancakbueditörlerinkullanımıbaşlangıçseviyesindekikullanıcılariçinzorolabilir.Ben,ViveyaVimilekarşılaştırıldığındakullanımınındahakolayolduğ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.
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ştirmekiç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özatabilirsiniz.
Windows'daiseyineücretsizbiruygulamaolanWinMergeveyaücretlibiruygulamaolanAraxisMerge'ikullanılabilir.BuaraçlarınGitayarlarınınnasılyapılacağınıyardımdokümanlarındanfaydalanaraköğrenebilirsiniz.
Diffaracıayarları
Git'inderinliklerinedalmadanöncegelinbasitbirversiyonkontrolişakışınaadımadımgözatalım.
Versiyonkontrolününentemelbileşenirepositorydenilenyapıdır.Repository,dosyalarınızdakitümdeğişikliklerivebudeğişikliklerileilgliilavebilgileri(değişikliğikim,nezamanyaptıvedeğişiklikileilgiligirilenaçıklamalar)ayrıbirerversiyonolarakkayı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ıilebirlikteversiyonkontrolünealabilirsinizProjenizuzaktakiveyaşirketağınızdakibirGitsunucusundaversiyonkontrolüaltındatutuluyorsaprojeyikendibilgisayarınızagitclonekomutuileindirebilirsiniz.
Projeniziçinyukarıdakiyöntemlerdenbiriilerepositoryoluşturduktansonraaşağıdakibasitakışıkullanarakdeğişiklikleriniziyapmayabaşlayabilirsiniz
1. Projenizinrepositorysinioluşturduktansonradosyalarınızüzerindeistediğinizdeğişiklikleriistediğinizuygulamayıkullanarakyapabilirsiniz.Buaşamadayaptığınızdeğişiklikleriversiyonkontrolüiçinbirebirvedoğrudantakipetmenizegerekyoktur.
2. Yaptığınızdeğişiklikleristediğinizbirnoktayaulaştığındaveyabirözellikveyasorungidermedüzenlemesiileilgiliçalışmanıztamamlandığındaversiyonkontrolübakışaçısıiledeğişikliklerinizideğerlendirmenizgerekir.Buaşamadadeğişikliklerinizicommitadıverilenbirbütünüolaraktarifetmelisiniz.Böyleceprojenizinyenibirversiyonunuoluşturmaişlemininilkadımınıtamamlamışolacaksınız.
3. Fakat,commitişlemiöncesindedosyalarınızdayaptığınızdeğişikliklerinbirözetinigörmekisteyebilirsiniz.gitstatuskomutuilehangidosyalarıdeğiştirdiğinizi,sildiğiniziveyahangidosyalarıeklediğinizikolaycagörebilirsiniz.
4. Birsonrakiaşamadadeğişendosyalarınızdanhangilerinincommit'edahilolduğunubelirlemenizgerekiyor.Buadımdacommit'edahiletmekistediğinizdosyalarıstagingareadenilenarabiralanaalırız.
Dosyalarıniçeriğinindeğiştirilmişolması,silinmesiveyayenidosyaeklenmesibudosyalarınotomatikolarakstagingarea'yaeklenmesinisağlamaz.Buişlemiilgilidosyalarıseçereksizinyapmanızgerekir.
5. Dosyalarınızıstagingarea'yaeklediktensonraşimdicommitişleminehazırsınız.Commitişlemiiledosyalarınızdakideğ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çindeğ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üzerindesadecesizçalışabilirsinizvedeğişiklikleryereldiskinizekaydedilir.Remoterepository'lerisegenellikleuzaktakibirsunucudayeralırlarvebusunucudaki.gitklasöründenibarettirler.Takımçalışmasısözkonusuisetakımdakikişilerdeğişikliklerinibuuzaktakirepositoryüzerindenpaylaşırlar.
BasitAnlamdaVersiyonKontrolüİşAkışı
Henüzversionkontrolüaltındaolmayanbirprojeniziversiyonkontrolüaltınaalmakiçingitinitkomutunukullanırız.Buiş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ğunugöreceksiniz.gitinitkomutuileprojemiziçinboşbirrepositoryoluşturduk.AncakprojeklasörümüzdedosyalarvebaşkaklasörlerbulunmasınarağmenbudosyaveklasörlerinhiçbirihenüzGittarafındanversiyonkontrolüaltınaalınmadı.
Workingcopy:ProjenizinanaklasörüneWorkingCopyveyaWorkingDirectoryismiverilir.Buklasördeprojenizdeyeralandosyalarınveklasörlerinbirkopyasıbulunur.VersiyonkontrolsistemineprojenizinherhangibirversiyonunuWorkingCopy'nizekopyalamasınısöyleyebilirsiniz,ancakbirandaWorkingCopy'nizdeprojenizinsadecebirversiyonuyeralır.
Tümgeliştirmeortamlarıveişletimsistemlerindekullandığımızaraçlartarafındanarabirürünolaraküretilenveaslındadoğrudanversiyonkontrolüaltınaalmakistemediğimizdosyaveyaklasörlerolacaktır.ÖrneğinMacOSX'inotomatikolarakürettiğigizliDS_StoreisimliklasörveyaC++derleyicileritarafındanüretilen.ouzantılıobjdosyalarıgibi.HangidosyalarınversiyonkontrolüaltındatutulacağınavehangileriningözardıedileceğineGitotomatikolarakkararvermez,bukararısizinvermenizgerekir.
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ğrudanisimlerveyabasitkurallarekleriz.ProjeleriniziversiyonkontrolüaltınaaldıktansonrailkişolarakGitHub'inyayınladığıderlemeyiveyakendideneyiminizvebilginizilekararvereceğinizdosyaveklasörleri.gitignoredosyasınaekleyiniz.Projenizinilerleyenaş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ırdaise~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
Localbirprojeoluşturmak
Versiyonkontrolüaltınaalmakistemediğimizdosyalar
Klasörleribelirtmekiçin/karekterikullanılır.Örneğin/projemde/versiyon/kontrolü/istemedigim/bir/klasor/şeklindebirtanımyaptığımızdailgiliklasörvealtındakitümdosyalarGittarafındangözardıedilir.Tanımladığınızbirkuralıntersini!simgesiiletanımlarız.Örneğin!/projemin/kaynak/kodu/şeklindebirtanımyaptığımızdabuklasördışındakitümklasörvedosyalarGittarafındangözardıedilecektir.
Projemiziversiyonkontrolünealıpgözardıedilmesiniistediğimizklasörvedosyalarıdabelirlediktensonraaşağıdakikomutlarileilkcommitiş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.
İlkcommitimiz
VersiyonkontrolüGitileyapılanbirprojedeyeralıyorsanızremoterepository'lerinizinasılyöneteceğinizideöğrenmenizgerekir.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,kendiyaptığınızdeğişikliklerionlarilepaylaşabilmekiçinremoterepository'lerinizidoğruveetkinbirşekildeyönetmelisiniz.
GitileversiyonkontrolüyapılanbirprojeyedahilolduğunuzdasizeverilecekilkbilgilerprojeninGitadresi(URL)veprojeyeerişimiçinkullanacağınızkullanıcıadıveşifrenizdir.Uzaktakibirrepository'nin(URL)adresiaşağıdakiformatlardanbirindeolacaktır
ssh://user@server/git-repo.gitkullanıcıadı@sunucuadı:git-repo.githttp://example.com/git-repo.githttps://example.com/git-repo.gitgit://example.com/git-repo.git
BuadresformatlarındanilkikitanesiSSH(SecureShell)protokolünekarşılıkgelir.http://vehttps://protokolleriisenormalinterneteriş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ğinizbirklasö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örolanProjectsklasö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üzegitclonekomutuileindirebiliriz.
Kullanıcıadınızıveşifrenizivererekremoterepository'yiklonlamakiçinaşağıdakigitclonekomutunabubilgileriaşağıdakiformattavermenizgerekiyor
gitclonehttps://kullanıcıadı:ş[email protected]/username/repository.git
Remotebirprojeoluşturmak
Üzerindeçalışacağımızprojenindosyalarıartıkyereldiskimizdeyeraldığınagöreprojemizileilgilinormalçalışmamızabaşlayabiliriz.
Projeniziisterlocalbirprojeolarakoluşturmuşolunistersenizremotebirrepository'yiklonlamışoluntümdeğişikliklerinizyereldiskinizdegerçekleşecekvecommitlerinizileoluşturacağınıztümversiyonlargittarafındanyereldiskinizdeki.gitklasöründetakipedilecektir.İlerleyenbölümlerdeayrıntılıolarakelealacağımızgitpushkomutunuçalıştırmadığınızsüreceyaptığınızdeğişikliklersadeceyereldiskinizdekayıtaltınaalınır.
Git'dedosyalarınızgenelolarakikidurumdaolabilir
Untracked(TakipEdilmeyen):Budosyalarversiyonkontrolüaltındaolmayanveyasizinhenüzversiyonkontrolüyapmakiçingit'eeklemediğinizdosyalardır.Budosyalardakideğişikliklersizdosyalarıgit'eeklemediğinizsüreceversiyonkontrolünetabideğildirTracked(TakipEdilen):Budosyalarisegit'inversiyonkontrolütakibialtındaolandosyalardır.Budosyalarüzerindeyapacağınıztümdeğişikliklergittarafındantakipedilmektedir.
Çoğuversiyonkontrolsistemindedeğişikliklerinizikiyerdekaydedilir
Yereldiskinizdekiçalışmaklasörünüz(workingfolder)veyaVersiyonkontrolsistemininveritabanı
Ancakgit'dedeğişikliklerinizinkayıtaltınaalındığıüçüncübiralandahavardırkibunaStagingAreadenirvegit'inentemelkavramlarındanbirisidir.StagingArea'yı,projedosyalarımızdakibirdizideğişikliğiremoterepository'yegöndermedenöncekayıtaltındatuttuğunuzveritabanı/alanolaraktanımlayabiliriz.
VersyonKontrolününAltınKuralları
#1SadeceBirbiriİleAlakalıDeğişiklikleriCommitEdin
Değişikliklerinizicommitetmeyekararverdiğinizdebirbiriilealakalıdeğişiklikleritekbircommitolarakelealmayaözengösterin.Birbiriilealakalıolmayandeğişiklikleriaynıcommitileversiyonkontrolsistemindekayıtaltınaaldığınızdaaşağıdakilerebenzersorunlaryaşamaihtimalinizartacaktır
Commitinizdekideğişiklikleriinceleyenekiparkadaşlarınızyaptığınızdeğişikliklerdenhangisininhangikonuileilgiliolduğunuanlamaktagüçülükçekeceklerdir.Alakalıalakasızdeğişikliklertekbircommitiçindeyeraldığıiçinherhangibirnedenlebelirlivetekbirdeğişikliğigerialmaktagüçülükçekeceksiniz.
Alakalıalakasızdeğişiklikleritekbircommitileelealmakyerineörneğinikiayrısorunugidermekiçinyaptığınızdeğişikliklerikiayrıcommitilekayıtaltınaalınmalıveyadahabüyükbirözelliküzerindeçalışırkenbuözelliğioluşturanveanlamsalbirbütünolarakifadeedilendahaküçüközelliklerideayrıcommitlerilekayıtaltınaalmalısınız.
Projenizüzerindeçalışırkenbelirlibirzamanaralığındayaptığınızdeğişikliklerintamamınınaynıkonuveyaözellikleilgiliolmasımümkünolmayacaktır.TamdabunoktadaStagingAreamekanizmasınıngüzelliğiortayaçıkar,çünkügithangideğişikliğinizinStagingArea'yagideceğinekararvermeniziçinsizindevreyegirmeniziister.Dahaöncedebelirttiğimizgibiyaptığınızdeğişikliklergittarafındanotomatiktakipedilmez,bununyerinegittümdeğişikliklerisizingözdengeçirerekkontrollübirşekildeStagingArea'yaalmanızıister.
ProjemizÜzerindeÇalışmayaBaşlayalım
DosyaDurumları
StagingArea
Soncommitişleminizdensonraprojedosyalarınızdayaptığınızdeğişikliklerilistelemekiçingitstatuskomutunukullanabilirsiniz.
Yukarıdakiterminalekrangörüntüsündedegörebileceğinizgibigitoldukçaayrıntılıdurumbilgisisunmaktadır.gitstatuskomutuilegitaşağıdaki3anagruptayeralandosyalarısizelisteler
Changestobecommitted(Commitedilmeyehazırdosyalar):BugruptakidosyalargitaddveyagitrmkomutuileStagingArea'yaeklediğimizdosyalardır.Budosyalarbirsonrakicommit'imiziniçindeyeralacaktırChangesnotstagedforcommit(Commitiçinhenüzhazırolmayandosyalar):BugruptakidosyalardeğişiklikyaptığımızfakathenüzStagingArea'yaeklemediğimzidosyalardır.Budosyalarbiröncekigrubuniçineeklemediğimizsürecebirsonrakicommit'edahilolmayacaklarıdırUtrackedfiles(Versiyontakbinideolmayandosyalar):Bugruptakidosyalarisehenüzversiyonkontrolüaltınaalmadığımızdosyalardır.
Biröncelkibaşlıktadeğindiğimizvegitstatuskomutusonrasındagit'inbizeözetlediği3gruptansonikisindeyeralandosyalarınilkgrubadahiledilmesiiçingitaddvegitrmkomutlarınıkullanabiliriz.
Aşağıdaoluşturduğumuzgitaddkomutuilebaslik_2.mdvebaslik_2_1.mddosyalarıileresimlerklasörüaştındakitümdosyalarınStagingArea'yaeklenmesinisağlayabiliriz.
$gitaddbaslik_2.mdbaslik_2_1.mdresimler/*
Benzerşekildeaşağıdakigitrmkomutuileornek2.mddosyasınınbirsonrakicommitimiz'deyeralmayacağınıbelirtebiliriz.
$gitrmornek2.md
DeğişikliklerinizigitaddvegitrmileStagingArea'yaaldıktansonragitcommitkomutuileyenibirversiyonolarakkayıtaltınaalabilirsiniz.
$gitcommit-m"1.7numaralıaltbaşlıkiçeriğitamamlandı"
Yukarıdakikomuttayeralan-mparametresiileyaptığınızdeğişiklikleriözetleyenbirmesajıdacommit'inizeekleyebilirsiniz.
YaptığınızDeğişiklikleriListelemek
"gitadd"ve"gitrm"komutları
DeğişikliklerimiziCommitEdelim
Eğerbirdenfazlasatırıolanbircommitmesajıgireceksiniz-mparametresinikaldırmanızyeterliolacaktır.Budurumda1.3numaralı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şilerinhemdedahasonrakendinzinyapılandeğişikliğidaharahatvehızlıanlamanızısağlayacaktır.Mesajınızakısabirözetsatırıyazdıktansonrabirsonrakisatırdadadeğişikliğinnedeniveiçeriğihakkındabilgiverebilirsiniz.
1. Commit'inizdesadecekavramsalolarakilişkilideğişiklikleriiçermeyeözengöstermelisiniz.Zamanzamanikifarklıkonuveyasorunileilgiliaynıandaveyaçokkısaaralıklarladeğişimliolarakçalışmakzorundakalabilirsiniz.Buşekildeyapılanbirçalışmasonrasındacommitzamanıgeldiğindemümküniseikikonuileilgilideğişikliklerinizibirdefadacommitetmekyerineikidefadaayrıayrıcommitedin.Buçokzoroluyorsakısayoldanbirandatekbirdeğişikliğeodaklanmayıdadüşünebilirsiniz.
2. Tamamlanmamışdeğişikliklerinizikesinliklecommitetmemeyeözengösterin.Eğerzamanzamandeğişikliklerinizikayıtaltı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.
Gitprojenizüzerindeçalıştığınızherandayaptığınızcommitişlemlerinikayıtaltınaalmaktadır.Özellikleekipçalışmasısözkonusuisecommitişlemleriileilgiligittarafındankayıtaltınaalınanbubilgilerdahadaönemkazanmaktadır.
Git'incommitlerinizileilgilikayıtaltınaaldığıtarihselbilgilerigörmekiçingitlogkomutunukullanıyoruz.BUkomuttümcommitlerileilgilibilgileri,ensoncommitenüstteolacakşekilde,tarihselolaraksıralar.EğerTerminalpencerenizesığımayacakkadarçoktarihselkayıtvarisesonsatırda:simgesiyeralacaktır,klavyenizdenSPACE/BOŞLUKtuşunabasarakbirsonrakisayfanınlistelenmesiniqtuşunabasarakdalistelemeninsonlandırılmasınısağlayabilirsiniz.
İyiBirCommitNasılOlmalı?
CommitTarihçesi
Terminal'delistelenenhercommittarihçesikaydı,diğerbilgilerinyanısıra,aşağıdakitemelbilgileriiçerir
Commit'inHashdeğeriCommit'igerçekleştirenkişininadıveemail'iCommittarihiCommitmesajı
CommitHash:Herbircommit'inbenzersizvetekbirtanımlayıcıdeğerivardır.Budeğergittarafındancommit'edahilolantümdeğişikliklerinizvecommit'inkendisiileilgilibilgilerdekullanılarakotomatikhesaplanır.Genelolarakgit'inlistelemelerindevebazıkomutlarınparametresiolarakbudeğerinilk7karakterininkullanılmasıyeterlidir.Çünkübuilk7karakterindenerdeysebenzersizvetekilolduğunusöyleyebiliriz.
gitlogkomutuilebirliktecommitişlemiileilgilibilgilendiriciçoğubilgiyigörmeklebirlikteparametreolarak-pdeğerinikullanırsanızdosyalardayapılandeğişikliklerdeayrıntılıolaraklsitelenecektir.
Kitabımızınilerleyenbölümlerindegitlog-pkomutuilegördüğümüzbilgilerinasılyorumlayacağımızıayrıntılıolarakelealacağız.
Bubölümümüzdeaşağıdakikonularıelealacağız
BranchingÇalışmaŞekliniziDeğiştirebilirBranch'lerİleÇalışmakDeğişiklikleriniziGeçiciOlarakKaydetmek->GitStashBasitBirBranchingAkışıDeğişiklikleriMergeEtmekFarklıBranchingİşAkışları
Branching(Dallanma)veMerging(Birleştirme)
Bazıaraçlarınsağladığıimkanlargünlükişyapmaşeklimiziçokderindenetkileyip,yaptığımızişedahafarklıbakabilmemizisağlar.Git'inbranchingyaklaşımı(Türkçe'yedallanmaolarakdaçeviebiliriz)dabahsettiğimbudönüştürücüetkiyesahiparaçlardanbirisidir.Branchingkonusundakihakimiyetimizinartmasıvesağlamlaşmasıilebirliktedahafarklıişyapmayabaşlayıpdahaiyibireryazılımgeliştiriciolabilirsiniz.
BranchingdenilenyöntemaslındaGitdışındakidiğerversiyonkontrolsistemlerindedeötedenberikullanılmaktaveyazılımgeliştiricilerinhayatınıönemliderecedekolaylaştırmaktadır.Ancak,Git'dekibranchingyaklaşımıkullanımkolaylığıveyüksekperformansınedeniylekendindehasolduğunudasöylemeliyiz.
Öyleysegelinşimdiyavaşyavaşbranching'in(dallanma)neolduğunuanlayalım.
Dahaöncekibölüm'ünsonaltbaşlığında(gitcommit)zamanzamanbireyselolarakkısazamandilimlerindeaynıprojeninfarklıözellikleriileilgilideğişiklikleryapılmasıgerekebileceğindenbahsetmiştik.Büyükprojelerdeisebudurumkişiselbirterciholmaktançıkıpişbölümü/uzmanlıkgibikriterlerebağlıolarakproje/ürünyönetimininönemlibirparçasıhalindeelealınır.Örneğin5kişilikbirekibinherbirüyesiaynıyazılımınfarklıözellikleriileilgiliçalışabilirveyaikifarklıkişiaynıözelliğinfarklışekillerdenasılgeliştirilebileceğiileilgilideneyselçalışmayapıyorolabilirler.Bahsettiğimtümbualternatifsenaryolaraslındakendiyaşamdöngüleriolabilen,çoğuzamankısaveyauzunsürelieşzamanlıilerleyenfarklıbirerbağlamadenkgelir.
Pratikteüzerindeçalıştığınızprojenin/yazılımınherzamansonstabildurumuyansıtananabirbağlamıveXnumaralıhatabildiriminindüzeltilmesi,yenibirYözelliğiüzeirndeyapılançalışmaveyadeneyselbirözellikileilgiliyapılançalışmagibibirdenfazlayanbağlamıolacaktır.
Netolarakbirbirindenayrılmışfarklıbağlamlaroluşturmakiçinbranchingbenzeriaraçlarolmasaydıaşağıdakilerebenzersenaryolardanasıldavranacağımızkonusundasıkıntılaryaşayacaktık
Örneğinmüşterinizveyayöneticinizikialtermatifsayfatasarımındanbirincisinideğildeikincisinibeğendivebuaradasizdesayfatasarımıdışındabirkaçtanebugfixvebirkaçtanededokümantasyondeğişikliğinifarklızamanlardatamamladınız.Budurumdamüşterinizinbeğendiğiikincitasarımıdiğertümdüzenlemelerikaybetmedennasıldevreyealacaktı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ülkodunutespitedipdiğermodüllerietkilemedennasılsökecektiniz?YenigeliştirdiğinizBeniHaberdarEtişleviyazılımınızıngerikalanözelliklerininbirçoğunundeğiştirilmesinesebepolmuşkenbirdenBeniHaberdarEtişlevininsaçmavegereksizolduğunakararverilseydibuişleviaradangeçenzamandayazı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.Bukarmaş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şacakFarklıdeğişikliklerientegreetmekçokzorvehatayaaçıkbirişlemolacak
Uzunlafınkısasıprojenizdekideğişiklikleriprofesyonelbiryaklaşımlaelealmakistiyorsanızfarklıbağlamlardaçalışmakvebubağlamlarıdüzgünyönetmekiçinbiryolbulmanızgerekiyor.
BranchingÇalışmaŞekliniziDeğiştirebilir
BirdenFazlaBağlamdaÇalışmak
Branchingolmasadaolurmu?
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ğerbranchlerbudeğ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ındailkgünündenitibarenciddibirgereksinimolarakelealınmıştır.Branch'lerfarklıbağlamlardaçalışmaktankaynaklanabilecekkarmaşanınönünegeçmekiçinbiçilmişkaftandır.Branch'leribugfix'ler,yeniözelliklerüzerindeçalışmakveyadeneyselözelliklerigeliştirmekiçinbolbolkullanın
Neysekibranchingvar
Git'debranchkullanımıtercihebağlıdeğildir,aslındafarkındaolmasanızbileprojenizüzerindeçalışırkenherzamanaktiftekbirbranchüzerindeçalışırsınız.Git'deprojeniziilkoluşturduğunuzdaGitvarsayılanolaraksiziniçinmasteradıveilenbirbrancholuştururvesizbubranchüzerindeçalışmayabaşlarsınız.
Gelinşimdigitbranchkomutununbasitkullanımıileilgilibirkaçörnekgörelim.
gitbranchdenemekomutunuçalıştırdığınızdagitsiziniçinprojenizdekidosyalarınoankihalinibarındırandenemeisimlibirbrancholuşturur.
Gitgitbranchkomutuileoluşturduğunuzyenibranch'iotomatikolarakaktifhalegetirmez.
Branch'inizioluşturduktansonragitbranchkomutunuçalıştırdığınızdagitsizeprojeniziçinoluşturduğunuztümbranch'lerilistelerveaktifolanbranch'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öncegelinbirdefadahagitstatuskomutuileprojemizinnedurumdaolduğunabakalım.
Yukarıdakiekrangörüntüsündedegördüğümüzüzereaktifolanmasterbranch'imizdedosya2.mdisimlidosyamızdahenüzcommitetmediğinizbirdeğişiklikvar.Budosyadakideğişikliğinyenieklediğimizbranch'deyeralmasınıistemediğimizivehenüztamanlamıylabitirilmediğinivarsayalım.Budurumdadosyadakideğişikliğicommitmietmeliyizyoksatamamengöz
Branch'lerİleÇalışmak
ardımıetmeliyiz?
VersyonKontrolününAltınKuralları
#4YarımYamalakDeğişiklikleriAslaCommitetmeyin
Tamanlamıylabitirmediğinizvetestetmediğinizbirdeğişikliğiaslacommitetmeyin.Üzerindeçalışacağınızdeğişiklikleriplanlarkenbudeğişikliklerimümkünolduğuncaküçükparçalarhalindeelealmayaözengösterirsenizyağtığınızdeğişikliklerikayıtaltınaalmakiçinhenüztamamlanmamışdeğişikliklericommitetmekzorundakalmazsınız.BunarağmenarasafhadakayıtaltınaalmakistediğinizdeğişiklikerolursaGit'inStashözelliğinikullanabilirsiniz.
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ıpyenisorunaodaklanmakzorundakalabilirsiniz.
Bugibidurumlardayenisorunileilgilienmeyebaşlamakiçinöncekideğişikliklerinizikaybetmedenyenivetemizbirbrancholuş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ınaalınmasınıveaktifbranch'inizinherhangibirdeğişikliğinolmadığıtemizbirdurumagetirilmesinisağlarsınız.gitstashkomutunuçalıştırdıktansonratekrargitstatuskomutunuçalıştırırsanızöncekibölümüdecommitedilmemişbirdeğişiklikolarakgörünendosya2.mddosyasındakideğişiklikartıklistelenmezçünkümasterbranchimizgitstashsonrasıtemizbirdurumageldi.
gitstashlistkomutunukullanarakaktifbranch'inizdegeçiciolarakkayıtaltınaaldığınızdeğişikliklerinlistelenmesinisağlayabilirsiniz.
Yukarıdagörünenlsitedeensonstashişlemiilegeçiciolarakkaydedilendeğişikliklerenüstteyeralır.Stash'deyeralanbirdeğişikliğigeriyüklemekistediğinizdeikiseçeneğinizvar
gitstashpopkomutuileyukarıdakilisteninenüstündeyeralandeğişiklikgeriyüklenecekvebudeğişikliklistedensilinecek.
DeğişiklikleriniziGeçiciOlarakKaydetmek->GitStash
gitstashapplykomutuileistediğinizdeğişikliğigeriyükleyebilirsiniz.Ancakbuişlemsonrasındayüklediğinizdeğişikliklistedensilinmeyecek.
Herhangibirdeğişikliğilistedensilmekiçingitstashdropkomutunukullanabilirsiniz.
Stashişleminiüzerindeçalıştığımızaktifbranch'imizitemizbirdurumagetirmekiçinkullanabiliriz.BunundışındaaşağıdakidurumlardadaGit'inStashözelliğinikullanabilirsiniz
Farklıbirbranch'iaktifhalegetirmedenönceRemoteRepositorydeğişiklikleriniziyereldiskinizeindirmedenönceBranch'inizimergeetmedenönce
StashBaşkaHangiDurumlardaKullanılabilir?
Gelinşimdihepbirliktegünlükçalışmanızsırasındakullanabileceğinizbasitbirbranchingakışınıelealalım.Çalışmasenaryomuzunşöylegeliştiğinidüşünelim
1. Birwebsitesiüzerindeçalışmayabaşladınız2. Busiteyeyenibirözellikeklemekiçinbirbrancholuşturdunuz3. 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öylebirdurumdaaşağıdakiadımlarıtakipedebilirsiniz
1. Aktifbranch'iniziwebsitenizinsonstabilversiyonunbulunduğumasterbrancholarakdeğiştirdiniz
gitcheckoutmasterkomutunukullandık
2. Güvenlikaçığınıgidermeçalışmanıziçinyenibirbrancholuşturdunuz.
gitbranchloginsorunukoutunukullanarakbrancholuşturdukvegitcheckoutloginsorunukomutuilebubranch'iaktif>halegetirdik
3. Güvenlikaçığınıgiderecekdeğişikliğitamamladınız,testleriniziyaptınızvebudeğişikliğiStagingArea'yaekleyipsonrasındadacommitettiniz
gitaddlogin.xyzlogin.htmllogin.cssiledeğişiklikleriStagingArea'yagönderdikgitcommit-m"Özelkarakteriçerenkullanıcıadlarındaortayaçıkangüvenliksorunugiderildi"iledeğ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
Git'debirbranchotomatikolarakobranchiçinyaptığınızsoncommitişleminebirişaretçitutarvehangidosyalarınobranch'eaitolduğunubilir.Herhangibirandabirprojeiçintekbirbranchaktifolabilir.Bubranch'eHEADdenirveWorkingCopyiçindeki(WorkingCopy'yiprojenizinyereldiskinizdekidosyalarınıntamamıolarakdüşünebilirsiniz)dosyalaraktifolanbranch'eyaniHEAD'eaittir.DiğerbranchlerinizdekidosyalardisikinizüzerindedeğilGit'inveritabanında(.gitklasörüiçinözelbirformatta)bulunur.
Farklıbirbranch'iaktifhalegetirmekiçingitcheckoutkomutukullanılır.BudurumdaGitotomatikolaraksiziniçinikişeyyapar
1. Aktifhalegetirdiğinizbranch'iHEADyaparve2. Aktifhalegetirdiğinizbranch'eaitdosyalarıGitveritabanınızdanyereldiskinizekopyalarveöncekibranch'eait
dosyalarıdiskinizdenkaldırır.YaniWorkingCopy'nizeyenibranch'eaitolandosyalarıkoyar.
BasitBirBranchingAkışı
Checkout,HEADveWorkingCopykavramları
Projemizdeyaptığımızfarklıkonularvebağlamlardakideğişiklikleritakipetmekbiröncekibölümdeanlattığımızbasitişakışıilegünlükçalışmamızdabizeciddikolaylıklarveesnekliklersunmaktadır.Ancakbranch'lerimizüzerindedeğişikliklerimizitamamlayıpStagingveCommitişlermlerimiziyaptıktansonratümbudeğişiklikleriprojemizinstabilversiyonuolanmasterbranchilemergeetmemizgerekiyor(branch->[merge]->master).Mergingenbasitanlamdaherhangibirbrach'deyaptığımızdeğişikliklerimasterbranch'imizilebirleştirmeveyamasterbranch'eentegreetmeiş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ındakarşı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şlemiyapmakisteyebilirsiniz.Tekbaşınızaçalışıyorsunuzancakfarklızamanlardafarklısebeplerilemasterbranch'emergeettğinizbirçokdüzeltmeyaptı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ındakaynakbranch'inizdetekilolarakhangideğişiklikleri(commit'ler)mergeetmekistedğinizitekersöylemezsiniz.BununyerineGit'dedorğrudankaynakbranch'inizintamamınıhedefbranch'emergeedersiniz,çünkügithangideğişikliklerinhedefbranch'debulunmadığınıotomatikolaraktespitedipsadecebunlarınentegreedilmesinisağlar.Kaynakbranch'dekideğ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'imizeentegreedildiğini(merge)kolaycagörebilirsiniz.
AncakGitmergeişleminiherzamanbukadarsadebirşekildeyapamaz,yaniGitherzamankaynakbranch'inizdekicommit'leriniziHEAD'esırasıylaentegreedemeyebilir.Budurumgenelliklehedefbranch'devekaynakbranch'debirbirindenbağımsızdeğişikliklerinyapılmasıdurumundagündemegelecektir.BudurumdaGit"mergecommit"adıverilenvehedehvekaynakbranch'dekiensoncommitilegerçekleşendeğişiklikleribirleştirenotomatikbircommitadımıeklediktensonramergeişleminigerçekleştirir.
Görsel:Tower-LearnGitsayfasındanalıntıdır
BazıdurumlardaGitbirdenfazlaotomatikmergecommitoluşturmakzorundakalabilir.Budurumdasizinhangimergeconflictnoktasınıseçipişlemindevametmesiniistediğinizibelirtmenizgerekecektir(MergeConflictResolution)
DeğişiklikleriMergeEtmek
Nasılkullanıldıklarınabağlıolarakbranch'leriikianagrupaltındatoplayabiliriz.
Bugruplamasadeceanlamsalvekullanımpratikleriileilgilibirgruplandırmadır,sonuçitibariylebranchkavramıdahaöncekibölümlerdeanlattığımızkadarbasitbirGitaracıdır
Dahaöncekibölümlerdebranchkullanımınoktasındaelinizikorkakaalıştırmamanızileilgilitavsiyelerdebulunduk.Örneğinyeniö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ızBubranch'lerüzerindekiçalışmanızgörecelikısasürmektedir.Çalışmamıztamamlandığındabubranch'lerimasterveyadahagenişkapsamdatarifedilenbirbranch'emergeedipsileriz
İkincitürdekibranch'lerisedahaüstseviyedeanlamtaşırlarveyeniözellikler,bugfixvedeneyselçalışmalargibiodaklanmışkonularyerineprojenizistabil,testvedevelopmentgibiaşamalarınıtemsilederler.Butürbranchlerprojenizüzerindegeliştirmeyaptığınızsürecevarlıklarınısürdüreceklerdir.Tipikolarakbutürbranch'lerileilgiliaşağıdakikurallargeçerlidir
Geneldebutüruzunsoluklubranchlerüzerindedoğrudandeğişiklikyapmazsınız.Çalışmalarınızıkısavadelibranchlerüzerindeyaparakdeğişiklikleribubranch'lereentegreedersiniz.Uzunsoluklubranch'lerarasındabirhiyerarşivardır.Genelliklemasterbranchprojenizinstabilversiyonudurvehiyerarşikolarakbiraltındageliştirmelerinizientegreettğinizvedahaazstabilolabilendevelopmentbranch'iyeralır.
Uzunsoluklubranch'lerinhangikriterleregöreoluşturulacağı,nasılyönetileceğiveisimlerininneolacağıgenellikleçalışanekibeveprojeyegöredeğişebilir.Ancakherhalukardanasıbirbranch'ingstratejisininizleneceğineekipolarakfikirbirliğiiçindekararverilmelidir.
Yukarıdadabelirttiğimizgibibranch'instratejileriekibeveprojeyegöredeğişebilir,ancakaşağıdaçoğuekiptarafındankullanılabilecekbasitbirişakışıkullanabilirsiniz
Dahaöncedebelirttiğimizgibibirdenfazlauzunsoluklubranchkullanabilirsinizancakçoğuzamanbutipbiryaklaşımkarışıklıklaravefazladaneforsarfetmekgibizorluklarasebepolabilir.Tekbiruzunsoluklubranchkullanmanızdurumunda(geneldemasterismikullanılır)işinizönemlimiktardasadeleşipkolaylaşacaktır.
Buyaklaşımileçalışmanızdurumundamasterbranch'inizprojenizistabilkodunubarındırmalıdır.Kodunuzunstabilolmasınıgarantilemekiçinmasterbranch'eentegreedilen(merge)tümdeğişikliklerintestler,kodokumavsgibikalitekontrolyöntemleriiledenetlenmesigerekecektir.Bununbiryansımasıolarakdeğişikliklerindoğrudanmasterbranchüzerindeyapılmamasıgibibirzorunlulukdadoğacaktır.Eğergitcheckoutmastervesonrasındagitcommitkomutlarınıçalıştırıyorsanızbilinkistabilitekuralınıihlalediyorsunuz.
BranchingİşAkışları
KısaVadeli/KonuBazlıBranch'ler
UzunSolukluBranch'ler
BasitveFaydalıBranchingStratejileri
Sadecebirtaneuzunsoluklubranchkullanın
KonuBazlıBranchler'iBolcaKullanabilirsiniz
Projeniziçinyenibirözelliküzerindeçalışmakiçin,bugfixyapmakiçinveyadeneyselözellikleriveiyileştirmelerikodlamakiçinayrıbirerbrancholuşturmaktanvebubranch'lerüzerindedeğişiklikleriniziyapmaktanimtinaetmeyin.Buyaklaşımnerdeysetümbranchingişakışlarındaçoksıkkullanılanvesizindealışkanlıkhalinegetirmenizgerekenbiryaklaşımdır.
Sadecebirtaneuzunsolukluvestabilbranch'iniz(master)olduğuiçinkonubazlıbranchlerinizinhepsinibuanabranch'ibazalarakoluşturupdeğişiklierinizitamalayıpkalitekontrolsürecinizi(testler,kodokumavs)deişlettiktensonrabudeğişiklikeritekraranabranch'inizolanmaster'aentegreetmeliziniz.
Diğeryandansizkendikonubazlıbranch'inizdedeğişiklikleriyaparkenekiparkadaşlarınızdaaradakendideğişikliklerinimasterbranch'eentegreediyorolacaklarıdır.Budurumdadakendibranch'inizimasterbranch'dekideğişikliklernedeniylegünceltutmakiçinmaster'dakideğişiklikleridekendikonubazlıbranch'inizesıkçaentegreetmelisiniz.
Bubasitakıştaunutmamanızgerekentekbiraltınkuralvar;değişiklikerinizikalitekontrolsüreçleriniziişletmedenanabranch'iniziolanveherzamanstabilolmasıgerekenmaster'aentegreetmeyinaksidurumdamasterbranch'inizinstabilitesinibozabilirsiniz.
Git'deremoteveyerelbranch'lerinizpratikolarakbirbirindentamamenbağımsızdırlar.Ancakgündelikçalışmanızsırasındakendibilgisayarınızdaoluşturduğunuzbranch'lerinuzaktakisunucudakieşleniğinindeolmasınısağlamalısınız.
Remotebranchlerileyerelbranchlerisadeceyapısalolarakdeğilyaptığınızdeğişiklikleranlamındadasenkronizeetmelisiniz.Buşekildeekibinizingerikalanıdasizinyaptığınızgünceldeğişikliklerdenhaberdarolacakilaveolarakyerelbranch'leriniziyedeğinialmışolacaksınız.
Bubölümdebahsettiğimizbasitstratejilerveişakışlarıgeneldeküçükveçevik(agile)takımlartarafındankullanımauygundur.Dahabüyükprojelerdevefarklıtakımkurgularındadahasıkıkurallarvedahafarklıbranch'ingyaklaşımlarınınkullanımınıgerektirebilir.
Gitflow,ForkingvePullRequestadıverilenalternatifişakışlarıileilgiliaramayaparakfarklıyaklaşımlarıkendinizinceleyebilirsiniz.
RemoteveYerelBranch'leriniziSenkronizeEdin
DeğişiklikleriniziSıkçaRemoteBranch'lereYükleyin(Push)
DiğerBranchingStratejiler
Günlükçalışmamızsırasındastagingvecommitgibiversiyonkontrolüileilgiliişlemlerinçoğunuyereldiskimizdeyeralanlocalrepositoryüzerindeyaparız.Proje'deçalışantekkişisizisenizmuhtemelenInternet'deveyayerelağıdayeralanremotebirepositoryoluşturmanızadagerekolmayacaktır.
Ancaktakımçalışmasısözkonusuolduğunda,takımdakigeliştiricilerinbirlikteçalışabilmesiiçinherkesindeğişiklikleriniortakbiralandayayınlamasıvediğerlerinindebuortakalanüzerindenbudeğişikliklerikendibranch'lerineentegreetmesigerekecektir.BudurumdabaşvuracağınızenetkinaraçGit'dekiRemoteRepositoryişlevleridir.Remoterepository'lerienbasitanlamdatümekibinerişimiolandosyalsunucusuolarakdüşünebilirsiniz.
GelinşimdiLocalveRemoterepository'leribirbirindenayırantemelözellikleregözatalım
Localrepository'lergeliştiricilerinkendibilgisayarlarındayeralırkenRemoterepository'ler,çoğunluklainternetolmaküzere,ekiptekiherkesinerişebileceğibirsunucudayeralırlar.
Teknikolarakremoterepository'lerilelocalrepositorylerarasındabirfarkyoktur.Localrepository'leriçinöncekibölümlerdeelealdığımızcommitişlemi,brancholuşturmagibiişlemlerintamamıremoterepository'leriçindeyapılabiliyor.Ancaktümbubenzerliklererağmenremoterepository'leriçinWorkingCopy(aktifbranch'dekidosyalarındiskimizdekikopyaları)yapısıgeçerlideğildir,remoterpository'lerdesadeceGit'inveritabanınıntutulduğu.gitklasörüyeralır.
Localbirrepositoryancakikişekildeoluşturulabilir
BoşbirrepositoryolaraksıfırdangitinitkomutuileoluşturabilirsinizveyaRemotebirrepository'yigitclonekomutuileyereldiskinizdeindirebilirsiniz.
Remoterepository'lerdeikiyöntemileoluşturulabilir
Localrepository'nizigitclonekomutunu--bareparametresiilekullanarakremotebirrepoository'yeklonlayabilirsinizveyaBoşbirremoterepositoryoluşturmakiçingitinitkomutunuyine--bareparametresiilekullanabilirsiniz.
Git'deremoterepositoryişlemleriiçinazsayıdakomutvardır.GünlükçalışmamızsrasındabölümünbaşındadabelirttiğimizgibiGitiş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ırRemoteRepository'dekiVerilerinİncelenmesiRemoteDeğişiklikleriEntegreEtmekLocalBirBranch'iYayınlamak(Publish)Branch'leriSilmek
RemoteRepository'ler
Konum
Özellikler
RepositoryOluşturma
Local/Remoteişakışı
Remotebirrepository'yiyereldiskinizegitclonekomutuileindirdiğinizdeGitotomatikolarakbuişlemiyapmakiçinkullandığınızbağlantıbilgilerinihatırlar.Gitbubilgi'yivarsayılanolarakoriginadıverilenremotebirrepositoryolarakkayıtaltınaalır.Localolanbirrespositoryiçiniseböylebirbilgitutulmaz.AncakbölümgirişindedeelealdığımızgibiLocalbirrepository'yibazalarakyenibirremoterepositoryoluşturabiliriz.Bununiçingitclonekomutunukullanabiliriz.Örneğin
Yukarıdakiekrangörüntüsündeilkkomutumuzolangitremoteaddilelocalrepository'mizileremoterepository'mizarasındakbağlantıyıkuruyoruz.İkincikomutumuzolangitremote-vilederemoterepositorymizileilgilibilgilerigörebiliriz.
Dikkatettiysenizherbirremoterepositoryiçinbirifetchdiğeridepushişlemleriiçinkullanılanikiadresbulunur.fetchadresiniremoterepository'denyapılacakolanokumaişlemleri,pushadresinideremoterepository'yeyapılanyazmaişlemleriiçinkullanılır.Genelolarakbuikiadresaynıolmaklabirlikteperformansvegüvenlikgibigerekçelerileikifarklıadresdekullanılabilir.
Localbirrepository'niziistediğinizsayıdaremoterepositoryileilişkilendirebilirsiniz.Yukarıdakiekrançıktısındasadecebizimoluşturduğumuzgit101_ornekisimliremotelisteleniyor,birdenfazlaremoteilişkisiolsaydıhepsilistelenecekti.
RemoteBirRepository'yeBağlantıSağlamak
gitclonekomuturemotebirrepository'yiyereldiskimizeindirdiktensonragitbranch-vakomutunuçalıştırdığımızdaaşağıdakigörüntüdeyeralanbilgilerlistelenecektir.
Dikkatedecekolursanızlocalrepository'lerimizhalayerindeduruyorancaklistemizdeilaveolarakorigin/HEADveorigin/masterisimliikiremotekaydıvar.Pekiyidahaöncekibölümdegitaddgit101_ornekkomutuileoluşturduğumuzremoterepositorykayıtlarımıznedenlistlenmiyor?Bununnedeniöncekibölümdekullandığımızgitaddkomutuilelocalveremoterepositoryarasındasadecebirilişki/bağlantıtanımladık,aslındabukomutsonrasındalocalveremotearasındaherhangibirveritrasferigerçekleşmez.
RemoteRepositorybilgilerigüncelolmayabilir!Gitremoterepository'lerileilgiliyereldiskinizdebirtakımbilgileriiçerir.AncakGitarakplandaotomatikolarakbubilgilerisiziniçinbelirliaralıklardagüncellemez!BuişlemingerçekleşmesivesizindiğertakımarkadaşlarınızyaptığıdeğişikliklerdenhaberdarolabilmeniziçinGit'ebubilgilerigüncellemesinisöylemenizgerekir.
Git'inremoterepositoryileilgiliyereldiskinizdetuttuğubilgilerigüncellemesinisağlamakiçingitfetchkomutunukullanmanızgerekir.
FetchkomutuyereldiskinizdekibranchlerinizeveWorkingCopy'dekidosyalarınızıgüncellemezveyadeğiştirmez.Bukomutilesadecetakımarkadaşlarınızınremoterepository'deyayınladıklarıdeğişikliklereilişkinbilgileryereldiskinizeindirilir.Dahasonrabudeğişikliklerdenhangilerinihangilocalbranch'eentegreedeceğinizekendinizkararverebilirsiniz.
Buişlemdensonratekrargitbranch-vakomutunuçalıştırdığımızdagitornek_101/masterisimliremoterepositorymizdekibranchlereilişkinbilgileridegörebiliriz.
Bilgilerinigüncellediğimizgit101_ornek/masterisimlibranch'dedeğişiklikleryapmakiçinönceliklebubranch'ibazalarakyenibirlocalbrancholuşturupdosyalarınWorkingCopyalanımızakopyalanmasınısağlamamızgerekiyor.Bununiçingitcheckoutkomutunu--trackparametresiilekullnıyoruz.
gitcheckout--trackkomutuileaşağıdakiişlemlergerçekleşir
1. Remotebranchileaynıisimdelocalbirbrancholuşturulur2. Yenioluşturulanbranchaktifhalegetirilir3. --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ındabirbirindentamamenbağımsızdırvearalarındadoğrudanbirilişkiyoktur.Ancaktrackparametresiilelocalbirbranch'inhangiremotebranch'dekideğişiklikleritakipedeceğinitanımlayabiliriz.BudurumdaGitikibranch'denherhangibirindeyeralanancakdiğerindeyeralmayancommit'leritespitederekbizibilgilendirecektir.Yani
Localbranch'inizderemotebranch'eyayınlamadığınız(push)commit'lervarsabudurumdalocalbranch'inizinremotebranch'denönde(ahead)olduğuTakımarkadaşlarınızremotebranch'ebazıcommitleripushettiğindevesizdelocalbranch'inizigüncellemediğinizdurumdalocalbranch'iniziremotebranch'ingerisinde(behind)olduğubilgisiGittarafından"TrackingRelationship"tanımısayesindegitstatuskomutununçıktısıolarakgösterilir
RemoteRepository'dekiVerilerinİncelenmesi
Localbranch'imizihazırladığımızagöregelinşimdibirkaçdeğişiklikyapalım.BudeğişiklikleriyaptıktansonraherzamankigibiöncedeğişikliklerimiziStagingArea'yaalıyoruzvesonrasındadacommitişleminigerçekleştirereklocalrepository'deversyonkontrolüneilişkinişlemlerimizibitiriyoruz.Sonadımolarakdagitpushkomutuilelocaldekibudeğişikliklerimiziremotebranch'deyayınlıyoruz.
gitpushpushkomutuaslındagitpushformatındadır.Ancaklocalbranch'imizioluştururkenkullandığımıztrackparametresisayesindekurulan"Takipİlişkisi"sayesindepushkomutununuzunhaliyerinesadehaliolangitpushformatındakullanabiliyoruz.
Takımarkadaşlarınızkendideğişikliklerinitamamlayıpremotebranch'deyayınladıktansonrasizdebudeğişiklikleriinceleyipkendilocalbranch'inizeentegreederekçalışmanızadevamedebilirsiniz.Ancakremotebranch'dekideğişikliklerientegreetmedenöncebudeğişikliklereilişkinbilgileri(dosyalarıdeğilsadecedeğişiklikleredairGit'detutulanbilgiler)görmenizveincelemenizgerekir.
Remotebranch'dekideğişiklikleridirmekiçingitfetchkomutunukullanıyoruz.Gitfetchkomutunageçilenorigindeğeriisedahaöncekibölümlerdegösterdiğimizremotes/origin/masterisimliremotebranchbağlantısınareferansvermekiçinkullanılır.
origindeğerigitfetchkomutununbirparçasıdeğilsadecebirparametre.Originyerinedahaöncelocalbranchimizilebağlantısını/ilişkisinikurduğumuzherhangibirremotebranch'igösterenbirdeğerolabilir.
gitfetchkomutuileremotebranch'dekideğişiklikleriindirdiktensonraisegitlogkomutunukullanarakburemotebranch'dekideğişikliklerileilgilibilgilerigörebiliriz.(değişikliktarihi,kiminyaptığı,değişendosyalarvecommtisırasındagirilenmesajgibi)
Değişiklikleriincelediktensonrabunlarılocalbranch'inizeentegreetmeyekararverdiğimizdeisegitpullkomutunukullanmamızgerekecek
Remotebranchdekideğişikliklerinbilgileriniindirmekiçinkullanılanfetch(türkçeanlamıgetirmek)vebudeğişikliklerientegreetmekiçinkullanılanpull(türkçeanlamıçekmek)ifadelerininbirbirineyakınanlamlarıolduğuiçinkarıştırabilirsiniz.Bukarışıklığınönünegeçmekiçinyapacağınızengüzelşeygitpullkomutunuhiçkullanmamakolacaktır.AyrıntılariçinİngilizcebirblogpostolanGit:fetchandmerge,don'tpullinceleyebilirsiniz.
Gitpullkomutuaslındaarkaarkayaikişeyyapmanızısağlar
Remotebranch'dekideğişikliklerileilgilibilgileriindirmek,yanigitfetchRemotebranch'dekideğişikliklerilocalbranch'inizeentegreetmekyanigitmerge
İlerleyenbölümlerdeçakışmalarıntespitedilmesi,çözülmesivedeğişikliklerinentegreedilmesikonularınıayrıntılıolarakelealacağızşimdiliksadeceişakışımızıözetleyipbukonuyuburadasonlandıralım.Akışımızözetleşöyleolacak
gitfetch:remote'dangüncellemebilgileriniindirgitdiff:remotevelocalarasındakifarklarıincelegitmerge:değişiklikleriotomatikmergeetçakışmavarsabirsonrakiadımageçinÇakışmaolandosyalarınızıaçınveçakışmalarıdüzeltingitadd:çakışmanıngiderildivedeğişiiklikStagingArea'yaalındı
RemoteDeğişiklikleriEntegreEtmek
KendibilgisayarınızdaoluşturduğunuzLocalbirbranchsizyayınlamayakararvermediğinizsürecesadecesizinbilgisayarınızdayeralacaktır.Yanilocalbazıbranchlerinizisadecekendibilgisayarınızdatutarkenistediklerinizidetakımarkadaşlarınızvehattatümdünyailepaylaşabilirsiniz.
Gelinşimdisuperyeniozellikisimlilocalbranch'iremoterepositorymizdepaylaşalım.
Öncegitcheckoutkomutuilebranch'imiziaktifhalegetiriyoruzvesonragitpushkomutuve-useçeneğiilelocalbranch'imiziremoterepository'mizdeyayınlıyoruz.PushkomutuiçinverdiğimizoriginvesuperyeniozellikdeğerleriileHEADbranch'imizioriginremoterepository'desuperyeniozellikisimlibrancholarakyayınlanmasınıistediğimizitanı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şikliklerigitpushkomutunuparametresizkullanarakremotebranch'imizdeyayınlayabiliriz.
Artıkremoterepository'yeerişimyetkisiolanherkessuperyeniozellikisimlibubranchinizigörebilirvebubranch'ibazalarakkendideğişiklikleriüzerindeçalışmayapabilir.
LocalBirBranch'iYayınlamak(Publish)
Biröncekibölümdeoluşturduğumuzsuperyeniozellikisimlibranchüzerindekiçalışmamızıtamamlayıpkalitekontrolsürecimizideişlettiktensonrabudeğişikliklerimasterbranch'imizeentegreettiğimizivarsaylım.Buentegrasyonsonrasındasuperyeniozellikisimlibranch'eihtiyacımızyokveartıkbubranch'isilebiliriz.Bubranch'ikendibilgisayarımızdansilmekiçingitbranch-dsuperyeniozellikkomutunu,remoterepository'densilmekiçindegitbranch-drsuperyeniozellikkomutunukullanabiliriz.
Silmekistediğinizlocalbranchaktifisegitbranch-dkomutuhataverecektir.Silmeişlemiöncesindesileceğinizlocalbranch'denfarklıbirbranch'igitcheckoutkomutuileaktifhalegetirmeyiunutmayın.
Remotebranch'igitbranch-drkomutuilesildiğinizhalderemoterepository'yeerişipbranchlerikontroledersenizsuperyeniozellikisimlibranch'insunucudahaladurduğunuzgöreceksiniz.Bununnedenigitbranch-drkomutundakiseçeneklerdenrseçeneğininsuncudakibranch'ideğilyerelbilgisayarınızdaremotebranchbilgilerinisiler.Budeğişikliğinsuncudadageçerliolmasıiçinyanisunucudakibranch'idesilmekiçingitpushorigin:superyeniozellikkomutuiledeğişikliğibiranlamdaremoterepositry'deyayınlamanızgerekiyor.
Dahaayrıntılıbilgiiçinbakınız(StackOverflow-İngilizce)
Branch'leriSilmek
Bubölümdeaşağıdakiileriseviyeişlemleriveilişkilikomutlarıelealacağız
DeğişiklikleriniziGeriAlmakVersiyonlarArasındakiFarklarıİncelemekÇakışmalarıGidermekMergeAlternatifiOlarakRebaseKullanımı
İleriSeviyeKomutlarveİşlemler
Git'inengüzelyanlarındanbirideyaptığınızherhangibirdeğişikliğikolaycagerialabilmemızıağlamasıdır.
Commitişlemlerinizinekadardikkatliyaparsanızyapınbazencommit'edahiletmeyiunuttuğunuzveyayanlışlıkladahilettiğinizdosyalarolabilirveyacommitmesajındaeksikbilgivermişolabilirsiniz.Budurumdasoncommitişleminiziyenidenyapmakiçingitcommitkomutunu--amendseçeneğiilekullanabilirsiniz.Sadececommitmesajınızıdeğiştirmekistiyorsanız--amend-mseçenekleriilegitcommitkomutunuçalıştırabilirsiniz,eğersoncommit'edosyaeklemekveyadosyaçı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çenekiledüzeltemeyiz.Buseçenekilecommitişlemisonrasındabiröncekicommitişleminedairbilgilersilinir.Projeüzerindeçalışantekkişiisenizbuseçeneğikullanmanızsorunyaratmayacaktırancakbirtakımiçindeyeralıyorsanızdiğertakımarkadaşlarınızsonradan--amendiledüzeltttiğinizhatalıcommitişleminizibazalarakkendileridedeğişiklikleryapmışolabilirler.Budurumtakımarkadaşlarınıziçinsorunoluşturacaktır,çünküonlarınbazaldıklarıcommitileilgiliGit'deartıkherhangibirkayıtyeralmaycak.
HenüzcommitetmediğimizdeğişiklikliklereLocaldeğişiklikdenir.Bazenöncekihalindendahakötüolankodyazabilirsinizvebudeğişikliğigerialmakisteyebilirsiniz.Bugibidurumlardadeğiştirdiğinizhalindenmemnunolmadığınızdosyadakideğişikliklerigerialıpdosyanınsoncommitedilmişhalinegeridönmekistediğinizde,öncekibölümlerdedesıkcakullandığı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'nizegeriyü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.
Hatalıbirdüzenlemeyaptığınızda(kibugeneldetestedilmedenyapılancommit'lersonrasındaoluşanbirdurumdur)veya
DeğişiklikleriniziGeriAlmak
SonCommitBilgileriniDüzeltmek
LocalDeğişiklikleriGeriAlmak
CommitEdilenBirDeğişikliğiGeriAlmak
geliştirdiğinizbirözelliğinartıkgerekliolmadığınakararverildiğindeyaptığınızdeğişikliğigerialmanızgerekecektir.
gitrevertkomutucommitettiğinizherhangibirdeğişikliğigerialmakiçinkullanılır.Bukomutilecommitişleminizinkendisiveyabilgilerisilinmezsadececommitişleminizdekideğişiklikgerialınır.Örneğineklediğinizbirsatırıkaldırmakistersenizgitrevertkomutuilebunuyapabilirsiniz.Aslındagitrevertkomutudeğişkliğinizigerialmakiçinotomatikolarakyenibircommitoluştururvegerialmaişlemibucommitsayesindedeğişikliktarihçesindegörünürhalegelir.
Yukarıdakiekrangörüntüsündeilköncegitrevertkomutunuçalıştırdık.Bukomutunenönemliparametresigerialmakistediğimizcommit'inhashdeğeri(hash'inilkaltıkarakterinikullanabiliriz).Komutuçalıştırdıktansonradeğişikliktarihçesiniincelediğimizdegit'inotomatikolarakbircommitoluşturduğunuvebucommit'inbilgilerindehangideğişikliğingerialındığınadairayrıntılarınyeraldığınıgörüyoruz.
Değişikliklerigerialmakiçinkullanabileceğimizdiğerbirkomuisegitresetkomutun.Bukomutdaherhangibirbilginizisilmedenişlemigerçekleştirir,ancahgitrevertkomutundanfarklıolarakotomatikyenibircommitüretmedendeğişikliğinizigerialmanızısağlar.
Bukomutiçindegitrevertkomutundaolduğugibigerialmakistediğimizcommit'inhashdeğeriniveriyoruz.Kullandığımızdiğerbirseçenekolan--hardseçeneğiiselocaltümcommitlerinizisilerekgerialmaişlemininyapılmasınanedenolur,bunedenle--hardseçeneğinikulllanırkendikkatliolmalısınız.Localcommit'lerinizinkorunmasınıistiyorsanız--keepkomutunukullanabilirsiniz.
30güniadegarantisi!gitresetkomutuilegerialmaişlemisonrasındagerialdığınıznoktadansonrakitümdeğişikliklertarihçedensilinecektir.Ancakgitbusilinenbilgileri30günkadarveritabanındatutmayadevamedecektir.Eğeryanlışlıklagerialmaişlemiyaptığınızıfarkederseniz30güniçindesilinenherhangibircommit'inizigerialabilirsiniz.
30günlüksürenasıldeğiştirilebiliriSilinencommithangikomutlarilegerialınır
Dahaöncekibölümlerdebolcakullandığımızgitstatusvegitlogkomutlarıyaptığınızdeğişikliklerileilgiliönemlibilgilersunar.Ancakbuikikomutilesadecedeğişikliklerimizingenelbilgilerinigörebiliriz,dosyalarımızdayaptığımızdeğişikliklerinayrıntılarınıbukomutlarilegöremeyiz.Git'debuikikomutdışındadeğişikliklerivefarklarıincelemekiçinfarklıkomutlardayeralır.
Versiyonkontrolsistemlerindeikiversiyonarasındakideğişikliklereİngilizcedifference(fark)kelimesininkısaltmasıolandiffdenir.Git'deikiversiyonarasındakifarklarıgörmekiçingitdiffkomutunukullanabilirsiniz.Örneğingitdiff374c6f..5d903edosya1.mdkomutuiledosya1.mddosyasının374c6fve5d903ehash'licommmitlerdekiikiversiyonunundiff'inialıyoruz.
gitdiffkomutunuçalıştırdığımızdayukarıdakigibibirekranilekarşılaşacaksınız.Gelinşimdibuekrandanumaralandırdığımızönemlialanlardahangibilgilerinbizegösterildiğinielealalım
1. KarşılaştırılanDosyalar(A/B):Diffkomutuikidosyayıbirbiriilekarşılaştırır,AdosyasıveBdosyası.BuAveBdosyalarıgeneldeaynıdosyanın(bizimörneğimizdedosya1.md)farklıversiyonlarıdır.Çoksıkolmasadadiffişlemiiletamamenfarklıolandosyaları(örneğindosya1.mdvedosya1_enyeni.md)dakarşılaştırabilirsiniz.HangidosyalarınkarşılaştırıldığınıaçıkçabelirtmekiçindiffkomutununçıktısıherzamanhangidosyanınAhangidosyanındaBolduğunubelirterekbaşlar.
Bubilgininhemenaltındaindexilebaşlayansatırdapratikolarakpekişinizeyaramayacakdosyabilgileriyeralır.Bubilgilerdenilkikisikarçılaştırılanversiyonlarınhashdeğerisonuncusuda(1000644)dosyamodubilgisidir.
2. A/BDosyaSimgeleri:DosyaiçeriğininhangikısmınınAhangikısmınındaBdosyasınaaitolduğunubelirtmekiçinkullanılan-ve+sembollerindenhangisininhangidosyayaaitolduğubilgisi.
3. Farkİşaretçileri:Diffkomutuilesadeceikidosya(aslındaversiyondadenilebilir)arasındakifarklarınolduğusatırlargösterilir,dosyanıntamamı(değişmeyensatırlardadahil)gösterilmez.@@simgeleriilebaşlayansatırdaAveBdosyalarıarasındakifarklısatırlarınhangisatırdanbaşlayıpkaçsatırolduğubilgisigösterilir.Bizimekrangörüntümüzdeyeralan@@-1,4+1,2@@bilgisibizeşunusöyler
(-)simgesiiletanımlananAdosyasından1.satırdanbaşlayarak4satır,+simgesiiletanımlananBdosyasından1.satırdanbaşlayarak2satırbirbirindenfarklı
4. DeğişiklikleriOkumak:Değişenhersatırınbaşında(-)veya(+)simgesiyeralır.BusimgelerileAveBversiyonlarınıniçeriğininneolduğunuanlamamızdabizeyardımcıolacaktır.Örnekekrangörüntüsünde(-)ilebaşlayanveAversiyondakisatırlarındahasonra(+)ilebaşlayanBversiyonundakisatırlariledeğiştirildiğinigörüyoruz.
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çindoğrudangitdiffkomutunuherhangibirparametreveyaseçenekbelirtedenkullanabilirsiniz.
SadeceStagingArea'yacommitedilmeküzereeklenmiş/çıkarılmışdosyalardakideğişikliklergörmekistersenizgitdiff--stagedkomutunukullanabilirsiniz.
VersiyonlarArasındakiFarklarıİncelemek
İkiversiyonarasındakifarklarıyorumlamak
LocalBranch'dekifarklarıincelemek
Commitedilmişdosyalardakifarklarıgörmek
gitlogkomutunucommitişlemleriileilgiliözetbilgilerigörmekiçinkullanabiliriz.Bukomutuherhangibirparametreveyaseçenekbelirtmedenkullanırsanızdosyaiçeriğindekifarklarıgöremezsiniz.Dosyalarıniçeriğindekifarklarıdagörmekiçingitlogkomutunu-pseçeneğiilekullanabilirsiniz.
$gitlog-pşeklinde
İkifarklıbranch'inarasındakiiçerikfarklarınıgörmekiçingitdiffkomutunakarşılaştırmakistediğinizbranchisimleriniparemetreolarakverebilirsiniz.Örneğinmasterilesuperyeniozellikbranch'inikarşılaştırmakiçingitdiffkomutuaşağıdakigibioalcaktır
$gitdiffmaster..superyeniozellik
Branch'lerikarşılaştırabildiğinizgibiikifarklıversiyonarasındakitümdosyalarıniçeriğinideversiyonlarınhashdeğerlerinigitdiffkomutunaparametreolarakvererekkarşılaştırabiliriz.Örneğin
$gitdiff74c6f..5d903e
komutuile74c6fhashdeğeriolancommit(versiyon)ile5d903ehashdeğerinesahipcommit'indosyalarıarasındakifarklarıgörebilirsiniz.
İkiFarklıBranch'iKarşılaştırmak
Versiyonkontrolüileilgiliinsanlarınensevmediklerivekorktuklarışeydeğişikliklerientegreetme(merge)işlemisırasındaoluşançakışmalarvebuçakışmalarınçözülmesisürecidir.Bubölümdeçakışmalardankorkmamamızgerektiğinievçakışmalarıenkolayveefektifbirşekildenasılçözebileceğimizielealacağız.
Gitileçalışıyorsanızistediğinizzamanyanlışyaptığınızdeğişiklikentegreetmeişleminigerialarakbuişlemetemizdosyalarileyenidenbaşlayabilirsiniz.BukonudaGit'egüvenmenizyeterliolacaktır.MergeişlemisırasındaişinçoğunuGitsizinyerinizeotomatikolarakyapacakvesizesadecebasitçakışmalarıçözmekkalacaktır.Git'indiğerbirgüzeltarafıiseçakışmalarınsadecekendilocalbranch'inizdeolmasıvehiçbirzamansunucutarafındaolamamasıdır.Böylecemergeişlemisırasındameydanagelençakışmadatakımarkadaşlarınızetkilenmeyecektir.
Git'demergeişlemibşakabirbranch'dekideğişiklikleriüzerindeçalıştığınızkendibranch'inizeentegreetmeişlemidir.Gitmergeişlemisırasındadeğişikliklerinçoğunusiziniçinotomatikolarakentegreeder.
AncakbazıdurumlardaGitmergeişleminiotomatikolarakgerçekleştiremezvesizinmüdahaleederekhangideğişikliğinnası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'inizenasılentegreedileceğinekararvermenizgerekir.BudurumdaGitdosyanızıconflicted(çakışmalı)olarakişaretlervesizinçalışmanızadevamedebilmeniziçinbuçakışmayıçözmenizgerekir.
Çakışmaoluştuğundailkyapmanızgerekenşeyçakışmanınnedenolduğunuanlamakolmalıdır.Örneğintakımarkadaşınızaynıdosyadasizindedeğiştirdiğinizbirsatırımıdeğiştirdiveyaaynıdısyadabirsatırmısildiveyasizinleaynıisimliyenibirdosyamı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çindosyamı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'imizdeolanversiyonunaait================belirtecindensonrakikısımdadeğişikliklerientegreetmekistediğinizbranch'deyeralandosyanı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şleminitamamlıyoruz.
ÇakışmalarıGidermek
Gitilegüvendesiniz
ÇakışmaNasılOluşur?
ÇakışmalarıNasılÇözeriz
$gitadddosya1.mdiledosyamızıStagingArea'yaekliyoruz$gitcommit-m"değişikliklerentegreedildi"komutuiledecommitişleminitamamlarız.
Dosyanızınmergeişleminebaşlamadanöncekihalineistediğinizzamangeridönebilirsiniz.Bununiçinyapmanızgerekentekşeygitmerge--abortkomutunuçalıştırmak.
MergeİşleminiNasılGeriAlabiliriz?
Mergekomutuikibrancharasındakideğişikliklerientegreetmeninenkolayyoluolmaklabirliktetekyoldeğildir.Rebasekomutudaikibranch'ıentegreetmekiçinkullanılanmergekomutunaalternatifbirkomuttur.Budurumdakafanızda"Nedenmergeyerinerebasekullanmakisteyelim?"şeklindebirsoruoluşabilir.Busorununcevabınıbulmakiçinöncegelinmergekomutununbirazdahaiyianlamayaçalışalım.
Gitmergeişleminigerçekleştirmedenönceaşağıdakiüçcommit'itespiteder
İkibranch'inortakcommit'i:İkibranch'indetarihçesinidahayakındanincelediğinizdebubranch'lerinzamanınbirnoktası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.
Basitbazıdurumlardabranch'lerdenbirtanesindeherhangibirdeğişiklikyapılmamıştırvebubranch'inyukarıdakibölümdebelirttiğimizortakcommit'ivesoncommit'iaynıdır.Budurumdamergeişlemiçokbasitleşirvegitdiğerbranch'intümcommit'leriniortakcommit'inüzerineekleyerekmergeişleminiyapar.BuözeldurumaGitterminolojisinde"Fast-ForwardMerge"denirveherikibranch'intarihçesideortaktır.
Fakatçoğuzamanherikibranch'debirbirindenbağımsızolarakdeğişikliğeuğrarvetarihçeaçısındanbirbirindenuzaklaşırlar.BudurumdamergeişleminiyapmakiçinGit'inherikibrancharasındakideğişiklikleriiçerenotomatikbircommitoluşturmasıgerekir.Oluşturulanbucommit'eGitterminolojisinde"MergeCommit"denir.
Normalcommit'leriyazılımgeliştiricilerinceeleyipsıkdokuyarakoluşturulurlar,diğeryandanMergeCommitleriseGittarafındanotomatikoluşturulurlar.Mergeişlemiileilgiliayrıntılarıdahasonradanincelemekistersenizherikibranch'incommittarihçesinevecommitçizelgesinebakmanızgerekir.
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'yaentegreedeceğizRebaseişleminigitrebasekomutunuaşağıdakigibikullanarakyapıyoruz.
$gitrebaseBranch-B
BukomutileGitöncelikleBranch-AileBranch-B'ninortakensoncommit'inibuluportakcommitsonrasındaBranch-A'dayapılandiğertümcommit'lerigerialır.Aslındabucommitlersilinmezsadecegeçiciolarakfarklıbiryerdesaklanır.DahasonraBranch-B'dekitümcommitlerBranch-A'yauygulanır.SonaşamadaiseBranch-A'nıngeçiciolarakfarklıbiryerdesaklanancommit'leritekraruygulanır.BuişlemlersonrasındatümdeğişikliklersankisadeceBranch-Aüzerindegerçekleşmişgibigörünür.
MergeAlternatifiOlarakRebaseKullanımı
Mergekomutunadahayakınbirbakış
Fast-ForwardveMergeCommit
NormalCommitleriveMergeCommitleriAyırdetmek
Rebaseiledeğişikliklerientegreetmek
Bubölümdeaşağıdakikonulardanbahsedeceğiz
GörselGitistemcileriGitilekullanılabilecekdiff/mergearaçlarıGitservisleriKaynaklarveReferanslar
GitAraçveServisleri
ÖncekibölümlerdeTerminalkullanarakbirçokGitkomutunununnasılkullanıldığınısizegösterdik.Ancakgünlükçalışmanızdaherbirkomutunayrıntılıolarakneişeyaradığını,hangiparametrelerveseçeneklerikabulettiğiniaklınızdatutumakzorolacaktır.BunedenleGit'igünlükişakışınızaentegreedipGitkavramlarınıöğrendiktensonragörselbirGitistermcisikullanmakişiniziciddiorandakolaylaştıracaktır.
SourceTreeücretsizbiruygulamadırveMacOSX,WindowsveLinuxişletimsistemlerindeçalışmaktadır.
SourceTree'yibulinktenindirebilirsiniz
GitEye:Linux'unyanısıraOSXveWindowsişletimsistemlerindedekullanılabilir.gitggiggleGitForceRabbitVCS
Tower,sadeceMacOSX'deçalışanücretlibiruygulama.Bulinkikullanarakuygulamanın30günlükdenemesürümünüindirebilirsiniz.
ProjelerinizinkaynakkodunuGitHub'datutuyorsanızGitHub'ınücretsizMacOSXveWindowsiçingeliştirdiğikullanımıoldukçakolayolanveGit'inkarmaşasındansizibirnebzeolsunuzaklaştırabilecekuygulamasınıkullanabilirsiniz.BuuygulamanınMacOSXversiyonunuburadanveWindowsversiyonunudaburadanindirebilirsiniz.
WindowsversiyonundaGitShellisimliTerminalbenzeriuygulamanınkurulumudayeralıyor.BunedenledahakarmaşıkGitkomutlarıiçinTerminalbenzeribirdeneyimistiyorsanızGitShell'irahatlıklakullanabilirsiniz.
WindowskullananlarücretsizbiruygulamaolanTortoiseGituygulamasınıbulinktenindiripkullanabilirler.ÖzellikledahaönceSubversionveTortoiseSVNkullananlariçinTortoiseGitbenzerbirdeneyimsunmaktadır.
DiğergörselGituygulamalarınıGit'inkendisayfasındaninceleyebilirsiniz.
GörselGitİstemcileri
AtlassianSourceTree
Linux'aÖzelİstemciler
Tower
GitHub
TortoiseGit
DiğerUygulamalar
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ğinevebufarklar'ınasılokuyabileceğimizedeğinmiştik.AncakbüyükprojelerdeGit'insunduğubuişlevilefarklarıokumakçokkolayolmayacaktır.Bunedenlefarklarıdaharahatinceleyebilmekiçinbufarklarırenklerveformatlamayöntemleriilegö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'inFileMergearacınıkullanabilirsiniz.
Diff/MergeAraçları
Takımçalışmasısözkonusuolduğundaenönemlikonulardanbirisidekaynakkodununveyadahagenelanlamdadosyaları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üşükmaliyetDosyalarınızkendisunucularınzdadırGit'inveyahangiversiyonkontrolsisteminikullanıyorsanızbusistemintümözellikleriniistediğinizgibikullanabilirsiniz.
Ancakbuseçeneğinaşağıdakidezavantajlarınıdagözardıedemeyiz
SunucularınçalışırhaldeveerişilebilirolmasınısağlamaksizinsorumluluğunuzdadırYedeklemesorumluluğusizdeolacakGüvenlikveyazılımgüncellemelerinidesizintakipetmenizgerekir
Eğersunucukaynaklarıyeterliolan,yedekleme,güncellemegibisunucuyönetimikonularındaayrıveuzmanekibiolanbirkurumdaçalışıyorsanızdosyalarınızıkendisunucularınızdabarındırmakilktercihinizolacaktır.Ancakküçükbirgirişimsenizveyaaçıkkaynakbirprojenizvarsasunucuyönetimiileilgiliyeterinceuzmanlığınızvekaynağınızolmayabilir.Budurumdadosyalarınızıonlinebirservisüzerindebarındırmakveburadanpaylaşımaaçmaksiziniçindahamantıklıolacaktır.
ÖzellikleaçıkkaynakprojeleriçinoldukçapopülerbirservisolanGitHub'ıkullanabilirsiniz.GitHubaçıkkaynakprojeleriçinücretsizolmaklabirlikte,kurumlarveözelprojeleriçindeoldukçamakulfiyatlaraGitsunucuhizmet'isunmaktadır
GitHubAnaSayfa
DahaönceküçükbirgirişimolarakMercurial(budadağıtıkbirversiyonkontrolsistemi)hizmetisunmakiçinkurulanBitBucketAtlassiantarafındansatınalındıktansonraGitsunucuhizmetidesunmayabaşladı.BitBucketaçıkkaynakveyaözel5kullanıcıyakadarolansınırsızsayıdaprojeniziçinücretsizhizmetsunaraynızamandaoldukçamakulfiyatlaradadahafazlakullanıcıiçinücretlishizmetseçeneğidevar.
BitBucketAnaSayfa
GitServisleri
GitHub
BitBucket
Gitoldukçaçokseçeneğivefarklıkullanımşekliolanbirdağıtıkbirversiyonkontrolsistemidir.Gitileilgilidahafazlabilgiedinmekistiyorsanızönceiyiderecedeİngilizceöğrenmenizitavsiyeediyorum.DahasonradaaşağıdakikaynaklardanbaşlayarakGitileilgilibilginiziarttırabilirsinzi.
1. Git-ScmReferansDokümanı2. GitRefReferansDokümanı3. LearnVersionControlwithGit4. AtlassianGitTutorials5. ProGitBook6. AtlassianGitWorkflows7. LearnGitBranchingOnlineTutorialApplication8. Git:fetchandmerge,don'tpull9. Resolvingamergeconflictfromcommandline10. AddingAndRemovingRemoteBranches–GitBranch
KaynakçaveReferanslar