Slide 1

Slide 1 text

İNSANLAR İÇİN “GIT” Uğur Özyılmazel - http://ugur.ozyilmazel.com @ugurozyilmazel 5 Nisan 13 Cuma

Slide 2

Slide 2 text

`git`NEDİR? Dağıtık çalışan sürüm kontrol (DVCS*) ve kaynak kod yönetim (SCM*) aracıdır. * DVCS : Distributed Version Control System SCM : Source Code Management 5 Nisan 13 Cuma

Slide 3

Slide 3 text

SÜRÜM KONTROL ? ■ Kaynak kod yönetimi ■ Sürüm (Versiyon) Takibi ■ Birden fazla kişiyle çalışma ve paylaşma ■ Repository (Depo) hizmeti ■ Deployment (Sunucuya uygulamanın kurulumu) 5 Nisan 13 Cuma

Slide 4

Slide 4 text

TARİHÇE ★ Linus Torvalds ★ Aralık 2005, V 1.0 ★ Nisan 2013, V 1.8.2 http://en.wikipedia.org/wiki/Linus_Torvalds 5 Nisan 13 Cuma

Slide 5

Slide 5 text

DİĞER UYGULAMALAR CVS SVN MERCURIAL * Lisans sorunları yüzünden Linus Torvalds GIT’i yazdı! BITKEEPER * PERFORCE BAZAAR # http://en.wikipedia.org/wiki/Comparison_of_revision_control_software 5 Nisan 13 Cuma

Slide 6

Slide 6 text

