SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
Git Sürüm Kontrol Sistemi
ve Uygulamalı Örnekler
ZAFER GÜREL
16 NİSAN 2019 – SAKARYA CODERS SUNUMU
Git Nedir?
Git, hız ve verimlilik için tasarlanmış açık kaynak kodlu, dağıtık sürüm kontrol sistemidir.
2005 yılında, BitKeeper firması, Linux çekirdeğini geliştiren ekibine sunduğu ücretsiz sürüm
kontrol sistemi lisansını iptal etti.
Bunun üzerine 2005 yılında, çekirdeği geliştiren ekip ve özellikle Linus Torvalds, BitKeeper
tecrübesini de dikkate alarak kendi araçlarını geliştirmeye başladı.
Böylece hayata merhaba diyen Git sistemi, yıllar içerisinde olgunlaşarak çok hızlı, büyük
projelerde çok verimli ve özellikle çok basit ve hızlı şekilde dal oluşturma(branching) özelliğiyle
doğrusal olmayan geliştirmeye olanak tanıyacak hale geldi.
Stack Overflow'daki Soru Sayıları (2016)
https://rhodecode.com/insights/version-control-systems-2016
Eclipse Topluluğu Geliştiricilerinin
Kullandığı Sistemler
https://rhodecode.com/insights/version-control-systems-2016
Neden Git?
Her şey lokalde – Tüm proje geçmişi dahil
Çok hızlı
Her değişikliğin bir kopyası (snapshot) saklanır, farklar değil
Merkezi değil, dağıtık. Her şey (proje tarihçesi, sürümler) herkeste.
Diğer Sürüm Kontrol Sistemleri
Git’in Sürümleri Saklama Şekli
Git Kurulumu
Linux, macOS ve Windows’a kurulabilir.
Linux
sudo dnf install git-all (Fedora, RHAL veya CentOS)
sudo apt install git (Debian / Ubuntu)
Windows
https://git-scm.com/download/win
MacOs
https://git-scm.com/download/mac.
Kaynak kod ile kurulum
https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
Öğrenme Kaynakları
Her platform için Git, ücretsiz çevrimiçi Git Kitabı
www.git-scm.com
GitHub'da Git öğrenme kaynakları
https://try.github.io/
Atlassian'dan Öğrenme Kaynakları
https://confluence.atlassian.com/bitbucketserver061/git-resources-968674263.html
Favori Git Komutlarım
https://github.com/zafergurel/favori-git-komutlari/
İlk Ayarlar
Ayarları editör ile düzenleme Hangi ayar hangi dosyada?
git config --global --edit
git config --system --edit
git config --local --edit
git config --list --show-origin
Kişisel Bilgileri Girme Ayarları Görme
Adınız
git config --global user.name "Ahmet Çınar"
E-posta
git config --global user.name ahmet@cinarltd.com
Ayarları kontrol etmek için:
git config --list (Tüm ayarlar)
git config user.name (Tek ayar)
Temel Akış
Üç Ana Bölüm
Üç Ana Bölüm ve Uzak Depo
Git Nesneleri
Her nesne, SHA1 algoritması ile hesaplanan 40 karakterden (128 bit) oluşan «nesne isimleri» ile
isimlendirilir.
6ff87c4664981e4397625791c8ea3bbb5f2279a3
Bu sayede, Git nesnelerin aynı olup olmadıklarını sadece isimleri karşılaştırarak hızlıca anlayabilir.
İsterse dosyanınbüyüklüğü 100 MB olsun.
SHA1 fonksiyonu, kriptografik özüt fonksiyonudur ve iki farklı nesnenin aynı ismi almasıimkansız
olmasa* bile pratikte çok zordur.
*: https://www.theregister.co.uk/2017/02/23/google_first_sha1_collision/
Git Nesneleri
4 tip nesne vardır:
◦ blob: dosya verisi blob olaraktutulur.
◦ tree: Temel olarak dizin olarakdüşünülebilir.Diğer alt dizinlerive dosyalarıadresler.
◦ commit: Bir tree nesnesine işaret eder. Belli bir zamanda projeninnasıl göründüğünü gösterir. Zaman
bilgisi, değişiklikleriyapankişi, bir önceki commit nesnesine referans gibi bilgileri içerir.
◦ tag: Commitleri etiketlemek için kullanılanbiryöntemdir.Örneğin sürüm ismi vermek gibi…
Git Nesneleri İlişkileri
Git Nesneleri
Git Nesneleri
Dal (Branch)
Dal (branch) basit anlamda, bir commit’i gösteren hareketli bir işaretçiden başka bir şey değildir.
Varsayılandal ismi, «master»’dır.
Her yapılan commit işleminde, mevcut dal yani hareketli işaretçi son commit’i gösterecek şekilde
güncellenir.
Dal
Dal
Dal
Dal
Komut satırında proje tarihçesini dallanlamalarla görmek için:
git log --oneline --decorate --graph --all
Git Deposu (Repository) Oluşturma
1. Mevcut dizini ilklendirme
cd /c/projects/git-sunumu
git init
2. Uzaktaki bir depoyu klonlama
git clone
Bu işlemlerden sonra .git dizini oluşur. İçeriğine bakalım…
.git dizininde ne var?
HEAD Mevcutdalı gösterir
config konfigürasyon verisi
descriptionprojenin açıklaması
index commit edilecek dosyalar bilgileri - binary bir dosyadır
logs/ ref'te yapılan değişikliklerin logları
objects/ tüm veri burada tutulur: commit, tree, blob ve tag nesneleri
hooks/ bir komuttan sonra çalıştırılacak kabuk betikleri bu dizinde tutulur
refs/ lokalve uzak dal ve taglerin bilgilerini tutar
Git Deposu (Repository) Oluşturma / 2
Uzak bir git deposu çoklanarak(klonlanarak) da bir depo oluşturulabilir.
Bunun için klonlanacak deponun adresi gereklidir.
git clone https://github.com/zafergurel/git-sunumu.git<- Güvenli
git clone ssh://git@github.com/zafergurel/git-sunumu.git <-Güvenli, özel depolar için
git clone git://github.com/zafergurel/git-sunumu.git<- Halka açık depolar için, en hızlı yöntem
SSH, HTTPS ya da Git protokolü ile çoklama yapılabilir.
HTTPS için özel depolarda kullanıcı adı ve şifre gereklidir.
SSH kullanılırsa SSH anahtarıoluşturmak gereklidir.
SSH anahtaroluşturmak için Windows’ta PuttyGenkullanılabilir.
SSH’in herkese açık (public) anahtarı,deponun bulunduğu sunucuya tanımlanmalıdır.
Uygulamalar
1. Lokalde dosya ekleme
1. cd /c/projects/<proje adi>
2. git init
3. nano README
4. git status
5. git add
6. git status
7. git commit
8. git log
2. Lokalde dosya düzenleme
1. nano README
2. git status
3. git diff
4. git add .
5. git diff (Fark yok!)
6. git diff --staged (veya --cached – staging ortamındaki dosyalariçin)
7. git commit –m «READMEdüzenlendi»
8. git log -1 (son commiti gösterir)
3. Değişiklikleri geri alma
1. nano README(dosyayıdeğiştir ve kaydet)
2. git status -s (özet)
3. git checkout -- README(değiştirilmiş dosyanın üzerine son commitedileni yazar!)
4. git status -s
4. Değişiklikleri geri alma (stagingten)
1. nano README(dosyayıdeğiştir ve kaydet)
2. git add README
3. git status -s
4. git reset HEAD README(değiştirilen dosyayıdeğişikliklerin üzerine yazmadançalışma alanına
alır)
5. git add README(tekrar staging ortamına alalım)
6. git reset HEAD --hard (tüm değişiklikleri de geri alarak geri döndürür! Tüm dosyalarla
beraber!)
7. git status
5. Aynı dosyanın iki hali
1. nano README (dosyayı değiştir ve kaydet)
2. git add README
3. git status –s
4. nano README (dosyayı tekrar değiştir ve kaydet)
5. git status (hem toplanma hem de çalışma alanında aynı dosya!)
6. git diff
7. git diff --staged
8. git add . (şimdi son değişiklikler dikkate alınır)
9. git commit -m «Bir değişiklik daha»
10. git log -1
6. Dosyaları Git Kontrolünden Çıkarma
1. touch app.dat
2. git status
3. echo *.dat > .gitignore (dat uzantılı dosyaları göndermeyelim)
4. git status
7. Dosya silme
1. touch sifreler.txt
2. git add sifreler.txt
3. git commit –m «sifreler»
4. git rm sifreler.txt
5. git status
6. git commit –m «sifreler silindi» (Gerçekten silindi mi? :D)
Silme ile ilgili Ara Bilgi
Bir dosya silinse bile Git tüm değişikliklerin tuttuğu için aslında veri kaybolmamaktadır.
Ama hassas bilgileri geçmişten temizlenin yolu var.
Bunun için git filter-branch komutu kullanılabilir. Bundan daha etkin olan diğer yöntem ise açık
kaynak kodlu geliştirilmiş BFG Repo Cleaner aracı.
https://rtyley.github.io/bfg-repo-cleaner/
Araç kurulduktan sonra aşağıdaki komutlar ile proje geçmişi düzenlenir.
java -jar bfg.jar --delete-files sifreler.txtmy-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
8. Dosya yeniden isimlendirme
1. git mv READMEREADME.md
2. git status
3. git commit -m «isim degisikligi yapildi»
9. Son Commit’i Düzeltme
1. nano LICENSE
2. git add .
3. git commit -m «LICENSE eklendi»
4. git log --pretty=oneline -3 (son 3 değişiklik)
5. nano AUTHORS
6. git add .
7. git commit --amend –m «AUTHORSve LICENSE eklendi»
8. git log --pretty=oneline -3
10. Logları inceleme
1. git log -2 (son iki log)
2. git log -2 –p (son iki log, değişikliklerle beraber --patched)
3. git log --pretty=format:"%h - %an, %ar : %s"
4. git log --pretty=oneline
5. git log --date=iso-strict (rfc ya da short da olabilir)
6. git log --since=3.day --before=1.day --pretty=oneline --author=zafer
7. git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
git config --add alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short"
git hist (Yukarıdaki log deyimi alias olarak tanımlanabilir)
11. Dal Oluşturma ve Birleştirme
1. git branch yeni-ozellik
2. git checkout yeni-ozellik
3. echo "alert(1);" > yeni-ozellik.js (yeni dosyaekle)
4. git add .
5. git commit -m "yeni dosya"
6. git log -1
7. git checkout master
8. git merge yeni-ozellik
9. git branch -d yeni-ozellik
12. Uzak Depoyu Klonlama
1. git clone ssh://git@192.168.56.101/root/git-sunumu.git
2. cd git-sunumu
3. touch README.md
4. git add README.md
5. git commit -m "READMEeklendi"
6. git push -u origin master
13. Uzak Depoya Kod Gönderme
1. nano AUTHORS
2. git add .
3. git commit -m "AUTHORSeklendi"
4. git push origin master
14. Uzak Depodan Kod Alma
1. git fetch (sadece uzak deponun commit bilgilerini alır)
2. git merge (uzaktaki dal ile mevcut dalı birleştirir)
Veya
git pull (git fetch & git merge)
Eğer hata çıkarsa git status ile çakışma olan dosyalarlistelenir. Bu dosyalarda manuel işlem
yapılarak düzeltme yapılır, dosyalar git add komutu ile eklenip git commit işlemi yapılır. Bu sayede
merge işlemi tamamlanır.
15. Uzak Depodan Kod Alma / 2
Eğer çalışma dizininde değişmiş dosyalar varsailk önce bunlar stashkomutu ile başka bir yerde
kaydedilir ve son yapılan commite yani temiz çalışma dizinine dönülür.
1. git stash
2. git pull (değişiklikler güvenli şekilde çekilir)
3. git stashapply (saklanmış değişiklikler uzaktangelen commitin üzerine uygulanır)
Son işlemde dosya birleştirme hataları olursa bunlar manuel çözülür.
16. Uzak Depodaki Dalı Alma ve Silme
1. git fetch (uzak deponun lokal referanslarını günceller)
2. git checkout dal-ismi
3. git push origin --delete dal-ismi
17. Uzak Depoya Kod Gönderememe
Lokaldeki kodu uzak depoya göndermek her zamanmümkün olmayabilir.
Son yapılan git pull işleminden sonra başka bir kişi uzak depoyu güncellemiş olabilir.
Bu durumda, git push yapıldığında hata alınır.
1. git pull (İlk önce lokaldeki kod güncellenmeli.)
2. git status (Çatışma var mı? Varsa düzelt)
3. git add . (Tüm çatışmalar düzeltilip eklenir)
4. git commit -m "Yeni ozellik" (Yeni commit oluşturulur)
5. git push (Artık karşı tarafa gönderim yapılabilir)
18. Uzak Depo İşlemleri
1. git remote -v
2. git remote rename origin merkez
3. git remote show origin
4. git remote add yeni-remote <url>
5. git remote remove yeni-remote
19. Etiketleme
1. git tag v.1.0 (Basit etiketleme)
2. git tag v.1.0 -a -m "İlk sürüm" (Detaylı -annotated- etiketleme)
3. git tag -d v.1.0 (silme)
4. git tag (Listeleme)
5. git push --tags (Uzak depoya etiketleri gönderme)
Ekstralar
- SSH anahtarı ve Linux'a SSH ile erişim
- Açık kaynak kodlu Gitlab'i Ubuntu'ya Kurma
SSH Ayarları - SSH Anahtarı Oluşturma
Linux'a SSH ile uzaktan rootile bağlanmak için:
cd /root
mkdir .ssh
chmod .ssh 755
nano .ssh/authorized_keys && chmod 644 authorized_keys
Authorized Keys dosyasına, SSH public anahtarıyerleştirilir.
SSH Anahtarı Oluşturma
Linux ve Windows'taGit Bash ile:
ssh-keygen -trsa -C "<e-posta adresi>"
Windows:
Putty Key Generator (https://www.putty.org/)
Ubuntu'ya GitLab Kurulumu
Açık kaynak kodlu Gitlab'i Ubuntu üzerinde deneyebilirsiniz.
Windows'ta VirtualBox yazılımı ile Ubuntu kurabilir ve Gitlab'e uzaktanerişebilirsiniz.
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-gitlab-on-ubuntu-16-04
1. Gitlab kurulumu
sudo apt-get update
sudo apt-get install ca-certificates curl openssh-server postfix
cd /tmp
curl -LO https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh
sudo bash /tmp/script.deb.sh
sudo apt-get install gitlab-ce
2. Firewall ayarları
sudo ufw status
sudo ufw allow http
sudo ufw allow https
sudo ufw allow OpenSSH
sudo ufw status
3. Gitlab'e Erişilicek Dış IP ya da DNS ismi konfigürasyona yazılmalı
sudo nano /etc/gitlab/gitlab.rb
sudo gitlab-ctl reconfigure
Kaynaklar
- Resimler, aşağıdaki adresten ücretsiz erişilebilen Pro Git kitabından alınmış (bazıları
Türkçeleştirilmiş) ve kullanılmıştır.
https://git-scm.com/book/en/v2/Getting-Started-A-Short-History-of-Git

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Introduction To Git
Introduction To GitIntroduction To Git
Introduction To Git
 
Git and github 101
Git and github 101Git and github 101
Git and github 101
 
Git and git flow
Git and git flowGit and git flow
Git and git flow
 
Présentation de git
Présentation de gitPrésentation de git
Présentation de git
 
A Practical Introduction to git
A Practical Introduction to gitA Practical Introduction to git
A Practical Introduction to git
 
Introduction to Git and GitHub
Introduction to Git and GitHubIntroduction to Git and GitHub
Introduction to Git and GitHub
 
Git, Github, Versiyon Kontrolü 101
Git, Github, Versiyon Kontrolü 101Git, Github, Versiyon Kontrolü 101
Git, Github, Versiyon Kontrolü 101
 
Git
GitGit
Git
 
Git Branching Model
Git Branching ModelGit Branching Model
Git Branching Model
 
Les bases de git
Les bases de gitLes bases de git
Les bases de git
 
git and github
git and githubgit and github
git and github
 
Learning git
Learning gitLearning git
Learning git
 
Git real slides
Git real slidesGit real slides
Git real slides
 
Introduction to Git and Github
Introduction to Git and GithubIntroduction to Git and Github
Introduction to Git and Github
 
Github - Git Training Slides: Foundations
Github - Git Training Slides: FoundationsGithub - Git Training Slides: Foundations
Github - Git Training Slides: Foundations
 
Git basics to advance with diagrams
Git basics to advance with diagramsGit basics to advance with diagrams
Git basics to advance with diagrams
 
Versioning avec Git
Versioning avec GitVersioning avec Git
Versioning avec Git
 
Github basics
Github basicsGithub basics
Github basics
 
Git in 10 minutes
Git in 10 minutesGit in 10 minutes
Git in 10 minutes
 
Overview of github
Overview of githubOverview of github
Overview of github
 

Similar a Git Sunumu

Git - Code Versiyon Yönetim Sistemi
Git - Code Versiyon Yönetim SistemiGit - Code Versiyon Yönetim Sistemi
Git - Code Versiyon Yönetim SistemiDilaver Demirel
 
Git Sürüm Takip Sistemi
Git Sürüm Takip SistemiGit Sürüm Takip Sistemi
Git Sürüm Takip Sistemiözge Barbaros
 
Git ile versiyon kontrolü
Git ile versiyon kontrolüGit ile versiyon kontrolü
Git ile versiyon kontrolüIlhan Çetin
 
Git&GitHub @ Android Developer Days ADD 2013 / @burakaydn
Git&GitHub @ Android Developer Days ADD 2013 / @burakaydnGit&GitHub @ Android Developer Days ADD 2013 / @burakaydn
Git&GitHub @ Android Developer Days ADD 2013 / @burakaydnOrhun Mert Simsek
 
Git ile Sürüm Takibi
Git ile Sürüm TakibiGit ile Sürüm Takibi
Git ile Sürüm TakibiÖmer ÖZKAN
 
Git&Github - Android Developer Days 2013
Git&Github - Android Developer Days 2013Git&Github - Android Developer Days 2013
Git&Github - Android Developer Days 2013Burak Aydın
 
Git - Bildiğiniz Gibi Değil
Git - Bildiğiniz Gibi DeğilGit - Bildiğiniz Gibi Değil
Git - Bildiğiniz Gibi DeğilLemi Orhan Ergin
 
Temel Linux Kullanımı ve Komutları
Temel Linux Kullanımı ve KomutlarıTemel Linux Kullanımı ve Komutları
Temel Linux Kullanımı ve KomutlarıAhmet Gürel
 
Chroot içinde {DNS, NTP, Nginx, PHP-FPM}
Chroot içinde {DNS, NTP, Nginx, PHP-FPM}Chroot içinde {DNS, NTP, Nginx, PHP-FPM}
Chroot içinde {DNS, NTP, Nginx, PHP-FPM}Ali Erdinc Koroglu
 
Abapgit kurulum kullanım
Abapgit kurulum kullanımAbapgit kurulum kullanım
Abapgit kurulum kullanımEliflknurNACAR
 
Sızma Testi ve Güvenlik Denetlemeleri - Temel Linux Bilgisi
Sızma Testi ve Güvenlik Denetlemeleri - Temel Linux BilgisiSızma Testi ve Güvenlik Denetlemeleri - Temel Linux Bilgisi
Sızma Testi ve Güvenlik Denetlemeleri - Temel Linux BilgisiFerhat Ozgur Catak
 
Go Programlama Dili - Seminer
Go Programlama Dili - SeminerGo Programlama Dili - Seminer
Go Programlama Dili - SeminerCihan Özhan
 
Devfest Istanbul 2015 Sunumu
Devfest Istanbul 2015 SunumuDevfest Istanbul 2015 Sunumu
Devfest Istanbul 2015 SunumuAybüke Özdemir
 
Oracle Golden Gate
Oracle Golden GateOracle Golden Gate
Oracle Golden GateAnar Godjaev
 

Similar a Git Sunumu (20)

Git - Code Versiyon Yönetim Sistemi
Git - Code Versiyon Yönetim SistemiGit - Code Versiyon Yönetim Sistemi
Git - Code Versiyon Yönetim Sistemi
 
Git Sürüm Takip Sistemi
Git Sürüm Takip SistemiGit Sürüm Takip Sistemi
Git Sürüm Takip Sistemi
 
Git 101
Git 101Git 101
Git 101
 
Git & Git Workflows
Git & Git WorkflowsGit & Git Workflows
Git & Git Workflows
 
Git ile versiyon kontrolü
Git ile versiyon kontrolüGit ile versiyon kontrolü
Git ile versiyon kontrolü
 
Git & Github
Git & GithubGit & Github
Git & Github
 
Git&GitHub @ Android Developer Days ADD 2013 / @burakaydn
Git&GitHub @ Android Developer Days ADD 2013 / @burakaydnGit&GitHub @ Android Developer Days ADD 2013 / @burakaydn
Git&GitHub @ Android Developer Days ADD 2013 / @burakaydn
 
Git ile Sürüm Takibi
Git ile Sürüm TakibiGit ile Sürüm Takibi
Git ile Sürüm Takibi
 
Git&Github - Android Developer Days 2013
Git&Github - Android Developer Days 2013Git&Github - Android Developer Days 2013
Git&Github - Android Developer Days 2013
 
Git ve GitHub
Git ve GitHubGit ve GitHub
Git ve GitHub
 
Git - Bildiğiniz Gibi Değil
Git - Bildiğiniz Gibi DeğilGit - Bildiğiniz Gibi Değil
Git - Bildiğiniz Gibi Değil
 
Temel Linux Kullanımı ve Komutları
Temel Linux Kullanımı ve KomutlarıTemel Linux Kullanımı ve Komutları
Temel Linux Kullanımı ve Komutları
 
İnsanlar için GIT
İnsanlar için GITİnsanlar için GIT
İnsanlar için GIT
 
Chroot içinde {DNS, NTP, Nginx, PHP-FPM}
Chroot içinde {DNS, NTP, Nginx, PHP-FPM}Chroot içinde {DNS, NTP, Nginx, PHP-FPM}
Chroot içinde {DNS, NTP, Nginx, PHP-FPM}
 
Abapgit kurulum kullanım
Abapgit kurulum kullanımAbapgit kurulum kullanım
Abapgit kurulum kullanım
 
Version Control CheatSheet - Git
Version Control CheatSheet - GitVersion Control CheatSheet - Git
Version Control CheatSheet - Git
 
Sızma Testi ve Güvenlik Denetlemeleri - Temel Linux Bilgisi
Sızma Testi ve Güvenlik Denetlemeleri - Temel Linux BilgisiSızma Testi ve Güvenlik Denetlemeleri - Temel Linux Bilgisi
Sızma Testi ve Güvenlik Denetlemeleri - Temel Linux Bilgisi
 
Go Programlama Dili - Seminer
Go Programlama Dili - SeminerGo Programlama Dili - Seminer
Go Programlama Dili - Seminer
 
Devfest Istanbul 2015 Sunumu
Devfest Istanbul 2015 SunumuDevfest Istanbul 2015 Sunumu
Devfest Istanbul 2015 Sunumu
 
Oracle Golden Gate
Oracle Golden GateOracle Golden Gate
Oracle Golden Gate
 

Git Sunumu

  • 1. Git Sürüm Kontrol Sistemi ve Uygulamalı Örnekler ZAFER GÜREL 16 NİSAN 2019 – SAKARYA CODERS SUNUMU
  • 2. Git Nedir? Git, hız ve verimlilik için tasarlanmış açık kaynak kodlu, dağıtık sürüm kontrol sistemidir. 2005 yılında, BitKeeper firması, Linux çekirdeğini geliştiren ekibine sunduğu ücretsiz sürüm kontrol sistemi lisansını iptal etti. Bunun üzerine 2005 yılında, çekirdeği geliştiren ekip ve özellikle Linus Torvalds, BitKeeper tecrübesini de dikkate alarak kendi araçlarını geliştirmeye başladı. Böylece hayata merhaba diyen Git sistemi, yıllar içerisinde olgunlaşarak çok hızlı, büyük projelerde çok verimli ve özellikle çok basit ve hızlı şekilde dal oluşturma(branching) özelliğiyle doğrusal olmayan geliştirmeye olanak tanıyacak hale geldi.
  • 3. Stack Overflow'daki Soru Sayıları (2016) https://rhodecode.com/insights/version-control-systems-2016
  • 4. Eclipse Topluluğu Geliştiricilerinin Kullandığı Sistemler https://rhodecode.com/insights/version-control-systems-2016
  • 5. Neden Git? Her şey lokalde – Tüm proje geçmişi dahil Çok hızlı Her değişikliğin bir kopyası (snapshot) saklanır, farklar değil Merkezi değil, dağıtık. Her şey (proje tarihçesi, sürümler) herkeste.
  • 8. Git Kurulumu Linux, macOS ve Windows’a kurulabilir. Linux sudo dnf install git-all (Fedora, RHAL veya CentOS) sudo apt install git (Debian / Ubuntu) Windows https://git-scm.com/download/win MacOs https://git-scm.com/download/mac. Kaynak kod ile kurulum https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
  • 9. Öğrenme Kaynakları Her platform için Git, ücretsiz çevrimiçi Git Kitabı www.git-scm.com GitHub'da Git öğrenme kaynakları https://try.github.io/ Atlassian'dan Öğrenme Kaynakları https://confluence.atlassian.com/bitbucketserver061/git-resources-968674263.html Favori Git Komutlarım https://github.com/zafergurel/favori-git-komutlari/
  • 10. İlk Ayarlar Ayarları editör ile düzenleme Hangi ayar hangi dosyada? git config --global --edit git config --system --edit git config --local --edit git config --list --show-origin Kişisel Bilgileri Girme Ayarları Görme Adınız git config --global user.name "Ahmet Çınar" E-posta git config --global user.name ahmet@cinarltd.com Ayarları kontrol etmek için: git config --list (Tüm ayarlar) git config user.name (Tek ayar)
  • 13. Üç Ana Bölüm ve Uzak Depo
  • 14. Git Nesneleri Her nesne, SHA1 algoritması ile hesaplanan 40 karakterden (128 bit) oluşan «nesne isimleri» ile isimlendirilir. 6ff87c4664981e4397625791c8ea3bbb5f2279a3 Bu sayede, Git nesnelerin aynı olup olmadıklarını sadece isimleri karşılaştırarak hızlıca anlayabilir. İsterse dosyanınbüyüklüğü 100 MB olsun. SHA1 fonksiyonu, kriptografik özüt fonksiyonudur ve iki farklı nesnenin aynı ismi almasıimkansız olmasa* bile pratikte çok zordur. *: https://www.theregister.co.uk/2017/02/23/google_first_sha1_collision/
  • 15. Git Nesneleri 4 tip nesne vardır: ◦ blob: dosya verisi blob olaraktutulur. ◦ tree: Temel olarak dizin olarakdüşünülebilir.Diğer alt dizinlerive dosyalarıadresler. ◦ commit: Bir tree nesnesine işaret eder. Belli bir zamanda projeninnasıl göründüğünü gösterir. Zaman bilgisi, değişiklikleriyapankişi, bir önceki commit nesnesine referans gibi bilgileri içerir. ◦ tag: Commitleri etiketlemek için kullanılanbiryöntemdir.Örneğin sürüm ismi vermek gibi…
  • 19. Dal (Branch) Dal (branch) basit anlamda, bir commit’i gösteren hareketli bir işaretçiden başka bir şey değildir. Varsayılandal ismi, «master»’dır. Her yapılan commit işleminde, mevcut dal yani hareketli işaretçi son commit’i gösterecek şekilde güncellenir.
  • 20. Dal
  • 21. Dal
  • 22. Dal
  • 23. Dal Komut satırında proje tarihçesini dallanlamalarla görmek için: git log --oneline --decorate --graph --all
  • 24. Git Deposu (Repository) Oluşturma 1. Mevcut dizini ilklendirme cd /c/projects/git-sunumu git init 2. Uzaktaki bir depoyu klonlama git clone Bu işlemlerden sonra .git dizini oluşur. İçeriğine bakalım…
  • 25. .git dizininde ne var? HEAD Mevcutdalı gösterir config konfigürasyon verisi descriptionprojenin açıklaması index commit edilecek dosyalar bilgileri - binary bir dosyadır logs/ ref'te yapılan değişikliklerin logları objects/ tüm veri burada tutulur: commit, tree, blob ve tag nesneleri hooks/ bir komuttan sonra çalıştırılacak kabuk betikleri bu dizinde tutulur refs/ lokalve uzak dal ve taglerin bilgilerini tutar
  • 26. Git Deposu (Repository) Oluşturma / 2 Uzak bir git deposu çoklanarak(klonlanarak) da bir depo oluşturulabilir. Bunun için klonlanacak deponun adresi gereklidir. git clone https://github.com/zafergurel/git-sunumu.git<- Güvenli git clone ssh://git@github.com/zafergurel/git-sunumu.git <-Güvenli, özel depolar için git clone git://github.com/zafergurel/git-sunumu.git<- Halka açık depolar için, en hızlı yöntem SSH, HTTPS ya da Git protokolü ile çoklama yapılabilir. HTTPS için özel depolarda kullanıcı adı ve şifre gereklidir. SSH kullanılırsa SSH anahtarıoluşturmak gereklidir. SSH anahtaroluşturmak için Windows’ta PuttyGenkullanılabilir. SSH’in herkese açık (public) anahtarı,deponun bulunduğu sunucuya tanımlanmalıdır.
  • 28. 1. Lokalde dosya ekleme 1. cd /c/projects/<proje adi> 2. git init 3. nano README 4. git status 5. git add 6. git status 7. git commit 8. git log
  • 29. 2. Lokalde dosya düzenleme 1. nano README 2. git status 3. git diff 4. git add . 5. git diff (Fark yok!) 6. git diff --staged (veya --cached – staging ortamındaki dosyalariçin) 7. git commit –m «READMEdüzenlendi» 8. git log -1 (son commiti gösterir)
  • 30. 3. Değişiklikleri geri alma 1. nano README(dosyayıdeğiştir ve kaydet) 2. git status -s (özet) 3. git checkout -- README(değiştirilmiş dosyanın üzerine son commitedileni yazar!) 4. git status -s
  • 31. 4. Değişiklikleri geri alma (stagingten) 1. nano README(dosyayıdeğiştir ve kaydet) 2. git add README 3. git status -s 4. git reset HEAD README(değiştirilen dosyayıdeğişikliklerin üzerine yazmadançalışma alanına alır) 5. git add README(tekrar staging ortamına alalım) 6. git reset HEAD --hard (tüm değişiklikleri de geri alarak geri döndürür! Tüm dosyalarla beraber!) 7. git status
  • 32. 5. Aynı dosyanın iki hali 1. nano README (dosyayı değiştir ve kaydet) 2. git add README 3. git status –s 4. nano README (dosyayı tekrar değiştir ve kaydet) 5. git status (hem toplanma hem de çalışma alanında aynı dosya!) 6. git diff 7. git diff --staged 8. git add . (şimdi son değişiklikler dikkate alınır) 9. git commit -m «Bir değişiklik daha» 10. git log -1
  • 33. 6. Dosyaları Git Kontrolünden Çıkarma 1. touch app.dat 2. git status 3. echo *.dat > .gitignore (dat uzantılı dosyaları göndermeyelim) 4. git status
  • 34. 7. Dosya silme 1. touch sifreler.txt 2. git add sifreler.txt 3. git commit –m «sifreler» 4. git rm sifreler.txt 5. git status 6. git commit –m «sifreler silindi» (Gerçekten silindi mi? :D)
  • 35. Silme ile ilgili Ara Bilgi Bir dosya silinse bile Git tüm değişikliklerin tuttuğu için aslında veri kaybolmamaktadır. Ama hassas bilgileri geçmişten temizlenin yolu var. Bunun için git filter-branch komutu kullanılabilir. Bundan daha etkin olan diğer yöntem ise açık kaynak kodlu geliştirilmiş BFG Repo Cleaner aracı. https://rtyley.github.io/bfg-repo-cleaner/ Araç kurulduktan sonra aşağıdaki komutlar ile proje geçmişi düzenlenir. java -jar bfg.jar --delete-files sifreler.txtmy-repo.git git reflog expire --expire=now --all && git gc --prune=now --aggressive
  • 36. 8. Dosya yeniden isimlendirme 1. git mv READMEREADME.md 2. git status 3. git commit -m «isim degisikligi yapildi»
  • 37. 9. Son Commit’i Düzeltme 1. nano LICENSE 2. git add . 3. git commit -m «LICENSE eklendi» 4. git log --pretty=oneline -3 (son 3 değişiklik) 5. nano AUTHORS 6. git add . 7. git commit --amend –m «AUTHORSve LICENSE eklendi» 8. git log --pretty=oneline -3
  • 38. 10. Logları inceleme 1. git log -2 (son iki log) 2. git log -2 –p (son iki log, değişikliklerle beraber --patched) 3. git log --pretty=format:"%h - %an, %ar : %s" 4. git log --pretty=oneline 5. git log --date=iso-strict (rfc ya da short da olabilir) 6. git log --since=3.day --before=1.day --pretty=oneline --author=zafer 7. git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short git config --add alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short" git hist (Yukarıdaki log deyimi alias olarak tanımlanabilir)
  • 39. 11. Dal Oluşturma ve Birleştirme 1. git branch yeni-ozellik 2. git checkout yeni-ozellik 3. echo "alert(1);" > yeni-ozellik.js (yeni dosyaekle) 4. git add . 5. git commit -m "yeni dosya" 6. git log -1 7. git checkout master 8. git merge yeni-ozellik 9. git branch -d yeni-ozellik
  • 40. 12. Uzak Depoyu Klonlama 1. git clone ssh://git@192.168.56.101/root/git-sunumu.git 2. cd git-sunumu 3. touch README.md 4. git add README.md 5. git commit -m "READMEeklendi" 6. git push -u origin master
  • 41. 13. Uzak Depoya Kod Gönderme 1. nano AUTHORS 2. git add . 3. git commit -m "AUTHORSeklendi" 4. git push origin master
  • 42. 14. Uzak Depodan Kod Alma 1. git fetch (sadece uzak deponun commit bilgilerini alır) 2. git merge (uzaktaki dal ile mevcut dalı birleştirir) Veya git pull (git fetch & git merge) Eğer hata çıkarsa git status ile çakışma olan dosyalarlistelenir. Bu dosyalarda manuel işlem yapılarak düzeltme yapılır, dosyalar git add komutu ile eklenip git commit işlemi yapılır. Bu sayede merge işlemi tamamlanır.
  • 43. 15. Uzak Depodan Kod Alma / 2 Eğer çalışma dizininde değişmiş dosyalar varsailk önce bunlar stashkomutu ile başka bir yerde kaydedilir ve son yapılan commite yani temiz çalışma dizinine dönülür. 1. git stash 2. git pull (değişiklikler güvenli şekilde çekilir) 3. git stashapply (saklanmış değişiklikler uzaktangelen commitin üzerine uygulanır) Son işlemde dosya birleştirme hataları olursa bunlar manuel çözülür.
  • 44. 16. Uzak Depodaki Dalı Alma ve Silme 1. git fetch (uzak deponun lokal referanslarını günceller) 2. git checkout dal-ismi 3. git push origin --delete dal-ismi
  • 45. 17. Uzak Depoya Kod Gönderememe Lokaldeki kodu uzak depoya göndermek her zamanmümkün olmayabilir. Son yapılan git pull işleminden sonra başka bir kişi uzak depoyu güncellemiş olabilir. Bu durumda, git push yapıldığında hata alınır. 1. git pull (İlk önce lokaldeki kod güncellenmeli.) 2. git status (Çatışma var mı? Varsa düzelt) 3. git add . (Tüm çatışmalar düzeltilip eklenir) 4. git commit -m "Yeni ozellik" (Yeni commit oluşturulur) 5. git push (Artık karşı tarafa gönderim yapılabilir)
  • 46. 18. Uzak Depo İşlemleri 1. git remote -v 2. git remote rename origin merkez 3. git remote show origin 4. git remote add yeni-remote <url> 5. git remote remove yeni-remote
  • 47. 19. Etiketleme 1. git tag v.1.0 (Basit etiketleme) 2. git tag v.1.0 -a -m "İlk sürüm" (Detaylı -annotated- etiketleme) 3. git tag -d v.1.0 (silme) 4. git tag (Listeleme) 5. git push --tags (Uzak depoya etiketleri gönderme)
  • 48. Ekstralar - SSH anahtarı ve Linux'a SSH ile erişim - Açık kaynak kodlu Gitlab'i Ubuntu'ya Kurma
  • 49. SSH Ayarları - SSH Anahtarı Oluşturma Linux'a SSH ile uzaktan rootile bağlanmak için: cd /root mkdir .ssh chmod .ssh 755 nano .ssh/authorized_keys && chmod 644 authorized_keys Authorized Keys dosyasına, SSH public anahtarıyerleştirilir. SSH Anahtarı Oluşturma Linux ve Windows'taGit Bash ile: ssh-keygen -trsa -C "<e-posta adresi>" Windows: Putty Key Generator (https://www.putty.org/)
  • 50. Ubuntu'ya GitLab Kurulumu Açık kaynak kodlu Gitlab'i Ubuntu üzerinde deneyebilirsiniz. Windows'ta VirtualBox yazılımı ile Ubuntu kurabilir ve Gitlab'e uzaktanerişebilirsiniz. https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-gitlab-on-ubuntu-16-04 1. Gitlab kurulumu sudo apt-get update sudo apt-get install ca-certificates curl openssh-server postfix cd /tmp curl -LO https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh sudo bash /tmp/script.deb.sh sudo apt-get install gitlab-ce 2. Firewall ayarları sudo ufw status sudo ufw allow http sudo ufw allow https sudo ufw allow OpenSSH sudo ufw status 3. Gitlab'e Erişilicek Dış IP ya da DNS ismi konfigürasyona yazılmalı sudo nano /etc/gitlab/gitlab.rb sudo gitlab-ctl reconfigure
  • 51. Kaynaklar - Resimler, aşağıdaki adresten ücretsiz erişilebilen Pro Git kitabından alınmış (bazıları Türkçeleştirilmiş) ve kullanılmıştır. https://git-scm.com/book/en/v2/Getting-Started-A-Short-History-of-Git