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"[email protected]"
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ı:ş[email protected]/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

Benzer belgeler