GIT`İ ÖNE ÇIKARANLAR Dallanma ve Birleştirme (Branch, Merge) Dağıtık Çalışma (Distributed) Güvenlik (Checksum ve SHA) Hız ve Boyut (Clone ve Depolama) Ön İzleme (Staging) Açık Kaynak (GPL V2) 5 Nisan 13 Cuma

Slide 7

Slide 7 text

TEKNİK FARKLAR ■ Dosya içeriği BLOB* şeklinde saklanır. Blob’ların kendine ait modu, tipi, adı ve SHA**’sı bulunur ■ Dizinler’e Tree (Ağaç) adı verilir. ■ Her Tree, alt Tree’lere ve Blob’lara sahiptir. ■ Log, COMMIT OBJECT adı verilen bir sistemde saklanır. (Author, Commiter ve ilişkili diğer bilgiler) * Binary Large Objects ** Secure Hash Algorithm 5 Nisan 13 Cuma

Slide 8

Slide 8 text

KURULUM Windows http://git-scm.com/download/win Linux `git-core` paketi Mac (Ön tanımlı) * İkonlar http://git-scm.com sitesine aittir. 5 Nisan 13 Cuma

Slide 9

Slide 9 text

İLK DEPO $ mkdir merhaba $ cd merhaba/ $ git init Initialized empty Git repository in merhaba/.git/ $ git help init 5 Nisan 13 Cuma

Slide 10

Slide 10 text

BOŞ DEPO ■ İlk COMMIT yapılana kadar ortada BRANCH yoktur! ■ İlk commit yapıldıktan sonra varsayılan (default) branch oluşur ve adı MASTER olur. 5 Nisan 13 Cuma

Slide 11

Slide 11 text

KONFİGÜRASYON $ git config --global user.name "Adınız Soyadınız" $ git config --global user.email "[email protected]" GIT konfigürasyon dosyası ~/.gitconfig $ git help config 5 Nisan 13 Cuma

Slide 12

Slide 12 text

DOSYA OLUŞTURALIM $ echo "Proje ile ilgili bilgiler..." > README.md $ git status # On branch master # # Initial commit # # Untracked files: # (use "git add ..." to include in what will be committed) # #! README.md nothing added to commit but untracked files present (use "git add" to track) $ git help status 5 Nisan 13 Cuma

Slide 13

Slide 13 text

`git add` $ git add README.md $ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached ..." to unstage) # #! new file: README.md # $ git help add 5 Nisan 13 Cuma

Slide 14

Slide 14 text

`git commit` $ git commit -m “Initial commit” $ git status [master (root-commit) 58d35a7] init 1 file changed, 1 insertion(+) create mode 100644 README.md SHA (Kısa) 58d35a7b277811bd07677c406a0615cfb3fc7806 SHA (UZUN - 40 byte / karakter) $ git help commit 5 Nisan 13 Cuma

Slide 15

Slide 15 text

`git commit` Bir tür zamanı dondurmak, o an’ı kaydetmek / yakalamak, SNAPSHOT çıkartmaktır. SNAPSHOT: An, enstantane fotoğraf anlamındadır... 5 Nisan 13 Cuma

Slide 16

Slide 16 text

MESAJ EDİTÖRÜ İlgili çevre değişkenini (Environment Variable) kullanarak istediğiniz metin düzenleyicisini kullanabilirsiniz. export GIT_EDITOR="emacs" export VISUAL="vim" export EDITOR="mate" ~/.bashrc # Örnek olarak 5 Nisan 13 Cuma

Slide 17

Slide 17 text

`git log` $ git log commit 58d35a7b277811bd07677c406a0615cfb3fc7806 Author: Uğur Özyılmazel Date: Wed Apr 3 06:48:03 2013 -0700 Initial commit $ git help log 5 Nisan 13 Cuma

Slide 18

Slide 18 text

YENİ DOSYALAR EKLEMEK $ echo "dosya1" > dosya1.txt $ echo "dosya2" > dosya2.txt $ ls README.md dosya1.txt dosya2.txt $ git status # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # #! dosya1.txt #! dosya2.txt nothing added to commit but untracked files present (use "git add" to track) 5 Nisan 13 Cuma

Slide 19

Slide 19 text

YENİ DOSYALAR EKLEMEK # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # #! new file: dosya1.txt #! new file: dosya2.txt # $ git commit -m "dosya1 ve dosya2 eklendi" $ git add . $ git status NOKTA İŞARETİ 5 Nisan 13 Cuma

Slide 20

Slide 20 text

YENİ DOSYALAR EKLEMEK commit bc0a6a64cf1b996ef3d133a199bc88e821a38456 Author: Uğur Özyılmazel Date: Wed Apr 3 18:36:13 2013 +0300 dosya1 ve dosya2 eklendi commit 58d35a7b277811bd07677c406a0615cfb3fc7806 Author: Uğur Özyılmazel Date: Wed Apr 3 06:48:03 2013 -0700 Initial commit $ git log 5 Nisan 13 Cuma

Slide 21

Slide 21 text

DEĞİŞİKLİK YAPMAK $ echo "dosya1'e ek" >> dosya1.txt $ cat dosya1.txt dosya1 dosya1'e ek # dosya1.txt $ git status 5 Nisan 13 Cuma

Slide 22

Slide 22 text

DEĞİŞİKLİK YAPMAK $ git diff $ git help diff 5 Nisan 13 Cuma

Slide 23

Slide 23 text

DEĞİŞİKLİK YAPMAK $ git add dosya1.txt # onayla $ git commit -m “dosya1’e ek satır” $ git checkout -- dosya1.txt # iptal $ git help checkout 5 Nisan 13 Cuma

Slide 24

Slide 24 text

DURUM KONTROLÜ $ git log --oneline c66dd49 dosya1'e ek satır bc0a6a6 dosya1 ve dosya2 eklendi 58d35a7 Initial commit 5 Nisan 13 Cuma

Slide 25

Slide 25 text

AĞAÇ YAPISI Github’daki depo’nun durumu. “origin” remote adı. Son snapshot’daki HEAD ve branch. Yerel makinedeki en son snapshot’a göre HEAD ve branch. 5 Nisan 13 Cuma

Slide 26

Slide 26 text

AĞAÇ YAPISI $ git push -u origin master # uzaktaki depoya Hem uzaktaki, hem de yereldeki SNAPSHOT eşitlendi. $ git help push 5 Nisan 13 Cuma

Slide 27

Slide 27 text

DEĞİŞİKLİĞİ GERİ ALMAK EKLENMİŞ dosyayı geri almak (staged) DÜZENLENMİŞ dosyayı geri almak (modified) REVİZYON seviyesinde projeyi geri almak $ git reset HEAD DOSYA_ADI $ git reset --soft SHA $ git checkout -- DOSYA_ADI $ git help reset 5 Nisan 13 Cuma

Slide 28

Slide 28 text

DOSYA SİLMEK / TAŞIMAK $ git rm DOSYA_ADI $ git rm file1.txt rm (remove) $ git mv DOSYA_ADI TAŞINACAK/DOSYA_ADI $ git mv file1.txt yedek/file1.txt mv (move) $ git help mv $ git help rm 5 Nisan 13 Cuma

Slide 29

Slide 29 text

VERSİYONLAMA YAPMA! Bazı dosyaları ya da dizinleri sürüm kontrolü dışında tutmak gerekebilir. Bunun için: .gitignore dosyasını kullanıyoruz. 5 Nisan 13 Cuma

Slide 30

Slide 30 text

.gitignore $ touch .gitignore $ echo "*.jpg" >> .gitignore $ git status # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # ## .gitignore nothing added to commit but untracked files present (use "git add" to track) $ git commit -m "jpg dosyaları sürüm kontrolünden çıkartıldı" 5 Nisan 13 Cuma

Slide 31

Slide 31 text

.gitignore $ cp ~/Desktop/Linus_Torvalds.jpg . $ git status $ ls -al nothing to commit, working directory clean 5 Nisan 13 Cuma

Slide 32

Slide 32 text

BRANCH (DALLANMAK) $ git branch # yerel branch’leri listeler $ git branch -r # uzak branch’leri listeler Ağaç yapısını, kodu ve depoyu bozmadan kopyalar çıkartmak ve daha sonra bu kopyaları ana yapıya entegre etmek $ git help branch 5 Nisan 13 Cuma

Slide 33

Slide 33 text

BRANCH (DALLANMAK) $ git branch deneme $ git checkout deneme # Switched to branch 'deneme' $ git branch 5 Nisan 13 Cuma

Slide 34

Slide 34 text

dosya3.txt BRANCH (DALLANMAK) master deneme file_test.txt $ git help branch 5 Nisan 13 Cuma

Slide 35

Slide 35 text

BRANCH (DALLANMAK) $ git log --graph --decorate --oneline --all 4a24e17 5 Nisan 13 Cuma

Slide 36

Slide 36 text

BRANCH (DALLANMAK) $ git branch BRANCH_ADI REVİZYON $ git branch deneme2 4a24e17 İstediğiniz herhangi bir revizyondan da branch oluşturabilirsiniz. $ git help branch 5 Nisan 13 Cuma

Slide 37

Slide 37 text

MERGE (BİRLEŞTİRMEK) deneme branch’indeki tüm değişiklikleri master’a taşıyoruz. $ git merge BRANCH_ADI $ git merge deneme 5 Nisan 13 Cuma

Slide 38

Slide 38 text

MERGE (BİRLEŞTİRMEK) deneme branch’inden geldi $ git help merge 5 Nisan 13 Cuma

Slide 39

Slide 39 text

CONFLICT (ÇAKIŞMA) Farklı branch’lerde, aynı isimli dosyalarda değişiklik yapalım. $ git checkout deneme $ echo "2.satır" >> file_test.txt $ git add file_test.txt $ git commit -m "file_test.txt'ye 2.satır eklendi" deneme master $ git checkout master $ echo "master'daki file_test.txt'ye 2.satır" >> file_test.txt $ git add file_test.txt $ git ci -m "master'daki file_test.txt'ye 2.satır eklendi" 5 Nisan 13 Cuma

Slide 40

Slide 40 text

CONFLICT (ÇAKIŞMA) $ git merge deneme # ve çakışma yaşanır! Auto-merging file_test.txt CONFLICT (content): Merge conflict in file_test.txt Automatic merge failed; fix conflicts and then commit the result. 5 Nisan 13 Cuma

Slide 41

Slide 41 text

CONFLICT (ÇAKIŞMA) $ git add file_test.txt $ git commit -m "çakışma düzeltildi" 5 Nisan 13 Cuma

Slide 42

Slide 42 text

BRANCH SİLMEK $ git branch -d BRANCH_ADI # yerel $ git push origin :BRANCH_ADI # uzaktaki İşi biten branch’i düzeni korumak adına silebilirsiniz. 5 Nisan 13 Cuma

Slide 43

Slide 43 text

TAG (ETİKET) http://bit.ly/git-tag Bulunduğunuz an’dan / branch’den versiyon oluşturmak ya da o an’ı etiketlemek için kullanılır. $ git tag # yerel tag’leri listeler $ git ls-remote --tags # uzak branch’leri listeler 5 Nisan 13 Cuma

Slide 44

Slide 44 text

TAG (ETİKET) $ git tag ETİKET_ADI $ git tag -a ETİKET_ADI -m “COMMIT Mesajı” İstediğiniz herhangi bir revizyondan da TAG yapmanız mümkün. Annotated TAG / Not düşülmüş Etiket $ git help tag 5 Nisan 13 Cuma

Slide 45

Slide 45 text

TAG (ETİKET) Aynı branch gibi çalışır. checkout edilebilirler. V1.0 İlk commit. İçinde hiçbir şey yok. *.jpg’de ignore edildiği için kontrol dışında! 5 Nisan 13 Cuma

Slide 46

Slide 46 text

TAG (ETİKET) SİLMEK $ git tag -d ETİKET_ADI # yerel $ git push origin :ETİKET_ADI # uzaktaki Aynı branch’lerdeki gibi, tag’leri de silebilirsiniz. $ git help tag 5 Nisan 13 Cuma

Slide 47

Slide 47 text

`git-blame` Hangi kullanıcı, hangi dosyada ne işlem yapmış, ne değiştirmiş, kim kod’u bozmuş! $ git blame DOSYA_ADI $ git blame dosya1.txt $ git help blame 5 Nisan 13 Cuma

Slide 48

Slide 48 text

`git-blame` SHA AUTHOR ve TARİH MESAJ $ git help blame 5 Nisan 13 Cuma

Slide 49

Slide 49 text

`git-diff` $ git diff HEAD^ HEAD file_test.txt `diff`ile versiyonlar arasındaki farkları görüntülemeye yarar. $ git help diff 5 Nisan 13 Cuma

Slide 50

Slide 50 text

`git-diff` $ git diff HEAD^ HEAD file_test.txt 5 Nisan 13 Cuma

Slide 51

Slide 51 text

`git-diff` $ echo "3.satır" >> file_test.txt $ git diff file_test.txt 5 Nisan 13 Cuma

Slide 52

Slide 52 text

UZAK DEPO (REMOTE) Kişisel Sunucu Git Repo Sağlayıcılar 5 Nisan 13 Cuma

Slide 53

Slide 53 text

UZAK DEPO (REMOTE) Kişisel Sunucu $ mkdir /git/depo/projem.git $ cd /git/depo/projem.git $ git init --bare $ git config receive.denyCurrentBranch false $ git repo-config core.sharedRepository true $ git clone git+ssh://kullanici@sunucu/git/depo/projem.git $ git clone git+ssh://sunucu/git/depo/projem.git 5 Nisan 13 Cuma

Slide 54

Slide 54 text

UZAK DEPO (REMOTE) Kişisel Sunucu ■ http://gitorious.org/download ■ http://gitlab.org ■ https://github.com/sitaramc/gitolite ■ http://gitblit.com 5 Nisan 13 Cuma

Slide 55

Slide 55 text

UZAK DEPO (REMOTE) $ git clone REPO_ADRESİ ssh:// git:// http(s):// ftp(s):// rsync:// file:// $ git help clone 5 Nisan 13 Cuma

Slide 56

Slide 56 text

UZAK DEPO (REMOTE) Git Repo Sağlayıcılar 5 Nisan 13 Cuma

Slide 57

Slide 57 text

Bitbucket 5 Nisan 13 Cuma

Slide 58

Slide 58 text

Bitbucket 5 Nisan 13 Cuma

Slide 59

Slide 59 text

5 Nisan 13 Cuma

Slide 60

Slide 60 text

UZAK DEPO (REMOTE) Yerel git deposunu Bitbucket’a taşımak için önce Bitbucket’da depo oluşturun daha sonra yereldeki depoya REMOTE ekleyin. $ git remote add REMOTE_ADI URL $ git help remote 5 Nisan 13 Cuma

Slide 61

Slide 61 text

Track Remote Branch $ git push -u origin master $ git push $ git push bitbucket $ git push bitbucket master UZAK DEPO (REMOTE) $ git remote add origin ssh://[email protected]/vigo/oyg2013-git.git $ git remote add bitbucket ssh://[email protected]/vigo/oyg2013-git.git 5 Nisan 13 Cuma

Slide 62

Slide 62 text

github 5 Nisan 13 Cuma

Slide 63

Slide 63 text

github 5 Nisan 13 Cuma

Slide 64

Slide 64 text

5 Nisan 13 Cuma

Slide 65

Slide 65 text

UZAK DEPO (REMOTE) $ git pull $ git pull REMOTE_ADI BRANCH_ADI $ git pull --all $ git help pull Uzaktaki değişiklikleri almak için pull ve fetch 5 Nisan 13 Cuma

Slide 66

Slide 66 text

UZAK DEPO (REMOTE) $ git fetch $ git fetch REMOTE_ADI BRANCH_ADI $ git fetch --all $ git help fetch Uzaktaki değişiklikleri almak için pull ve fetch 5 Nisan 13 Cuma

Slide 67

Slide 67 text

UZAK DEPO (REMOTE) pull ve fetch arasındaki fark; pull : önce fetch sonra merge fetch : sadece fetch $ git help pull && git help fetch 5 Nisan 13 Cuma

Slide 68

Slide 68 text

UZAK DEPO (REMOTE) $ git help fetch 5 Nisan 13 Cuma

Slide 69

Slide 69 text

KONFİGÜRASYON $ git help config Kısa yol tanımlamaları ve SHELL komutları çalıştırılabilir. .gitconfig 5 Nisan 13 Cuma

Slide 70

Slide 70 text

! işareti KONFİGÜRASYON $ git help config .gitconfig 5 Nisan 13 Cuma

Slide 71

Slide 71 text

GIT FLOW http://nvie.com/posts/a-successful-git-branching-model/ Standart repo’daki master branch, git- flow’da develop branch’i olur. 5 Nisan 13 Cuma

Slide 72

Slide 72 text

GIT FLOW https://github.com/nvie/gitflow Tüm kullanıcılar git-flow kurmalı ve master / develop branch’leri olmalı $ git flow init $ git flow feature start ozellik1 $ git flow feature finish ozellik1 $ git flow release start r1 $ git flow release finish 'r1' 5 Nisan 13 Cuma

Slide 73

Slide 73 text

GIT FLOW https://github.com/nvie/gitflow $ git flow feature finish ozellik1 ■ feature/ozellik1, develop’la merge ■ feature/ozellik1 siliniyor ■ develop branch’e geçiliyor (checkout) 5 Nisan 13 Cuma

Slide 74

Slide 74 text

GIT FLOW https://github.com/nvie/gitflow $ git flow release finish 'r1' ■ önce origin’den fetch ■ release/r1 master’la merge ■ ‘r1’ tag’lenir ■ develop’la merge ■ release/r1 silinir 5 Nisan 13 Cuma

Slide 75

Slide 75 text

DİĞER YARDIMCI ARAÇLAR Komut satırı dışında grafik arayüzle kullanılabilecek GIT araçları 5 Nisan 13 Cuma

Slide 76

Slide 76 text

DİĞER YARDIMCI ARAÇLAR Komut satırı dışında grafik arayüzle kullanılabilecek GIT araçları 5 Nisan 13 Cuma

Slide 77

Slide 77 text

DİĞER YARDIMCI ARAÇLAR ÜCRETSİZ ÜCRETLİ Github App Sourcetree GitX(L) git-cola Tower Gitbox SmartGit git-cola http://git-scm.com/downloads/guis 5 Nisan 13 Cuma

Slide 78

Slide 78 text

DİĞER YARDIMCI ARAÇLAR http://jonas.nitro.dk/tig/ tig 5 Nisan 13 Cuma

Slide 79

Slide 79 text

KİMLER KULLANIYOR? ■ Google ■ Facebook ■ Twitter ■ Microsoft ■ Perl ■ Android ■ Linux ■ QT ■ Gnome ■ PostgreSQL 5 Nisan 13 Cuma

Slide 80

Slide 80 text

KAYNAKLAR ■ http://git.gelistiriciyiz.biz/ * ■ http://git-scm.com ■ http://try.github.com ■ http://gitimmersion.com ■ http://www.codeschool.com/courses/git-real * Türkçe 5 Nisan 13 Cuma

Slide 81

Slide 81 text

Kaynak Kod https://github.com/vigo/oyg2013-git https://bitbucket.org/vigo/oyg2013-git 5 Nisan 13 Cuma

Slide 82

Slide 82 text

Teşekkürler @ugurozyilmazel @vigobronx http://ugur.ozyilmazel.com 5 Nisan 13 Cuma